Я пытаюсь реализовать JWT, следуя / копируя https://github.com/murraco/spring-boot-jwt, однако, поскольку мне пока не требуется несколько пользователей, я хотел использовать встроенный inMemoryAuthentication
.
Вот сокращенная версия моего WebSecurityConfig
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
private final JwtTokenProvider jwtTokenProvider;
@Autowired
public SecurityConfiguration(JwtTokenProvider jwtTokenProvider) {
this.jwtTokenProvider = jwtTokenProvider;
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.addFilterBefore(new JwtTokenFilter(jwtTokenProvider), UsernamePasswordAuthenticationFilter.class)
.and()
.exceptionHandling().authenticationEntryPoint((req, res, e) -> res.sendError(HttpServletResponse.SC_UNAUTHORIZED))
.authorizeRequests()
.antMatchers("/test/**").hasRole("ROLE_TEST")
.antMatchers("/login").permitAll()
.anyRequest().authenticated();
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("admin")
.password("{noop}admin")
.roles("ROLE_TEST");
}
@Bean
public AuthenticationService authenticationService() throws Exception {
return new AuthenticationService(jwtTokenProvider, authenticationManager());
}
}
И я изменил JwtTokenProvider
, чтобы использовать InMemoryUserDetailsManager
вместо пользовательской службы сведений о пользователе, которая подключается к базе данных.
Теперь, когда я нажимаю конечную точку /login
с именем пользователя и паролем, я получаю обратно действительный токен jwt, но когда я пытаюсь использовать этот токен в методе /test
, происходит сбой, поскольку он не может найти пользователя. Отладка Я вижу, что userDetailsManager
в
public Authentication getAuthentication(String token) {
UserDetails userDetails = userDetailsManager.loadUserByUsername(getUsername(token));
return new UsernamePasswordAuthenticationToken(userDetails, "", userDetails.getAuthorities());
}
не содержит пользователя, добавленного в WebSecurityConfig
.
Может кто-нибудь сказать мне, почему это? InMemoryAuthentication
работает только с методами аутентификации сессий / состояний? Я предполагал, что все пользователи и кредиты будут храниться в глобальном синглтон-бине, который будет доступен везде ...