Spring Security воссоздает HttpSession - PullRequest
1 голос
/ 11 июля 2019

Я пытаюсь настроить Spring Security, и у меня есть одна проблема.

это мой SessionAuthenticationFilter:

public class SessionAuthenticationFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {

        HttpSession session = request.getSession();
        User user = (User) session.getAttribute("user");

        if (nonNull(user)) {
            SimpleGrantedAuthority authority = new SimpleGrantedAuthority(user.getRole());
            Authentication authentication = new UsernamePasswordAuthenticationToken(user.getName(), null, singletonList(authority));

            SecurityContextHolder.getContext().setAuthentication(authentication);
        }

        filterChain.doFilter(request, response);
    }

}

Это мой SecurityConfig:

@Configuration
@EnableWebSecurity
@EnableJdbcHttpSession
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Bean
    public SessionAuthenticationFilter sessionFilter() {
        return new SessionAuthenticationFilter();
    }

    @Bean
    public HttpSessionIdResolver httpSessionIdResolver() {
        return HeaderHttpSessionIdResolver.xAuthToken();
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http
                .csrf().disable()
                .formLogin().disable()
                .cors()
                .and()
                .httpBasic()
                .and()
                .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .addFilterBefore(sessionFilter(), SessionManagementFilter.class)
                .authorizeRequests()
                .antMatchers(
                        "/login"
                )
                .permitAll()
                .anyRequest()
                .authenticated();
    }

}

Это мой IndexController:

@RestController
public class IndexController {

    @RequestMapping(value = "/index", method = RequestMethod.GET)
    public ResponseEntity<?> index(HttpSession session) {

        System.out.println(session.getId());

        return new ResponseEntity<>(HttpStatus.OK);
    }

}

Внутри SessionAuthenticationFilter HttpSession верен, но когда я попытаюсь получить этот сеанс, я получу другой сеанс. Зачем? Я так понимаю, что это Spring Spring. Как это исправить?

1 Ответ

1 голос
/ 11 июля 2019

Ваша проблема может быть связана с этим: .sessionCreationPolicy(SessionCreationPolicy.STATELESS)

Соответственно, в Spring Security Docs Spring Security никогда не создаст HttpSession и никогда не будет использовать его для получения SecurityContext, когда для политики создания сеанса установлено значение STATELESS.

Попробуйте изменить политику на SessionCreationPolicy.ALWAYS

См Enum SessionCreationPolicy

...