Сеанс без сохранения состояния (JWT) с inMemoryAuthentication последовательно терпит неудачу - PullRequest
0 голосов
/ 10 сентября 2018

Я пытаюсь реализовать 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 работает только с методами аутентификации сессий / состояний? Я предполагал, что все пользователи и кредиты будут храниться в глобальном синглтон-бине, который будет доступен везде ...

...