2012-02-15 6 views
3

Spring Securityの3.1.0 remember-me cookieに問題があります。私はすぐに解決策を見つける必要があり、私はこの問題の原因を見つけることができません。 Spring Security 3.1.0 - Remember-meが期待どおりに動作しない

  • は私のアプリのURL(例えばhttp://myapp/app.htm
  • 私がログインページにリダイレクトされていますので、私は
  • がログインしたら、ログインし、近くにブラウザに行く:

    これらは私が次のです手順は次のとおりです

  • オープンブラウザをログアウトせずに、私は私のアプリのbypassinに入ることを期待し、この時点で私のアプリのURLへ

を行きますg Remember-Me Cookieはまだブラウザに残っているので、ログインフォームを使用してください。その事実にもかかわらず、ログインページが再度表示されます

  • は、私は通常、ログインフォームをバイパス私のアプリを入力することができ、再び

再び試みる私のアプリのURLに移動します。

これはかなり混乱しており、これまでのところ説明がありません。

私は両方の試みをデバッグしようとしたと私は春のセキュリティのRememberMeAuthenticationFilterが解雇された場合は、次のが見つかりました:

試み1
要求パス= /app.htm:request.getCookies()ので、私のSPRING_SECURITY_REMEMBER_ME_COOKIE含まれていませんでした私はログインページにリダイレクトされました リクエストパス= /security/login.htm:この時点でrequest.getCookies()DIDは私のSPRING_SECURITY_REMEMBER_ME_COOKIEを持っています。とにかく、私は既にログインページにリダイレクトされていた

試行2
Remember-meクッキーはすでに受け入れられていたので問題なく私のアプリに入ることができました。

以下は、Spring Security XML構成と両方の試行のログです。

これに関するお手伝いをさせていただきます。


春のセキュリティ設定(私はdaoAuthenticationProviderおよびイベントリスナーについてのすべてを省略します):

<sec:http auto-config="false" use-expressions="true" authentication-manager-ref="authenticationManager"> 
    <sec:custom-filter ref="sessionLocaleResolvingFilter" before="FORM_LOGIN_FILTER"/> 

    <sec:intercept-url pattern="/security/*.htm" requires-channel="https" /> 
    <sec:intercept-url pattern="/retrieve-password/*.htm" requires-channel="https" /> 
    <sec:intercept-url pattern="/messagebroker/*" access="authenticated" requires-channel="http" /> 
    <sec:intercept-url pattern="/platform/*.htm" 
     access="hasRole('limited') or (authenticated and !hasRole('role1') and !hasRole('role2'))" 
     requires-channel="http" /> 
    <sec:intercept-url pattern="/app.htm" access="authenticated" requires-channel="http" /> 
    <sec:intercept-url pattern="/**" requires-channel="http" /> 
    <sec:form-login login-page="/security/login.htm" default-target-url="/app.htm" 
     login-processing-url="/security/process-login.htm" authentication-failure-url="/security/login.htm?error=true" /> 
    <sec:logout logout-url="/security/logout.htm" delete-cookies="JSESSIONID,SPRING_SECURITY_REMEMBER_ME_COOKIE" 
     logout-success-url="/security/logout-success.htm" invalidate-session="true"/> 
    <sec:anonymous/> 
    <sec:remember-me use-secure-cookie="true" key="myAppServices" 
     services-ref="ipTokenBasedRememberMeServicesBean" /> 
    <sec:session-management session-fixation-protection="none"/> 
    <sec:access-denied-handler error-page="/denied-access.htm"/> 
</sec:http> 

<bean id="sessionLocaleResolvingFilter" class="com.myapp.spring.security.SessionLocaleResolvingFilter" /> 
<bean class="com.myapp.spring.security.IPTokenBasedRememberMeServices" 
    id="ipTokenBasedRememberMeServicesBean"> 
    <constructor-arg value="myAppServices"/> 
    <constructor-arg ref="myAppJdbcDaoImpl"/> 
</bean> 
<bean id="myAppPasswordEncoder" class="com.myapp.spring.security.MyAppPasswordEncoder" /> 
<bean id="authenticationManager" 
    class="o.s.s.authentication.ProviderManager"> 
    <property name="providers"> 
     <list> 
      <ref local="daoAuthenticationProvider" /> 
     </list> 
    </property> 
</bean> 
<!-- Other beans... --> 

ログ(OSSとOSとorg.springframework.securityでorg.springframework置き換え)の最初の試みのために:私の第二の試みの

o.s.s.web.access.channel.ChannelProcessingFilter:134 - Request: FilterInvocation: URL: /app.htm?lang=en; ConfigAttributes: [REQUIRES_INSECURE_CHANNEL] 
o.s.s.web.context.HttpSessionSecurityContextRepository:127 - No HttpSession currently exists 
o.s.s.web.context.HttpSessionSecurityContextRepository:85 - No SecurityContext was available from the HttpSession: null. A new one will be created. 
o.s.s.web.FilterChainProxy:318 - /app.htm?lang=en at position 9 of 11 in additional filter chain; firing Filter: 'AnonymousAuthenticationFilter' 
o.s.s.web.authentication.AnonymousAuthenticationFilter:102 - Populated SecurityContextHolder with anonymous token: 'o.s.s.authentication.AnonymousAuthenticat[email protected]: Principal: anonymousUser; Credentials: [PROTECTED]; Authenticated: true; Details: [email protected]: RemoteIpAddress: fe80:0:0:0:ec09:25fb:3df4:323b; SessionId: 057E689401E69589BB7359F3E95B4A18; Granted Authorities: ROLE_ANONYMOUS' 
o.s.s.web.FilterChainProxy:318 - /app.htm?lang=en at position 10 of 11 in additional filter chain; firing Filter: 'ExceptionTranslationFilter' 
o.s.s.web.FilterChainProxy:318 - /app.htm?lang=en at position 11 of 11 in additional filter chain; firing Filter: 'FilterSecurityInterceptor' 
o.s.s.web.util.AntPathRequestMatcher:103 - Checking match of request : '/app.htm'; against '/messagebroker/*' 
o.s.s.web.util.AntPathRequestMatcher:103 - Checking match of request : '/app.htm'; against '/app.htm' 
o.s.s.web.access.intercept.FilterSecurityInterceptor:193 - Secure object: FilterInvocation: URL: /app.htm?lang=en; Attributes: [authenticated] 
o.s.s.web.access.intercept.FilterSecurityInterceptor:298 - Previously Authenticated: [email protected]: Principal: anonymousUser; Credentials: [PROTECTED]; Authenticated: true; Details: [email protected]: RemoteIpAddress: fe80:0:0:0:ec09:25fb:3df4:323b; SessionId: 057E689401E69589BB7359F3E95B4A18; Granted Authorities: ROLE_ANONYMOUS 
o.s.s.access.vote.AffirmativeBased:65 - Voter: [email protected], returned: -1 
o.s.s.web.access.ExceptionTranslationFilter:165 - Access is denied (user is anonymous); redirecting to authentication entry point 
o.s.s.access.AccessDeniedException: Access is denied 
    at o.s.s.access.vote.AffirmativeBased.decide(AffirmativeBased.java:83) 
    at o.s.s.access.intercept.AbstractSecurityInterceptor.beforeInvocation(AbstractSecurityInterceptor.java:205) 
    at o.s.s.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:114) 
    at o.s.s.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83) 
    at o.s.s.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) 
    at o.s.s.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) 
    at o.s.s.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) 
    (X more) 

