基于弹簧安全令牌的身份验证
我有一个休息API,我使用spring安全基本授权进行身份验证,其中客户端为每个请求发送用户名和密码。现在,我想实现基于令牌的身份验证,当用户首先进行身份验证时,我将在响应标头中发送令牌。对于进一步的请求,客户端可以在标头中包含该令牌,该令牌将用于向资源验证用户。我有两个身份验证提供程序 tokenAuthenticationProvider 和 daoAuthenticationProvider
@Component
public class TokenAuthenticationProvider implements AuthenticationProvider {
@Autowired
private TokenAuthentcationService service;
@Override
public Authentication authenticate(final Authentication authentication) throws AuthenticationException {
final RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
final HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();
final String token = request.getHeader(Constants.AUTH_HEADER_NAME);
final Token tokenObj = this.service.getToken(token);
final AuthenticationToken authToken = new AuthenticationToken(tokenObj);
return authToken;
}
@Override
public boolean supports(final Class<?> authentication) {
return AuthenticationToken.class.isAssignableFrom(authentication);
}
}
在 daoAuthenticationProvider 中,我正在设置自定义 userDetailsService,并通过从数据库获取用户登录详细信息进行身份验证(只要使用 Authorization:Basic bGllQXBpVXNlcjogN21wXidMQjRdTURtR04pag== 作为标头传递用户名和密码,这就可以正常工作)
但是,当我使用X-AUTH-TOKEN(Constants.AUTH_HEADER_NAME)在标头中包含令牌时,不会调用tokenAuthenticationProvider。我收到错误
{"timestamp":1487626368308,"status":401,"error":"Unauthorized","message":"Full authentication is required to access this resource","path":"/find"}
以下是我添加身份验证提供程序的方式。
@Override
public void configure(final AuthenticationManagerBuilder auth) throws Exception {
final UsernamePasswordAuthenticationProvider daoProvider = new
UsernamePasswordAuthenticationProvider(this.service, this.passwordEncoder());
auth.authenticationProvider(this.tokenAuthenticationProvider);
auth.authenticationProvider(daoProvider);
}
请建议如何在不损害Spring安全当前行为的情况下实现基于Token的身份验证。