7

アプリケーションには、クライアントとセラーの2種類のユーザーがいます。ユーザーがログインせずにページにアクセスできないようにするためにJSFでを使用していPhaseListenerますが、ユーザーがログインした後、ユーザーがロケーションバーのURLを変更したり、許可されていないページにアクセスしたりできないようにする方法がわかりません。たとえば、クライアントが販売者のページにアクセスできないようにします。

誰かが私がそのような違法なアクセスを防ぐことができる方法についての考えを持っていますか?

4

4 に答える 4

8

ユーザーにグループ/ロールを割り当て、フェーズリスナー内でもそれを確認します(技術的には単純なサーブレットフィルターである可能性があります。結局のところ、フェーズリスナーは隠蔽されています。つまり、単純な目的では非常に不器用で、実行されません。非JSFURLの場合)。

/seller/たとえば、次の役割を持つユーザーのみがで始まるURLにアクセスできるようにしSELLERます。

if (url.startsWith("/seller/") && user.getRoles().contains(Role.SELLER)) {
    // Allow access.
} else {
    // Block access.
}

この機能は、JavaEE組み込みコンテナ管理認証やサードパーティライブラリApacheShiroなど、多くの認証フレームワークで提供/組み込みされていることに注意してください。必要なのは、単純なweb.xml構成エントリ<security-constraint>、またはShiroのINIファイルなどの構成ファイルだけです。

参照:

于 2013-02-26T13:41:11.027 に答える
1

これに使用Filterします。javax.servlet.Filterインターフェイスを実装するクラスを作成し、doFilter()メソッドでユーザーの役割を確認し、ユーザーに役割がない場合は、ユーザーをカスタムページにリダイレクトします。このweb.xmlフィルターの定義とマッピングを追加するには、次のようにします。

<filter>
  <filter-name>MyFilter</filter-name>
  <filter-class>mypackage.MyFilter</filter-class>
</filter>

<filter-mapping>
  <filter-name>MyFilter</filter-name>
  <url-pattern>*.xhtml</url-pattern>
</filter-mapping>
于 2013-02-26T13:41:04.080 に答える
1

すべてのページをユーザーロールでマップするファイルなどを使用できます(一部のページには、複数のユーザーロールの例でアクセスできる場合があります。

<entry key="acl_page_sub/page1">client,seller</entry>
<entry key="acl_page_sub2/page1">client</entry>
<entry key="acl_page_sub2/page2">seller</entry>

そして、そのリストに対してcurrentuserroleと要求されたページ(url)をチェックするある種のLoginControllerクラスを定義します。許可されていない場合は、カスタムエラーページやログインページなどにリダイレクトします。

このlogincontrollerクラスをphaselistenerをfacesconfigに追加します。

于 2013-02-26T13:43:54.700 に答える
0

直接アクセスしたときにページでエラーを引き起こしたパラメータを検証する必要があります。これは、jsf2のprerenderviewイベント、またはjsf1.2のpostconstructメソッドで実行できます。

于 2013-02-26T14:35:46.610 に答える