【问题标题】:Can't use any kind of SessionListener when using Spring Security in Spring Boot在 Spring Boot 中使用 Spring Security 时不能使用任何类型的 SessionListener
【发布时间】: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 集成不支持事件发布。见stackoverflow.com/questions/40554089/…

标签: java spring spring-boot servlets spring-security


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2015-05-10
    • 2020-05-29
    • 1970-01-01
    • 2013-11-01
    • 2017-08-15
    • 2014-08-02
    • 2020-07-08
    • 2017-07-09
    • 2018-10-23
    相关资源
    最近更新 更多