Tôi có api còn lại trong đó tôi đang xác thực bằng bảo mật mùa xuân Cấp phép cơ bản trong đó máy khách gửi tên người dùng và mật khẩu cho mỗi yêu cầu. Bây giờ, tôi muốn triển khai xác thực dựa trên mã thông báo nơi tôi sẽ gửi mã thông báo trong tiêu đề phản hồi khi người dùng được xác thực lúc đầu. Đối với các yêu cầu thêm, khách hàng có thể bao gồm mã thông báo đó trong tiêu đề sẽ được sử dụng để xác thực người dùng với tài nguyên. Tôi có hai nhà cung cấp chứng thực tokenAuthenticationProvider và daoAuthenticationProviderXác thực dựa trên mã thông báo bảo mật mùa xuân
@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);
}
}
Và trong daoAuthenticationProvider Tôi đang thiết userDetailsService tùy chỉnh và xác thực đối với thông tin đăng nhập người dùng bằng cách lấy nó ra khỏi cơ sở dữ liệu (được làm việc tốt miễn là tên người dùng và mật khẩu được thông qua sử dụng ủy quyền: bGllQXBpVXNlcjogN21wXidMQjRdTURtR04pag Basic == như tiêu đề)
Nhưng khi tôi bao gồm thẻ trong tiêu đề sử dụng X-AUTH-TOKEN (đó là Constants.AUTH_HEADER_NAME), tokenAuthenticationProvider không được gọi. Tôi gặp lỗi dưới dạng
{"timestamp":1487626368308,"status":401,"error":"Unauthorized","message":"Full authentication is required to access this resource","path":"/find"}
Và đây là cách tôi thêm nhà cung cấp xác thực.
@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);
}
Vui lòng đề xuất cách triển khai xác thực dựa trên mã thông báo mà không làm tổn hại đến hành vi hiện tại của bảo mật mùa xuân.
Bạn có nhiều cách khác nhau để làm điều này, Bạn có thể @Autowired nhà cung cấp trực tiếp trên mỗi Bộ lọc hoặc đặt Nhà cung cấp đó trong một Trình quản lý xác thực và làm việc với nó trong cả hai FIlters. Tất nhiên, bạn phải thiết lập cả hai bộ lọc trong Spring Security FilterChain. – Dani