2010-09-19 6 views
1

Tout ce que je veux, c'est un simple souvenir-moi. J'ai lu http://static.springsource.org/spring-security/site/docs/3.0.x/reference/remember-me.htmlSimple printemps <remember-me /> ... aide s'il vous plaît

Ce que je l'ai fait jusqu'à présent:

  1. créé mon propre UserDetailsService de travailler avec Hibernate/JPA. Mon impl. ne considère pas se souvenir de moi-stuff
  2. configuration Considéré par appContext <security:remember-me key="89dqj219dn910lsAc12" user-service-ref="jpaUserDetailsService" token-validity-seconds="864000"/>
  3. vérifié, que le cookie SPRING_SECURITY_REMEMBER_ME_COOKIE est vraiment mis
  4. vous êtes connecté au site sécurisé et il fonctionne
  5. Lorsque je redémarre mon navigateur , je continue à obtenir une erreur:

    org.springframework.security.access.AccessDeniedException: l'accès est refusé objet d'authentification en tant que chaîne: org.springframework.security.authentication.Rem emberMeAuthenticationToken @ 9ab72a70: Principal: [email protected]: Nom d'utilisateur: myad; Protégé par mot de passe]; Enabled: true; AccountNonExpired: true; credentialsNonExpired: true; AccountNonLocked: true; Renseignements personnels: 65537; ; Diplômes: [PROTÉGÉ]; Authentifié: vrai; Détails: org.sprin[email protected]957e: RemoteIpAddress: 127.0.0.1; SessionId: null; Autorités accordées: ROLE_ADMIN, ROLE_USER

Et voici mon 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> 

et enfin une trace de débogage

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]] 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 

Je ne sais pas vraiment où continuer débogage. Qu'ai-je manqué? Dois-je créer ma propre implémentation de remember-me?

je serais vraiment apprécier un exemple d'application de travail qui démontre l'implémentation par défaut de ressorts me retenir ...-

-------- ---------- EDIT -

Je viens de compiler et de lancer l'application de référence remember-me par springsecurity: l'application de compte spring-security\samples\tutorial ET l'application de contact. En fait, j'ai exactement le même problème?!?. J'ai essayé firefox, opera et ie ... Je suis brisé ...

Répondre

0

Lorsque vous vous connectez, le champ "mot de passe" de votre objet UserDetails est-il défini sur une valeur non nulle/non vide? Dans mon application, l'authentification réelle est déléguée à un autre système et je ne stocke pas le mot de passe soumis par l'utilisateur sur mon objet UserDetails. Je n'ai pas réussi à faire fonctionner le cookie RememberMe jusqu'à ce que je mette une valeur à la propriété password. Dans mon cas, j'ai simplement par défaut la propriété au mot "mot de passe" juste pour que ce ne soit pas une chaîne vide/vide.

Je ne sais pas si c'est quelque chose comme votre scénario, mais cela m'a rendu fou jusqu'à ce que je l'ai compris.

1

Il semble que l'authentification remember-me fonctionne correctement dans votre application, puisque vous obtenez un jeton d'authentification valide du cookie remember-me.Toutefois, la sortie du journal indique qu'il existe une annotation de contrôle d'accès à la méthode sur une méthode de contrôleur bstController.showbstpage qui requiert une authentification "complète", à partir de l'expression isFullyAuthenticated() and #username == principal.username. Remember-me n'est pas considéré comme une authentification complète, d'où l'expression rejette l'authentification en cours. En outre, les éléments intercept-url sont mal classés car /** est en haut et sera appliqué à toutes les demandes, rendant les autres redondantes.

De même, il ne serait pas possible d'obtenir le même problème avec les exemples d'application, car ils ne nécessitent pas d'authentification complète pour toute opération, vous devez donc avoir rencontré un autre problème.

Questions connexes