2012-02-01 34 views
0

私のプロジェクトの1つでは、ユーザ認証を処理するためにSpring Securityを設定しました。SpringセキュリティのLogoutHandlerまたはLogoutFilterからの認証変数へのアクセス

私の設定ファイルは次のようになります。

<http use-expressions="true"> 
    <intercept-url pattern="/" access="permitAll()" /> 
    <intercept-url pattern="/**" access="isAuthenticated()" /> 
    <form-login default-target-url="/main" login-page="/" always-use-default-target="true" username-parameter="userId" password-parameter="password" /> 
    <custom-filter ref="customLogoutFilter" position="LOGOUT_FILTER"/--> 
    <session-management invalid-session-url="/" session-authentication-strategy-ref="sas" /> 
</http> 

<beans:bean id="sas" class="org.springframework.security.web.authentication.session.SessionFixationProtectionStrategy" /> 

<beans:bean id="customLogoutHandler" class="com.somepack.CustomLogoutHandler"/> 

<beans:bean id="logoutFilter" class="org.springframework.security.web.authentication.logout.LogoutFilter"> 
    <beans:constructor-arg index="0" ref="customLogoutHandler"/> 
    <beans:constructor-arg index="1" ref="customLogoutFilter"/> 
    <beans:property name="filterProcessesUrl" value="/"/> 
</beans:bean> 

<beans:bean id="customLogoutFilter" class="com.somepack.CustomLogoutFilter"> 
    <beans:property name="reportDir" value="/tmp/reports"/> 
</beans:bean> 

マイCustomLogoutFilterクラスは

public class CustomLogoutFilter implements LogoutHandler { 
    private String reportDir; 
    public String getReportDir() { 
     return reportDir; 
    } 
    public void setReportDir(String reportDir) { 
     this.reportDir = reportDir; 
    } 
    @Override 
    public void logout(HttpServletRequest request, 
      HttpServletResponse response, Authentication authentication) { 
     String userName = authentication.getName(); 
     File folder = new File(reportDir, userName); 
     deleteDir(folder); //delete function to delete Logged User specific directory 
     logService.info("Logout", userName, EventCode.LOGOUT, 
       String.format("User %s logged out successfully", userName)); 
     for (Cookie cookie : request.getCookies()) { 
      printcookies(cookie); 
      if (cookie.equals("JSESSIONID")) { 
       cookie.setMaxAge(0); 
       response.addCookie(cookie); 
      } 
     } 
     request.getSession().invalidate(); 
    } 
} 

のように見える。しかし、フィルタがために非常に最初のリクエストで呼ばなっているように、コードのこの部分が機能していませんログインページ(すべての要求で呼び出されることさえあります)と、 文字列のuserName = authentication.getName()行でNullPointerExceptionが発生しています。

実際には代わりのLogoutFilterを使用して、私はLogouthandlerを使用している場合、私は同じエラーを取得:

public class CustomLogoutHandler extends AbstractAuthenticationTargetUrlRequestHandler implements LogoutSuccessHandler{ 
    private String reportDir; 
    public String getReportDir() { 
     return reportDir; 
    } 
    public void setReportDir(String reportDir) { 
     this.reportDir = reportDir; 
    } 
    @Override 
    public void onLogoutSuccess(HttpServletRequest request, 
      HttpServletResponse response, Authentication authentication) throws IOException, 
      ServletException { 
     String userName = authentication.getName(); 
     File folder = new File(reportDir, userName); 
     deleteDir(folder); 
     logService.info("Logout", userName, EventCode.LOGOUT, String.format("User %s logged out successfully", userName)); 
     super.handle(request, response, authentication); 
    } 

と設定ファイルに変更:

<http use-expressions="true"> 
    <intercept-url pattern="/" access="permitAll()" /> 
    <intercept-url pattern="/**" access="isAuthenticated()" /> 
    <form-login default-target-url="/main" login-page="/" always-use-default-target="true" username-parameter="userId" password-parameter="password" /> 
    <logout delete-cookies="JSESSIONID" invalidate-session="true" success-handler-ref="customLogoutHandler" logout-url="/logout" /> 
    <session-management invalid-session-url="/" session-authentication-strategy-ref="sas" /> 
</http> 

<beans:bean id="customLogoutHandler" class="sequent.ui.security.CustomLogoutHandler"> 
    <beans:property name="reportDir" value="/tmp/reports" /> 
</beans:bean> 

私のハンドラは、このようになります

この問題を解決する方法がわかりません。

助けてください。

私の基本的な要件は、ユーザーが[ログアウト]ボタンをクリックするかセッションの有効期限が切れたときにトリガされるログアウトメカニズムでユーザープリンシパルにアクセスする必要があることです。彼はログオフ時に削除する必要があるログオンしたユーザーの名前で一時フォルダーを作成するため、ユーザー情報が必要です。

よろしくお願いします。あなたがLogoutFilterfilerProcessesUrlを設定している

-Raul

答えて

0

に「/」ユーザーがドメインのルートを閲覧するたびに、フィルタは、ユーザーがログアウトしようとすることを意味しています。特定のログアウトURL(またはデフォルト値)を使用して、ログアウトを実行する前にユーザーが実際に認証されているかどうかを確認します(Authenticationインスタンスがヌルでないことを確認してください)。

ユーザーがログアウトに失敗したセッションタイムアウトに対処する必要がある場合は、HttpSessionListenerを実装してセッションからユーザーを識別し、必要なクリーンアップを実行する必要があります。これはあなたのweb.xmlファイルに追加されます。このクラスはユーザーのリクエスト中に呼び出されないため、ユーザーに関する情報を取得するのにSecurityContextを使用できないため、セッションが無効になる前にリスナーに渡されるセッションオブジェクトから取得する必要があります。

関連する問題