2017-02-08 16 views
0

私はSpring 4.3.3を使用していますが、私のアプリケーションのログイン/ログアウト機能を実装しようとしています。私が抱えている問題は、ログインしてすぐにもう一度ログアウトすると、すべてが期待通りに機能するということです。私は、ログイン・ページのURL:login?logoutにログイン・ボックスにログアウトしたメッセージを表示します。しかし、ログインして別のページに移動してからログアウトすると、ログイン・ページに正常にログアウトしたメッセージが表示されたログイン・ページに戻りますが、ログイン・ボタンをクリックするとログインしていません。 URLで:メッセージなしでログインし、私がログインされる第2回ログイン]をクリックする必要があります以下は、私が春のセキュリティログイン/ログアウトの問題

のsecurity.xml

<http pattern="/resources/**" security="none"/> 
<http pattern="/forgot**" security="none"/> 
<http pattern="/reset**" security="none" /> 
<!-- enable use-expressions --> 
<security:http 
    auto-config="false" 
    use-expressions="true"> 
    <headers><cache-control/></headers> 
    <security:intercept-url pattern="/resources**" access="permitAll" /> 
    <security:intercept-url pattern="/login**" access="permitAll" /> 
    <security:intercept-url pattern="/users**" access="hasAnyRole('ROLE_USER','ROLE_ADMIN')" /> 
    <security:intercept-url pattern="/suppliers**" access="hasAnyRole('ROLE_USER','ROLE_ADMIN')" /> 
    <security:intercept-url pattern="/reports**" access="hasAnyRole('ROLE_USER','ROLE_ADMIN')" /> 
    <security:intercept-url pattern="/games**" access="hasAnyRole('ROLE_USER','ROLE_ADMIN')" /> 
    <security:intercept-url pattern="/clients**" access="hasAnyRole('ROLE_USER','ROLE_ADMIN')" /> 
    <security:intercept-url pattern="/servers**" access="hasAnyRole('ROLE_USER','ROLE_ADMIN')" /> 
    <security:intercept-url pattern="/**" access="hasAnyRole('ROLE_USER','ROLE_ADMIN')"/> 
    <security:intercept-url pattern="/logs**" access="hasAnyRole('ROLE_USER','ROLE_ADMIN')"/> 

<!-- access denied page --> 
    <access-denied-handler error-page="/403" /> 
    <security:form-login 
     login-page="/login" 
     authentication-failure-url="/login?error" 

     username-parameter="username" 
     password-parameter="password" 
     login-processing-url="/auth/login_check" /> 

    <security:logout 
     invalidate-session="true" 
     logout-success-url="/login" 
     logout-url="/login?logout" 
     delete-cookies="JSESSIONID"/> 
    <!-- enable csrf protection --> 
    <csrf/> 
    <!-- Default lifeTime 2 weeks can be configured --> 
    <!--<remember-me key="uniqueAndSecret"/>--> 
</security:http> 

コントローラメソッド

​​を使用していたコードの一部です。

login.jsp

<form name='loginForm' action="<c:url value='/auth/login_check?targetUrl=${targetUrl}' />" method='POST'> 
     <div class="form-group"> 
      <div id="emailError" class="alert alert-danger" style="display:none;"></div> 
      <label for="email">Email 
       <input class="form-control" id="email" type="email" name="username" placeholder="Email"> 
      </label> 
     </div> 
     <div class="form-group"> 
      <label for="password">Password 
       <input class="form-control" id="password" type="password" name="password" placeholder="Password"> 
      </label> 
     </div> 
      Remember Me: <input type="checkbox" name="remember-me" /> 
      <input id="login"class="btn btn-primary" name="submit" type="submit" value="Login"> 
      <div><a id="forgotPass">forgot password</a></div> 
     <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" /> 
    </form> 
+0

こんにちは、わかりません。私はチュートリアルにちょうど従っていて、2つのアスタリスクを持っていました。なぜ/ログ**が決してヒットしないのか説明できますか? – user3389610

+0

「許可」リストに「/ auth」を追加してはいけませんか? –

+0

@dur、フォームメソッドはauth/login_checkで設定されているので、Springはこれらのリクエストを "login-processing-url"として扱いますか?別の考えでは、targetUrl = somereferenceを持つためリダイレクトが発生し、設定はワイルドカードと一致しますか?login-processing-url = "/ auth/login_check *" –

答えて

0

セキュリティ設定から判断すると、CookieCsrfTokenRepositoryを使用しているかどうかはわかりません。私は、ログアウト時に手動ですべてのクッキーを期限切れにしている参照してください。

for(Cookie cookie : request.getCookies()) { 
    cookie.setMaxAge(0); 
} 

あなたが手動でアプリケーションに設定された他のクッキーを持っていない限り、あなたがそうするように、それを構成しているため、セッションクッキーは、デフォルトでは削除されます。

<security:logout 
    ... 
    delete-cookies="JSESSIONID"/> 

私はCSRFトークンクッキーもクリアしているので、トークンなしでレンダリングされるログインページがあると思います。フォームを送信すると、CSRFの不一致によりサイレントに失敗し、ログインページに戻ります。今回は、CSRF値が再び設定され、その後のログイン試行が成功します。

+0

こんにちは@ frederik-heremansご回答ありがとうございます。私はこれが問題だと思う。私はセッションとクッキーが期限切れになっていたコントローラからコードを削除し、期待どおりに動作します。しかし、私は別の問題に気付きました。一度私はログアウトしました。私が手動でURLを編集すると、正しくログインページにリダイレクトされますが、戻るをクリックすると、前のページに移動してログインしています。 – user3389610

+0

@durが述べたように、「Spring Securityがそれを行います。 " (セッションの無効化を処理する)スプリングセキュリティのログアウトメカニズムを使用するか、コントローラで独自の「ログアウト」ロジック(実行中)を実装します。ここでもセッションを無効にする必要があります。有効な資格情報が存在せず、春のセキュリティが次のようになっているので、ログインページへのリダイレクトがトリガーされます... –

関連する問題