在 Spring 引导中使用 Spring 安全时不能使用任何类型的 SessionListener

Can't use any kind of SessionListener when using Spring Security in Spring Boot

我有一个非常基本的 Spring 使用 Session 的安全设置。我的问题是我找不到使用任何类型的会话监听器(Spring 和 Servlet API 版本)来监听 SessionCreated 事件的方法。登录正常,会话正在正确创建。

我需要监听器的原因是因为我想初始化某些会话属性(例如购物卡丁车、最近的项目列表)所以我可以从 @Controller 请求映射无缝访问它们,而不必担心是否会话属性已初始化。

安全配置代码:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Autowired
    DataSource dataSource;

    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity
                .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.ALWAYS)
                .and()
                .authorizeRequests()
                .antMatchers("/secured/**").authenticated()
                .anyRequest().permitAll()
                .and()
                .formLogin()
                .loginPage("/login")
                .and()
                .logout()
                .logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
                .logoutSuccessUrl("/")
                .and()
                .rememberMe().key("unique");
    }

    ...
}

首先,我尝试了最基本的会话监听器:

@Component
public class InitHttpSessionListener implements HttpSessionListener {

    public void sessionCreated(HttpSessionEvent event) {
        ...
    }
}

我也试过 的答案,但也没用

从您的评论中可以清楚地看出您正在使用 Spring Session JDBC。由于 JDBC 的性质,它不支持会话事件的发布,因此您无法收听这些事件。

作为解决方法,您可以创建自己的 AuthenticationSuccessHandler 并将填充 Session 的逻辑放在那里。或者使用 Spring 事件侦听器收听 AuthenticationSuccessEvent(进入会话会有点困难,但可行)。