- - PR -
JSF Tomcatでフォーム認証
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-12-02 10:31
すみません,やっぱり思いつきに過ぎませんでしたか. リクエストパラメータにj_usernameが入っていると期待したのですが,たぶんredirect されているのですね. そうなると,トリックスターさんが試してみられているように,いったんuser.loginで受 けてから,j_security_checkを呼び出すしかないでしょうか. トリックスターさんはnavigation-ruleで呼び出そうとしていますが, 正しいURLが分かるのであれば,ExternalContext.redirct()が使えませんかね? | ||||||||
|
投稿日時: 2005-12-02 14:08
初歩的な質問で申し訳ございませんが、 ExternalContextのインスタンスはどのように 取得あるいは生成すればよいでしょうか? | ||||||||
|
投稿日時: 2005-12-02 15:04
「TomcatのForm認証」と「JSF」とは別の世界の話ですので、切り分けて扱った方が良いかもしれません。
まず、「JSF」の世界を中心として認証/認可を実現したいのであれば、「TomcatのForm認証」ではなく、自前の認証システム(とは言ってもログイン画面とチェック用アクション、認可チェックを作るぐらいですが)を使うのが良いかと思います。 どうしても「TomcatのForm認証」を使いたいのであれば、非JSFで認証画面を作り、認証が全て済んでから明示的に「JSF」の世界から「TomcatのForm認証」の世界の認証情報を引っ張り出してあげると良いと思います。 で、「TomcatのForm認証」の世界の認証情報は、ExternalContextの「getRemoteUser()」「isUserInRole(String)」「getUserPrincipal()」なんかを使って取得できます。 ExternalContextの取得方法は以下の通りです。
おそらく、ここで「引っ張り出す処理はどこに書くのよ」っていう疑問が出てくるかと思いますが、これは「その情報を初めて使う場所」でいいと思います。 例えば、ログイン後のサービスで常に画面の上部にユーザ情報を出力するのであれば、そのユーザ情報を表すSessionスコープのManagedBeanに「引っ張り出す処理」を書きます。 このとき、一旦取り出した情報を内部にキャッシュしておくとより良くなると思います。 追伸:ユーザ情報というドメインの中でExternalContextを呼び出すというのはアーキテクチャ的に嫌な感じもしますので、そのあたりが気になる場合は少し工夫した方が良いかもしれませんね。 [ メッセージ編集済み 編集者: henachoco 編集日時 2005-12-02 15:08 ] | ||||||||
|
投稿日時: 2005-12-05 15:12
賛成です.私の「思いつき」もそれを前提にしたものでした.
なるほど,そこから取れるのですか..であれば,例えば <value>#{facesContext.externalContext.remoteUser}</value> という式をfaces-context.xmlに書けば,マネージドビーンの初期値に設定できます. ご参考までに. | ||||||||
|
投稿日時: 2005-12-05 16:21
試してみましたが,facesContextがrequestスコープなので,requestスコープの マネージドビーンにしか設定できませんでした.sessionスコープのビーンに設定 しようとするとエラーになります(ちょっと制約が厳し過ぎる気がしますが). やはり,コンストラクタなどにコーディングしないといけないようです. | ||||||||
|
投稿日時: 2005-12-06 00:31
ご教授いただきありがとうございます。
1.ログイン画面はJSFをやめてHTMLにしました。 2.ユーザー情報を FacesContext.getCurrentInstance().getExternalContext().getRemoteUser(); で取得するようにしました。 これで認証およびmanaged beanに情報をセットすることができました。 ありがとうございました。 |