2011-11-17 13 views
11

mi web.xml config esAuthenticationProvider para UsernamePasswordAuthenticationToken

<filter> 
     <filter-name>springSecurityFilterChain</filter-name> 
     <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
    </filter> 

    <filter-mapping> 
     <filter-name>springSecurityFilterChain</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

aquí está mi configuración de seguridad

<intercept-url pattern="/*" access="ROLE_USER" /> 
    <intercept-url pattern="/*.ico" filters="none" /> 


</http> 

<beans:bean id="customAuthenticationProvider" class="net.spring3.provider.MyAuthProvider" /> 

    <authentication-manager> 

     <authentication-provider ref="customAuthenticationProvider" /> 

    </authentication-manager> 

Aquí está mi clase customAuthProvider

public class MyAuthProvider implements AuthenticationProvider { 


    @Override 
    public boolean supports(Class<? extends Object> arg0) { 
     // TODO Auto-generated method stub 
     return false; 
    } 


    @SuppressWarnings("serial") 
     private static Map<String, String> SIMPLE_USERS = new HashMap<String, String>(2) {{ 
      put("joe", "joe"); 
      put("bob", "bob"); 
     }}; 

     @SuppressWarnings("serial") 
     private static List<GrantedAuthority> AUTHORITIES = new ArrayList<GrantedAuthority>(1) {{ 
      add(new GrantedAuthorityImpl("ROLE_USER")); 
     }}; 

     @Override 
     public Authentication authenticate(Authentication auth) throws AuthenticationException 
     { 
      // All your user authentication needs 
      System.out.println("==Authenticate Me=="); 
      if (SIMPLE_USERS.containsKey(auth.getPrincipal()) 
       && SIMPLE_USERS.get(auth.getPrincipal()).equals(auth.getCredentials())) 
      { 
       return new UsernamePasswordAuthenticationToken(auth.getName(), auth.getCredentials(), AUTHORITIES); 
      } 
      throw new BadCredentialsException("Username/Password does not match for " + auth.getPrincipal()); 
     } 




} 

La página muestra el formulario de inicio de sesión y cuando ingreso bob y bob como inicio de sesión, arroja el siguiente error.

Your login attempt was not successful, try again. 

Reason: No AuthenticationProvider found for org.springframework.security.authentication.UsernamePasswordAuthenticationToken 

Revisé los registros en el nivel de depuración TODOS y esto es lo que obtengo.

FINE: Request is to process authentication 
Nov 17, 2011 5:37:36 AM org.springframework.context.support.AbstractApplicationContext publishEvent 
FINEST: Publishing event in Root WebApplicationContext: org.springframework.security.authentication.event.AuthenticationFailureProviderNotFoundEvent[source=org.springframew[email protected]ffff8dfd: Principal: sd; Credentials: [PROTECTED]; Authenticated: false; Details: org.sprin[email protected]fffe3f86: RemoteIpAddress: 127.0.0.1; SessionId: x4lg4vtktpw9; Not granted any authorities] 
Nov 17, 2011 5:37:36 AM org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter unsuccessfulAuthentication 
FINE: Authentication request failed: org.springframework.security.authentication.ProviderNotFoundException: No AuthenticationProvider found for org.springframework.security.authentication.UsernamePasswordAuthenticationToken 

Cualquier ayuda en esto ... ¿Qué estoy haciendo mal aquí?

+0

Justo después de la publicación de this.I lectura del documento de primavera que el método debe devolver true para indicar que el proveedor admite la autenticación. ¡Y estaba volviendo falso! , ¡Simplemente lo cambié a verdad y mi primer inicio de sesión de la aplicación de seguridad de primavera está funcionando con éxito! Espero que esta información sea útil para cualquiera que esté atascado como yo. @Override public boolean supports (Clase arg0) { // TODO El stub del método generado automáticamente return true; } – cherit

Respuesta

29

Como ya escribió en su comentario, el problema es que siempre devuelve false en el método supports() de su proveedor de autenticación. Pero en lugar de volver siempre true debe comprobar el authentication se obtiene de esta manera:

public class MyAuthenticationProvider implements AuthenticationProvider, Serializable { 

    @Override 
    public boolean supports(Class<? extends Object> authentication) { 
     return (UsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication)); 
    } 

    // ... 
} 
Cuestiones relacionadas