2013-05-08 4 views
0

J'ai eu Spring Security 2.0.5 sur ma webApp, en utilisant un fournisseur par défaut. Maintenant, les exigences ont changé et j'ai besoin d'un CustomAuthenticationProvider afin de changer le mode d'authentification.Fournisseur d'authentification personnalisé sur Spring Security 2 problème userDetailsService

Ceci est mon AuthenticationProvider

public class CustomAuthenticationProvider implements AuthenticationProvider { 

@Autowired 
private ParamsProperties paramsProperties; 

@SuppressWarnings("unchecked") 
public Authentication authenticate(Authentication authentication) throws AuthenticationException { 

    //Check username and passwd 
    String user = (String) authentication.getPrincipal(); 
    String pass = (String) authentication.getCredentials(); 
    if(StringUtils.isBlank(user) || StringUtils.isBlank(pass)){ 
     throw new BadCredentialsException("Incorrect username/password"); 
    } 

    //Create SSO 
    SingleSignOnService service = new SingleSignOnService(paramsProperties.getServicesServer()); 
    try { 
     //Check logged 
     service.setUsername(authentication.getName()); 
     service.setPassword(authentication.getCredentials().toString()); 
     ClientResponse response = service.call(); 
     String result = response.getEntity(String.class); 

     ObjectMapper mapper = new ObjectMapper(); 
     Map<String,Object> map = mapper.readValue(result, new TypeReference<Map<String,Object>>() {}); 
     //Read code 
     String code = (String)map.get("code"); 
     log.debug(" ** [Authenticate] Result: " + code); 
     for (String s : (List<String>)map.get("messages")) { 
      log.debug(" [Authenticate] Message: " + s); 
     } 

     if (code.equals("SESSION_CREATED") || code.equals("SESSION_UPDATED") || code.equals("SESSION_VERIFIED")) {    
      UsernamePasswordAuthenticationToken tokenSSO = LoginHelper.getuserSringTokenFromAuthService(map);    
      return tokenSSO;     
     } else { 
      return null; 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
     throw new AuthenticationServiceException(e.getMessage()); 
    } 
} 


public boolean supports(Class authentication) { 
    return authentication.equals(UsernamePasswordAuthenticationToken.class); 
} 

Et ceci est mon security.xml

<http> 
    <form-login default-target-url ="/Login.html" always-use-default-target="true" login-page="/Login.html" login-processing-url="/j_spring_security_check" 
     authentication-failure-url="/Login.html" /> 
    <http-basic /> 
    <logout logout-success-url="/Login.html" /> 
</http> 

<beans:bean id="myPasswordEncryptor" 
    class="com.mycomp.comunes.server.spring.core.MyPasswordEncoder" lazy-init="true"> 
    <beans:constructor-arg> 
     <beans:bean class="org.jasypt.util.password.ConfigurablePasswordEncryptor" /> 
    </beans:constructor-arg> 
    <beans:constructor-arg ref="paramsProperties" /> 
</beans:bean> 

<beans:bean id="passwordEncoder" 
    class="org.jasypt.spring.security2.PasswordEncoder" lazy-init="true"> 
    <beans:property name="passwordEncryptor"> 
     <beans:ref bean="myPasswordEncryptor" /> 
    </beans:property> 
</beans:bean> 

<beans:bean id="authenticationProvider" 
    class="com.mycomp.comunes.server.spring.manager.autenticacion.CustomAuthenticationProvider"> 
</beans:bean> 

<authentication-provider user-service-ref='authenticationProvider'> 
    <password-encoder ref="passwordEncoder" /> 
</authentication-provider> 

Mais lors du déploiement, je reçois les éléments suivants:

Caused by: java.lang.IllegalArgumentException: Cannot convert value of type [$Proxy112 implementing org.springframework.security.providers.AuthenticationProvider,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised] to required type [org.springframework.security.userdetails.UserDetailsService] for property 'userDetailsService': no matching editors or conversion strategy found 

Quelqu'un peut-il aider?

Répondre

1

Vous faites référence au bean authenticationProvider en tant que service utilisateur, ce qui n'est pas le cas.

<authentication-provider user-service-ref='authenticationProvider'> 

Avec cette ancienne version du cadre, je ne peux deviner que la façon d'utiliser un fournisseur de auth personnalisé est décrit correctement here.

Inutile de dire qu'il serait fortement recommandé de mettre à niveau, si rien d'autre, juste dans le but d'obtenir un soutien plus facile.

+0

Oups! J'ai essayé avec ' ' et ça a vraiment marché. Merci beaucoup, cela a fait ma journée. – user2087103

Questions connexes