o.s.s.web.DefaultRedirectStrategy:36 - Redirecting to 'http://arbad67464/services/security/login.htm' 
o.s.s.web.context.HttpSessionSecurityContextRepository:269 - SecurityContext is empty or contents are anonymous - context will not be stored in HttpSession. 
o.s.s.web.context.SecurityContextPersistenceFilter:97 - SecurityContextHolder now cleared, as request processing completed 

o.s.s.web.access.channel.RetryWithHttpsEntryPoint:55 - Redirecting to: https://arbad67464/services/security/login.htm 
o.s.s.web.DefaultRedirectStrategy:36 - Redirecting to 'https://arbad67464/services/security/login.htm' 

o.s.s.web.access.channel.ChannelProcessingFilter:134 - Request: FilterInvocation: URL: /security/login.htm; ConfigAttributes: [REQUIRES_SECURE_CHANNEL] 
o.s.s.web.FilterChainProxy:318 - /security/login.htm at position 2 of 11 in additional filter chain; firing Filter: 'SecurityContextPersistenceFilter' 
o.s.s.web.context.HttpSessionSecurityContextRepository:139 - HttpSession returned null object for SPRING_SECURITY_CONTEXT 
o.s.s.web.context.HttpSessionSecurityContextRepository:85 - No SecurityContext was available from the HttpSession: [email protected] A new one will be created. 
o.s.s.web.FilterChainProxy:318 - /security/login.htm at position 3 of 11 in additional filter chain; firing Filter: 'LogoutFilter' 
o.s.s.web.FilterChainProxy:318 - /security/login.htm at position 4 of 11 in additional filter chain; firing Filter: 'SessionLocaleResolvingFilter' 
o.s.s.web.FilterChainProxy:318 - /security/login.htm at position 5 of 11 in additional filter chain; firing Filter: 'UsernamePasswordAuthenticationFilter' 
o.s.s.web.FilterChainProxy:318 - /security/login.htm at position 6 of 11 in additional filter chain; firing Filter: 'RequestCacheAwareFilter' 

