5

目前我正在使用 Spring Security 编写一个 Web 应用程序。我们有一个 Web 服务,它通过用户名和密码对用户进行身份验证。

网络服务:
String[] login(String username, String password);

如何配置 Spring Security 以将提供的用户名和密码传递给 Web 服务?

我写了一个UserDetailsService只接收用户名的。


我认为问题出在您的xml上。你把自动配置关了吗?您的课程是否扩展了 AbstractUserDetailsAuthenticationProvider?

4

3 回答 3

6

扩展 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;
  }

}
于 2009-07-23T19:04:56.850 回答
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,您需要在 application-context.xml 文件中添加一些行:

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

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

将自动配置设置为 false 很重要:

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

感谢 rodrigoap 指向 AuthenticationProvider 东西 :)

于 2009-07-24T21:20:56.530 回答
0

UserDetailsS​​ervice 的想法是您的实现提供了一个 UserDetails 对象,该对象代表具有该用户名的用户,并且 Spring Security 处理检查凭据。

如果这种设计不适用于您的后端,因为您需要密码作为参数,那么您可能需要考虑实现自己的 AuthenticationProvider。

于 2009-07-23T12:40:53.363 回答