1

認証にSpring Securityを使用して、Spring + struts2 + hibernateの統合に取り組んでいます。application-security.xmlファイルは次のとおりです。

<http>
    <intercept-url pattern="/login.jsp" access="IS_AUTHENTICATED_ANONYMOUSLY" />
    <intercept-url pattern="/**" filters="none" />
    <form-login login-page="/login.jsp" default-target-url="/homePage.action" authentication-failure-url="/login-fail.jsp"/>
    <logout logout-success-url="/logged_out.jsp" />
</http>

問題は、ユーザーが認証され、リクエストが に転送されるときに、クラス (struts のアクション クラス)/homePage.actionに入ることができないことです。useridhomePage.action

以下はコードです:

UserDetails userDetails = (UserDetails)
  SecurityContextHolder.getContext().getAuthentication().getPrincipal();

コードをデバッグしたところ、リクエストが に転送されると/homePage.actionSecurityContextHolder値がクリアされることがわかりました。

これをクラスuseridで利用できるようにする方法はありますか?homepage.action

私はたくさん検索しましたが、最終的にはできませんでした。カスタム フィルターの実装を記述し、スプリング セキュリティ フィルター チェーンにフックする必要があるようです (セッション管理がスプリング レベルでのみ行われるように)。

誰でもポインタを与えることができますか?

4

2 に答える 2

0

考慮しなければならないことがいくつかあります。

まず、フィルターを最小から最大の順に並べる必要があります。リクエストに一致するフィルターが 1 つある場合、残りのフィルターは無視されるためです。設定の問題を確認してください

次に、認証が成功した場合、SecurityContextHoldersurly には現在のユーザーの が含まれますUserDetailsしたがって、認証に問題がある可能性があります。

第三userIdに、 にはプロパティなどはありませんUserDetails。(私はあなたが何か他のことを意味していると仮定していますusername)したがって、彼のIDが必要な場合は、拡張UserDetailsしてuserIdプロパティを配置する独自のクラスが必要かどうか、またはUSERテーブルを検索します(を使用してUserDetails.getUsername)、彼の ID を取得します。

于 2012-08-15T11:02:01.673 に答える
0

私はapplication-security.xmlファイルを変更しました(以下に示します)。問題は解決したようです。
主な変更点は

<intercept-url pattern="/**" filters="none" /> 

に :

<intercept-url pattern="/**" access="ROLE_ADMIN,ROLE_USER" />  


<http>
    <intercept-url pattern="/login.jsp" access="IS_AUTHENTICATED_ANONYMOUSLY" />
    <intercept-url pattern="/inputUser.action" access="ROLE_ADMIN" />
    <intercept-url pattern="/getDeleteUsers.action" access="ROLE_ADMIN" />

    <intercept-url pattern="/login-fail.jsp" filters="none" />  
    <intercept-url pattern="/logged_out.jsp" filters="none" />   

    <intercept-url pattern="/**" access="ROLE_ADMIN,ROLE_USER" />  
    <form-login login-page="/login.jsp" default-target-url="/homePage.action" authentication-failure-url="/login-fail.jsp"/>

    <logout logout-success-url="/logged_out.jsp"/>
</http

スプリング セキュリティでは、スプリング セキュリティ フィルタ チェーンSecurityContextHolderによって満たされているため、パスする必要があります。SecurityContextPersistenceFilterfilters="none"ルークが指摘したように、ここでは機能しません)。

追加すると<intercept-url pattern="/**" access="ROLE_ADMIN,ROLE_USER" />
、リクエストが発生したときにスプリング フィルター チェーンが確実に適用されます。login-submissionhomePage.action

于 2012-08-22T09:12:18.623 に答える