Spring Security的会话管理

时间:2018-09-19 07:39:56

标签: spring-mvc spring-security spring-security-oauth2 httpsession

我必须使用spring安全性来实现会话管理。

  1. 我希望HttpSession在仅成功登录后开始
  2. 如何将已登录用户的详细信息添加到会话中

但是在我的代码中,会话是在加载登录页面本身时创建的。

我的 SecurityConfig 类在这里:

public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    public void configure(AuthenticationManagerBuilder auth)
            throws Exception {
        auth.inMemoryAuthentication().withUser("akashm").password("akash123").authorities("ROLE_ADMIN", "ROLE_USER");
        auth.inMemoryAuthentication().withUser("girishp").password("girish123").roles("USER");
    }

    @Override
    public void configure(HttpSecurity http) throws Exception {

            http
            .authorizeRequests()
            .antMatchers("/homePage").access("hasRole('ROLE_USER')")
            .antMatchers("/myProfile").hasRole("USER")
            .antMatchers("/viewUsers").access("hasRole('ROLE_ADMIN')")
            .and()
            .formLogin().loginPage("/login")
            .defaultSuccessUrl("/homePage")
            .failureUrl("/login?error")
            .usernameParameter("email")
            .passwordParameter("pswd")
            .and()
            .logout()
            .logoutSuccessUrl("/login?logout")
            .invalidateHttpSession(true)
            .deleteCookies("JSESSIONID")
            .and()
            .exceptionHandling()
            .accessDeniedPage("/accessDenied")
            .and()
            .sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
            .invalidSessionUrl("/login?invalid")
            .sessionAuthenticationErrorUrl("/login?invalid");
    }

    @Bean
    public HttpSessionEventPublisher httpSessionEventPublisher() { //enabling the concurrent session-control support
        return new HttpSessionEventPublisher();
    }
}
  • 可以使用参考链接

1 个答案:

答案 0 :(得分:0)

您需要为事件ApplicationListener注册InteractiveAuthenticationSuccessEvent,以使用所需的用户详细信息填充会话。

@Component
public class LoginListener implements ApplicationListener<InteractiveAuthenticationSuccessEvent> {

    @Autowired 
    HttpSession httpSession;

    @Override
    public void onApplicationEvent(InteractiveAuthenticationSuccessEvent event)
    {
        //Do whatever with httpSession object
    }
}
  

我希望HttpSession仅在成功登录后开始使用

HttpSession可以是@Autowired,因为它们都是spring bean。

  

但是在我的代码中,会话是在加载登录页面本身时创建的。

会话将在第一次访问登录页面时由Spring Security创建,但此时创建的会话未被授权,并且在用户成功登录后,将为该用户和上一个会话创建一个新会话将被摧毁。