o.s.s.web.FilterChainProxy:318 - /security/login.htm at position 7 of 11 in additional filter chain; firing Filter: 'SecurityContextHolderAwareRequestFilter' 
o.s.s.web.FilterChainProxy:318 - /security/login.htm at position 8 of 11 in additional filter chain; firing Filter: 'RememberMeAuthenticationFilter' 
com.myapp.spring.security.IPTokenBasedRememberMeServices:103 - Remember-me cookie detected 
com.myapp.spring.security.IPTokenBasedRememberMeServices:118 - Remember-me cookie accepted 
o.s.s.authentication.ProviderManager:152 - Authentication attempt using o.s.s.authentication.RememberMeAuthenticationProvider 

ログイン:

o.s.s.web.access.channel.ChannelProcessingFilter:134 - Request: FilterInvocation: URL: /app.htm?lang=en; ConfigAttributes: [REQUIRES_INSECURE_CHANNEL] 
o.s.s.web.context.HttpSessionSecurityContextRepository:158 - Obtained a valid SecurityContext from SPRING_SECURITY_CONTEXT: '[email protected]: Authentication: [email protected]: Principal: [email protected]: Username: [email protected]; Password: [PROTECTED]; Enabled: true; AccountNonExpired: true; credentialsNonExpired: true; AccountNonLocked: true; Granted Authorities: limited,premium,special; Credentials: [PROTECTED]; Authenticated: true; Details: [email protected]: RemoteIpAddress: fe80:0:0:0:ec09:25fb:3df4:323b; SessionId: 057E689401E69589BB7359F3E95B4A18; Granted Authorities: limited, premium, special' 
o.s.s.web.FilterChainProxy:318 - /app.htm?lang=en at position 8 of 11 in additional filter chain; firing Filter: 'RememberMeAuthenticationFilter' 
o.s.s.web.authentication.rememberme.RememberMeAuthenticationFilter:142 - SecurityContextHolder not populated with remember-me token, as it already contained: '[email protected]: Principal: [email protected]: Username: [email protected]; Password: [PROTECTED]; Enabled: true; AccountNonExpired: true; credentialsNonExpired: true; AccountNonLocked: true; Granted Authorities: limited,premium,special; Credentials: [PROTECTED]; Authenticated: true; Details: [email protected]: RemoteIpAddress: fe80:0:0:0:ec09:25fb:3df4:323b; SessionId: 057E689401E69589BB7359F3E95B4A18; Granted Authorities: limited, premium, special' 
o.s.s.web.FilterChainProxy:318 - /app.htm?lang=en at position 9 of 11 in additional filter chain; firing Filter: 'AnonymousAuthenticationFilter' 
o.s.s.web.authentication.AnonymousAuthenticationFilter:107 - SecurityContextHolder not populated with anonymous token, as it already contained: '[email protected]: Principal: [email protected]: Username: [email protected]; Password: [PROTECTED]; Enabled: true; AccountNonExpired: true; credentialsNonExpired: true; AccountNonLocked: true; Granted Authorities: limited,premium,special; Credentials: [PROTECTED]; Authenticated: true; Details: [email protected]: RemoteIpAddress: fe80:0:0:0:ec09:25fb:3df4:323b; SessionId: 057E689401E69589BB7359F3E95B4A18; Granted Authorities: limited, premium, special' 
o.s.s.web.access.intercept.FilterSecurityInterceptor:193 - Secure object: FilterInvocation: URL: /app.htm?lang=en; Attributes: [authenticated] 
o.s.s.web.access.intercept.FilterSecurityInterceptor:298 - Previously Authenticated: [email protected]: Principal: [email protected]: Username: [email protected]; Password: [PROTECTED]; Enabled: true; AccountNonExpired: true; credentialsNonExpired: true; AccountNonLocked: true; Granted Authorities: limited,premium,special; Credentials: [PROTECTED]; Authenticated: true; Details: [email protected]: RemoteIpAddress: fe80:0:0:0:ec09:25fb:3df4:323b; SessionId: 057E689401E69589BB7359F3E95B4A18; Granted Authorities: limited, premium, special 
o.s.s.access.vote.AffirmativeBased:65 - Voter: [email protected], returned: 1 
o.s.s.web.access.intercept.FilterSecurityInterceptor:214 - Authorization successful 
+0

