【问题标题】:Spring Security recreates HttpSessionSpring Security 重新创建 HttpSession
【发布时间】:2019-07-11 12:49:26
【问题描述】:

我尝试配置 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);
    }

}

这是我的安全配置:

@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();
    }

}

这是我的索引控制器:

@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 Security 创建的。它是如何固定的?

【问题讨论】:

标签: java spring spring-security spring-session


【解决方案1】:

您的问题可能与此有关:.sessionCreationPolicy(SessionCreationPolicy.STATELESS)

根据 Spring Security Docs,当会话创建策略设置为 STATELESS 时,Spring Security 永远不会创建 HttpSession 并且永远不会使用它来获取 SecurityContext

尝试将政策更改为SessionCreationPolicy.ALWAYS

Enum SessionCreationPolicy

【讨论】:

  • 我意识到我的变体工作正常,只是 Spring Security 更改了 id session 以确保安全。谢谢你的建议。
  • 不用担心,帮助其他同事总是一种乐趣。
猜你喜欢
  • 2017-12-31
  • 2012-07-26
  • 2012-05-08
  • 2014-12-11
  • 1970-01-01
  • 2012-04-20
  • 2011-07-22
  • 2017-04-17
  • 2012-12-20
相关资源
最近更新 更多