使用要求用户名和密码的Web服务,通过SpringSecurity对用户进行身份验证

5

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

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

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

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


我认为问题出在您的xml文件上。您是否关闭了自动配置?您的类是否扩展了AbstractUserDetailsAuthenticationProvider?

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

}

4

我已经编写了以下类:

PncUserDetailsAuthenticationProvider扩展自AbstractUserDetailsAuthenticationProvider

该类实现了receiveUser方法:

@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>
    </property>
</bean>
<bean id="PncAuthenticationProvider" class="com.logica.pnc.security.PncUserDetailsAuthenticationProvider"> <security:custom-authentication-provider /> </bean>

重要的是将auto-config设置为false:

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

感谢rodrigoap指出AuthenticationProvider的问题 :)


0
UserDetailsService 的理念是,您的实现提供一个表示具有该用户名的用户的 UserDetails 对象,而 Spring Security 负责检查凭据。
如果这种设计与您的后端不太合适,因为您需要将密码作为参数,则可能需要考虑实现自己的 AuthenticationProvider。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接