2010-09-19 21 views
1

我想要的只是一个简单的记住我。我读http://static.springsource.org/spring-security/site/docs/3.0.x/reference/remember-me.html简单的春天<记住我/> ...请帮助

我迄今所做的:

  1. 创建了自己的UserDetailsService与休眠/ JPA工作。 我的impl。不考虑任何记得,我的东西
  2. 考虑配置通过appContext <security:remember-me key="89dqj219dn910lsAc12" user-service-ref="jpaUserDetailsService" token-validity-seconds="864000"/>
  3. 经过,该Cookie SPRING_SECURITY_REMEMBER_ME_COOKIE是真正建立
  4. 登录到安全的网站,当我重新启动我的浏览器,它的工作原理
  5. ,我不断收到一个错误:

    org.springframework.security.access.AccessDeniedException:访问被拒绝 认证对象的字符串:org.springframework.security.authentication.Rem emberMeAuthenticationToken @ 9ab72a70:负责人:[email protected]:用户名:myad;密码保护];启用:true; AccountNonExpired:true; credentialsNonExpired:true; AccountNonLocked:true;个人信息:65537; ;证书:[PROTECTED];已验证:true;详细信息:org.sprin[email protected]957e:RemoteIpAddress:127.0.0.1; SessionId:null;授予的权限:ROLE_ADMIN,ROLE_USER

这里是我的secContext.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:security="http://www.springframework.org/schema/security" 
     xsi:schemaLocation=" 
      http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
      http://www.springframework.org/schema/security 
      http://www.springframework.org/schema/security/spring-security-3.0.xsd"> 

    <security:global-method-security pre-post-annotations="enabled"> 
    </security:global-method-security> 

    <security:http use-expressions="true" access-denied-page="/accessDenied"> 
     <security:form-login 
       login-page="/login" 
       login-processing-url="/loginProcess" 
       default-target-url="/intro" 
       authentication-failure-url="/login?login_error=1" 
       /> 
     <security:logout 
       logout-url="/logout" 
       logout-success-url="/logoutSuccess"/> 

     <security:intercept-url pattern="/**" access="permitAll"/> 
     <security:intercept-url pattern="/login" access="permitAll"/> 
     <security:intercept-url pattern="/styles/**" access="permitAll"/> 
     <security:intercept-url pattern="/scripts/**" access="permitAll"/> 
     <security:remember-me key="89dqj219dn910lsAc12" user-service-ref="jpaUserDetailsService" 
           token-validity-seconds="864000"/> 
    </security:http> 

    <security:authentication-manager alias="authenticationManager"> 
     <security:authentication-provider user-service-ref="jpaUserDetailsService"> 
      <security:password-encoder hash="sha"> 
      </security:password-encoder> 
     </security:authentication-provider> 
    </security:authentication-manager> 

    <bean id="rememberMeFilter" class= 
      "org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter"> 
     <property name="rememberMeServices" ref="rememberMeServices"/> 
     <property name="authenticationManager" ref="authenticationManager"/> 
    </bean> 

    <bean id="rememberMeServices" class= 
      "org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices"> 
     <property name="userDetailsService" ref="jpaUserDetailsService"/> 
     <property name="key" value="89dqj219dn910lsAc12"/> 
    </bean> 

    <bean id="rememberMeAuthenticationProvider" class= 
      "org.springframework.security.authentication.RememberMeAuthenticationProvider"> 
     <property name="key" value="89dqj219dn910lsAc12"/> 
    </bean> 
</beans> 

最后一些调试跟踪

03:45:14.598 [[email protected]] DEBUG o.s.w.b.a.s.HandlerMethodInvoker - Invoking request handler method: public java.lang.String de.myapp.controller.bstController.showbstpage(java.lang.String,javax.servlet.http.HttpServletResponse) 
03:45:14.598 [[email protected]] DEBUG o.s.s.a.i.a.MethodSecurityInterceptor - Secure object: ReflectiveMethodInvocation: public java.lang.String de.myapp.controller.bstController.showbstpage(java.lang.String,javax.servlet.http.HttpServletResponse); target is of class [de.myapp.controller.bstController]; Attributes: [[authorize: 'isFullyAuthenticated() and #username == principal.username', filter: 'null', filterTarget: 'null']] 
03:45:14.598 [[email protected]] DEBUG o.s.s.a.i.a.MethodSecurityInterceptor - Previously Authenticated: org.spring[email protected]9ab72a70: Principal: [email protected]: Username: myad; Password: [PROTECTED]; Enabled: true; AccountNonExpired: true; credentialsNonExpired: true; AccountNonLocked: true; PersonalInformation: 65537; ; Credentials: [PROTECTED]; Authenticated: true; Details: org.sprin[email protected]957e: RemoteIpAddress: 127.0.0.1; SessionId: null; Granted Authorities: ROLE_ADMIN, ROLE_USER 
03:45:14.599 [[email protected]] DEBUG o.s.c.c.s.GenericConversionService - Converting value false of [TypeDescriptor java.lang.Boolean] to [TypeDescriptor java.lang.Boolean] 
03:45:14.599 [[email protected]] TRACE o.s.c.c.s.GenericConversionService - Matched cached converter NO_OP 
03:45:14.599 [[email protected]tp-10131947-7] DEBUG o.s.c.c.s.GenericConversionService - Converted to false 
03:45:14.599 [[email protected]] DEBUG o.s.s.access.vote.AffirmativeBased - Voter: org.springframewor[email protected]a866a9, returned: -1 
03:45:14.599 [[email protected]] DEBUG o.s.s.access.vote.AffirmativeBased - Voter: [email protected], returned: 0 
03:45:14.599 [[email protected]] DEBUG o.s.s.access.vote.AffirmativeBased - Voter: [email protected]d6f, returned: 0 

我真的不知道从哪里继续调试。我错过了什么?我是否必须创建自己的记住我的实现?

我真的欣赏演示泉记得,我的默认实现工作示例应用程序...

-------- ----------编辑 -

我刚编译并运行springsecurity本身的记忆我参考应用程序:spring-security\samples\tutorial帐户应用程序和联系人应用程序。其实我有完全一样的问题?!?。我已经尝试过Firefox,Opera和ie ...我破碎了...

回答

0

当您登录时,您的UserDetails对象上的“密码”字段被设置为非空/非空值?在我的应用程序中,实际身份验证委托给另一个系统,并且我不会将用户提交的密码存储在我的UserDetails对象中。在将密码属性设置为某个值之前,我无法使用RememberMe cookie。在我的情况下,我只是默认属性为“密码”一词,所以它不会是空/空字符串。

我不知道这是不是像你的情况,但这让我疯狂,直到我明白了。

1

由于您从remember-me cookie中获取有效的身份验证令牌,因此它看起来像记住我身份验证在您的应用程序中工作正常。

但是,日志输出表示在表达式isFullyAuthenticated() and #username == principal.username需要“完整”身份验证的控制器方法bstController.showbstpage上存在方法访问控制注释。记住我不符合完整身份验证的条件,因此表达式会拒绝当前的身份验证。

由于intercept-url元素错误地排序,因为/**位于顶部,并且将应用于所有请求,使其他元素变得冗余。

此外,它不可能得到与示例应用程序相同的问题,因为它们不需要对任何操作进行完全身份验证,所以您必须在其中有其他问题。