- PR -

JSF Tomcatでフォーム認証

投稿者投稿内容
よしだひろゆき
大ベテラン
会議室デビュー日: 2004/11/22
投稿数: 141
投稿日時: 2005-12-02 10:31
引用:

<value>#{param.j_username}</value>

<value>test</value>
などとすると、当然ですがあたいがセットされますが。


すみません,やっぱり思いつきに過ぎませんでしたか.
リクエストパラメータにj_usernameが入っていると期待したのですが,たぶんredirect
されているのですね.
そうなると,トリックスターさんが試してみられているように,いったんuser.loginで受
けてから,j_security_checkを呼び出すしかないでしょうか.
トリックスターさんはnavigation-ruleで呼び出そうとしていますが,
正しいURLが分かるのであれば,ExternalContext.redirct()が使えませんかね?
トリックスター
大ベテラン
会議室デビュー日: 2003/04/16
投稿数: 104
投稿日時: 2005-12-02 14:08
引用:

よしだひろゆきさんの書き込み (2005-12-02 10:31) より:
正しいURLが分かるのであれば,ExternalContext.redirct()が使えませんかね?



初歩的な質問で申し訳ございませんが、
ExternalContextのインスタンスはどのように
取得あるいは生成すればよいでしょうか?
henachoco
常連さん
会議室デビュー日: 2005/11/21
投稿数: 29
お住まい・勤務地: 新ハンドル:t_yamo
投稿日時: 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の取得方法は以下の通りです。
コード:

ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();



おそらく、ここで「引っ張り出す処理はどこに書くのよ」っていう疑問が出てくるかと思いますが、これは「その情報を初めて使う場所」でいいと思います。
例えば、ログイン後のサービスで常に画面の上部にユーザ情報を出力するのであれば、そのユーザ情報を表すSessionスコープのManagedBeanに「引っ張り出す処理」を書きます。
このとき、一旦取り出した情報を内部にキャッシュしておくとより良くなると思います。

追伸:ユーザ情報というドメインの中でExternalContextを呼び出すというのはアーキテクチャ的に嫌な感じもしますので、そのあたりが気になる場合は少し工夫した方が良いかもしれませんね。

[ メッセージ編集済み 編集者: henachoco 編集日時 2005-12-02 15:08 ]
よしだひろゆき
大ベテラン
会議室デビュー日: 2004/11/22
投稿数: 141
投稿日時: 2005-12-05 15:12
引用:

認証が全て済んでから明示的に「JSF」の世界から「TomcatのForm認証」の世界の認証情報を引っ張り出してあげると良いと思います。


賛成です.私の「思いつき」もそれを前提にしたものでした.

引用:

で、「TomcatのForm認証」の世界の認証情報は、ExternalContextの「getRemoteUser()」「isUserInRole(String)」「getUserPrincipal()」なんかを使って取得できます。


なるほど,そこから取れるのですか..であれば,例えば
<value>#{facesContext.externalContext.remoteUser}</value>
という式をfaces-context.xmlに書けば,マネージドビーンの初期値に設定できます.
ご参考までに.
よしだひろゆき
大ベテラン
会議室デビュー日: 2004/11/22
投稿数: 141
投稿日時: 2005-12-05 16:21
引用:

例えば
<value>#{facesContext.externalContext.remoteUser}</value>
という式をfaces-context.xmlに書けば,マネージドビーンの初期値に設定できます.


試してみましたが,facesContextがrequestスコープなので,requestスコープの
マネージドビーンにしか設定できませんでした.sessionスコープのビーンに設定
しようとするとエラーになります(ちょっと制約が厳し過ぎる気がしますが).
やはり,コンストラクタなどにコーディングしないといけないようです.
トリックスター
大ベテラン
会議室デビュー日: 2003/04/16
投稿数: 104
投稿日時: 2005-12-06 00:31
ご教授いただきありがとうございます。

1.ログイン画面はJSFをやめてHTMLにしました。
2.ユーザー情報を FacesContext.getCurrentInstance().getExternalContext().getRemoteUser(); で取得するようにしました。

これで認証およびmanaged beanに情報をセットすることができました。
ありがとうございました。

スキルアップ/キャリアアップ(JOB@IT)