より簡単に消化何かにこれをダウントリムしてください。今のところ、それは人々がそれを見る時間を取らないようにするためのテキスト/コードの壁です。さらに、あなたのコードとログをすべてダンプするだけで、実際の問題を見つけ出して、ここで*援助を求めているのを最小限に抑えることができます。 – casperOne

+1

これは圧倒的なものかもしれないことを理解していますので、私はそれを整えようとします。しかし、私がログを投棄したときには、助けたい人に役立つかもしれない追加情報を提供するつもりであったことをご理解ください。それだけでは最小限の努力の指標ではありません - ログを慎重に読んで、私のアプリをデバッグし、これを投稿する前にいくつかの場所で解決策を見つけようとしました。さらに、XMLのすべてのコードをダンプしませんでした。もし私がそうしなければ、誰がどう助けてくれるのだろうか? とにかく、ありがとうございます。 – nomusicnolife

答えて

3

私は、HTTPSを使用するように設定されたいくつかのURLがあることとは関係があると思います。

remember-me cookieは安全であるとマークされています(ブラウザに表示されるset-cookieヘッダーで、おそらくブラウザのCookieキャッシュにも表示されるはずです)。 /appへのリクエストはHTTP経由であるため、クッキーは送信されません。ただし、ログインページへのリクエストはHTTPSにリダイレクトされ、Cookie に送信されます。

本当にHTTPSを使用してください。設定が簡単で、アプリが実際には安全ではありません。ただし、remember-me namespace elementにはuse-secure-cookieオプションもあります。このオプションをfalseに設定すると、デフォルトの動作を上書きできます。

+0

はい、それが問題でした。私はどんな場合でもHTTPSを強制しないために ''要素から 'requires-channel'属性をすべて消去しようとしました。そして、remember-me cookieが最初の試みで検出されました。 完全に安全ではないにもかかわらず、私がXMLで行ったようにHTTPSを設定するように求められましたが、これらのクッキーが正しく動作するようにセッション全体を通して使用する必要があるかもしれません。 チャンネルの設定を調整しようとします。私がそれを済ませたら、結果を掲載します。 ありがとうございますルーク! – nomusicnolife

+0

クール。私が言ったように、Cookieが安全でないとマークされるようにして、HTTPとHTTPSの両方で送信されるようにすることもできます。 –

+0

これは本当に受け入れられる答えでなければなりません。 – Ajax

5

Springセキュリティでは、rememberMeサービスを使用する2つの方法を提供します。

  1. rememberMeServiceの定義では、プロパティalwaysRememberMeがtrueに設定されています。 この場合、初回ユーザーがセキュアURLにアクセスしようとするたびに、 ページにログインします。ユーザーが正しいユーザー名とパスワードでログインした後、ログアウトするまで はログインを要求しません。

  2. ログインページに「_spring_security_remember_me」という名前のチェックボックスを追加します。 とvalue = "true"。 この場合、ユーザーが[Remember me]チェックボックスをオンにすると、ログアウトするまでログインページなしで セキュアURLにアクセスできます。

私のために働いてその..

関連する問題