在 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
(进入会话会有点困难,但可行)。
我有一个非常基本的 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
(进入会话会有点困难,但可行)。