У меня есть следующие шаблоны конечных точек в моем приложении
- /токен -- доступен всем
- /rest/securedone/** -- требует аутентификации
- /rest/securedtwo/** -- требует аутентификации
- /rest/unsecured/** -- не требует аутентификации
На данный момент я могу получить доступ к конечной точке /token. Но /rest/securedone/** и /rest/unsecured/** возвращают 401, когда токен (JWT) не отправляется. Я намерен защитить /rest/securedone/**, и это нормально, /rest/unsecured/** должен быть доступен.
Моя конфигурация httpSecurity выглядит следующим образом:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.cors()
.and()
.csrf().disable()
.authorizeRequests()
.antMatchers("/token").permitAll()
.antMatchers("/rest/secured/**").authenticated()
.and()
.exceptionHandling()
.authenticationEntryPoint(authenticationEntryPoint)
.and()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS);
http.addFilterBefore(authenticationTokenFilter(), UsernamePasswordAuthenticationFilter.class);
http.headers().cacheControl();
}
и мой расширенный класс AbstractAuthenticationProcessingFilter выглядит следующим образом:
public class MyAuthenticationTokenFilter extends AbstractAuthenticationProcessingFilter {
private static Logger log = LoggerFactory.getLogger(MyAuthenticationTokenFilter.class);
public MyAuthenticationTokenFilter() { super("/rest/**"); }
@Override
public Authentication attemptAuthentication(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws AuthenticationException, ServletException {
//authentication handling code
}
@Override
protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException, ServletException {
super.successfulAuthentication(request, response, chain, authResult);
chain.doFilter(request, response);
}
}
Может кто-нибудь, пожалуйста, помогите мне понять следующее:
Когда используется MyAuthenticationTokenFilter? Для какого URL он будет вызываться? Почему /rest/unsecured/** также ожидает аутентификацию? Это происходит, даже если я прямо говорю .antMatchers("/rest/secured/**").permitAll(). я
Могу ли я указать несколько шаблонов URL-адресов в вызове super(defaultFilterProcessingUrl) внутри конструктора MyAuthenticationTokenFilter? Например, если у меня есть другой URL-адрес, такой как /api/secured/, как я могу вызвать MyAuthenticationTokenFilter для запросов /api/secured/? Мне не нужна другая обработка аутентификации, поэтому я хочу повторно использовать этот фильтр.