У меня есть приложение Spring Boot, в котором хочу использовать токен (хранящий в таблице базы данных) для аутентификации. Я добавил собственный поставщик фильтра и аутентификации, но поставщик не используется. Почему это так?@Configuration
@EnableWebSecurity
public class SecurityConfig {
private final TokenAuthenticationProvider tokenAuthenticationProvider;
public SecurityConfig(
TokenAuthenticationProvider tokenAuthenticationProvider
) {
this.tokenAuthenticationProvider = tokenAuthenticationProvider;
}
@Bean
public SecurityFilterChain filterChain(HttpSecurity security) throws Exception {
security
.csrf(AbstractHttpConfigurer::disable)
.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.authorizeHttpRequests(authorize -> authorize.anyRequest().authenticated())
.addFilterAfter(new TokenAuthFilter(), LogoutFilter.class)
.authenticationProvider(tokenAuthenticationProvider);
return security.build();
}
}
< /code>
tokenauthenticationprovider.java написан@Component
public class TokenAuthenticationProvider implements AuthenticationProvider {
private final TokenRepository tokenRepository;
public TokenAuthenticationProvider(TokenRepository tokenRepository) {
this.tokenRepository = tokenRepository;
}
@Override
public Authentication authenticate(Authentication authentication) throws
// TODO
}
@Override
public boolean supports(Class authentication) {
return authentication.equals(TokenAuthenticationToken.class);
}
}
< /code>
tokenauthenticationtoken.java
public class TokenAuthenticationToken extends AbstractAuthenticationToken {
private final String token;
private final Long namespace;
private TokenAuthenticationToken(String token, Long namespace, Boolean authenticated) {
super(Collections.emptyList());
this.token = token;
this.namespace = namespace;
}
public static TokenAuthenticationToken unauthenticated(String token) {
return new TokenAuthenticationToken(token, null, false);
}
public static TokenAuthenticationToken authenticated(String token, Long namespace) {
return new TokenAuthenticationToken(token, namespace, true);
}
@Override
public Object getCredentials() {
return this.token;
}
@Override
public Object getPrincipal() {
return this.namespace;
}
}
< /code>
tokenauthfilter.java
public class TokenAuthFilter extends OncePerRequestFilter {
private final static String AUTH_HEADER_METHOD = "APIToken";
private final static String AUTH_HEADER_PARAM = "Token";
@Override
protected void doFilterInternal(
@NonNull HttpServletRequest request,
@NonNull HttpServletResponse response,
@NonNull FilterChain filterChain
) throws ServletException, IOException {
String authHeader = request.getHeader("Authorization");
if (authHeader != null) {
String[] headerParts = authHeader.split("=");
if (headerParts.length != 2 || !headerParts[0].equals(AUTH_HEADER_METHOD+" "+AUTH_HEADER_PARAM)) {
response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
return;
}
Authentication auth = TokenAuthenticationToken.unauthenticated(headerParts[1]);
SecurityContextHolder.getContext().setAuthentication(auth);
}
filterChain.doFilter(request, response);
}
}
< /code>
Это даже лучший способ реализовать это? Я также попытался использовать usernamepasswordAuthenticationToken в своем фильтре для DaoAuthenticationProvider, чтобы справиться с ним и загрузить токен через службу данных пользователя, но это тоже не сработало.
Подробнее здесь: https://stackoverflow.com/questions/797 ... ot-working