我必须使用spring安全性来实现会话管理。
但是在我的代码中,会话是在加载登录页面本身时创建的。
我的 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();
}
}
答案 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创建,但此时创建的会话未被授权,并且在用户成功登录后,将为该用户和上一个会话创建一个新会话将被摧毁。