Spring Boot Собственная аутентикатор токена не работаетJAVA

Программисты JAVA общаются здесь
Anonymous
Spring Boot Собственная аутентикатор токена не работает

Сообщение Anonymous »

У меня есть приложение 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

Вернуться в «JAVA»