在 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的使用