在 Spring Boot 中使用 Spring Security 时不能使用任何类型的 SessionListener

Posted

技术标签:

【中文标题】在 Spring Boot 中使用 Spring Security 时不能使用任何类型的 SessionListener【英文标题】:Can't use any kind of SessionListener when using Spring Security in Spring Boot 【发布时间】:2022-01-07 00:56:10 【问题描述】:

我有一个使用 Session 的非常基本的 Spring Security 设置。我的问题是我找不到使用任何类型的会话侦听器(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) 
        ...
    

我也试过here的答案,也没有用

【问题讨论】:

哪个会话创建了事件?哪些听众,你是如何注册的? 我先尝试了最基本的方法,还是不行。 ``` @Component public class InitHttpSessionListener implements HttpSessionListener public void sessionCreated(HttpSessionEvent event) ... ``` 然后,我尝试了here的答案,也没有成功 请编辑您的问题,而不是将代码添加为完全不可读的 cmets。 该监听器是否在组件扫描正确覆盖的包中? JDBC 集成不支持事件发布。见***.com/questions/40554089/… 【参考方案1】:

您的 cmets 清楚地表明您正在使用Spring Session JDBC。由于 JDBC 的性质,它不支持发布会话事件,因此您无法监听这些事件。

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

【讨论】:

以上是关于在 Spring Boot 中使用 Spring Security 时不能使用任何类型的 SessionListener的主要内容,如果未能解决你的问题,请参考以下文章

如何在 spring-boot 中禁用 spring-data-mongodb 自动配置

Spring Boot:在Spring Boot中使用Mysql和JPA

Spring boot在Spring boot中Redis的使用

Spring boot- Spring Boot特性2

spring-boot实战09:Spring Boot中使用@Scheduled创建定时任务

在 Spring Boot 中使用 UCANACCESS