2009-07-23 82 views
3

目前我正在使用Spring Security編寫一個Web應用程序。我們有一個通過用戶名和密碼驗證用戶的Web服務。用SpringSecurity使用需要用戶名和密碼的WebService驗證用戶

Web服務:
String[] login(String username, String password);

如何配置Spring Security傳遞到Web服務提供的用戶名和密碼?

我寫了一個UserDetailsService,它只接收用戶名。


我認爲問題在於你的xml。你關掉了自動配置嗎?你的類是否擴展AbstractUserDetailsAuthenticationProvider?

回答

4

擴展org.acegisecurity.providers.dao.AbstractUserDetailsAuthenticationProvider

/** 
* @author rodrigoap 
* 
*/ 
public class WebServiceUserDetailsAuthenticationProvider extends 
    AbstractUserDetailsAuthenticationProvider { 

    @Override 
    protected UserDetails retrieveUser(String username, 
     UsernamePasswordAuthenticationToken authentication) 
     throws AuthenticationException { 
    //Improve this line: 
    String password = authentication.getCredentials().toString(); 
    // Invoke your webservice here 
    GrantedAuthority[] grantedAuth = loginWebService.login(username, password); 
    // create UserDetails. Warning: User is deprecated! 
    UserDetails userDetails = new User(username, password, grantedAuth); 
    return userDetails; 
    } 

} 
0

UserDetailsS​​ervice的思想是你的實現提供了一個UserDetails對象來表示具有該用戶名的用戶,Spring Security處理檢查憑證。

如果這種設計不適合您的後端,因爲您需要密碼作爲參數,那麼您可能需要考慮實現您自己的AuthenticationProvider。

4

我已經寫信給下面的類:

PncUserDetailsAuthenticationProvider extends AbstractUserDetailsAuthenticationProvider

它實現了recieveUser梅索德:

@Override 
protected UserDetails retrieveUser(String username, UsernamePasswordAuthenticationToken token) throws AuthenticationException { 
    try { 
     server = (PncUtilRemote) new InitialContext().lookup("PncUtilBean"); 
     if (server != null) { 
      String password = SHA1(token.getCredentials().toString()); 
      String[] auth = server.login(username, password); 
      if (auth.length > 0) { 
       PncUserDetails details = new PncUserDetails(username, password); 
       for (int i = 0; i < auth.length; i++) { 
        details.addAuthority(auth[i]); 
       } 
       return details; 
      } 
     } 
    } catch (Exception e) { 
     System.out.println("! " + e.getClass().getName() + " in com.logica.pnc.security.PncUserDetailsAuthenticationProvider.retrieveUser(String, UsernamePasswordAuthenticationToken): " + e.getMessage()); 
    } 
    throw new BadCredentialsException(""); 
} 

爲了使您的AuthenticationProvider,你需要一些行添加到您的應用程序context.xml文件:

 
<security:http auto-config="false" /> 

感謝:

 
<bean id="authenticationManager" class="org.springframework.security.providers.ProviderManager"> 
    <property name="providers"> 
     <list><ref local="PncAuthenticationProvider" /></list> 
    </property> 
</bean> 

<bean id="PncAuthenticationProvider" class="com.logica.pnc.security.PncUserDetailsAuthenticationProvider"> 
    <security:custom-authentication-provider /> 
</bean> 

您設置的自動配置,以虛假的這一點很重要rodrigoap指向AuthenticationProvider thingy :)