并发会话管理总是重定向到 failureurl - Java Config

Posted

技术标签:

【中文标题】并发会话管理总是重定向到 failureurl - Java Config【英文标题】:Concurrent session management always redirecting to failureurl - Java Config 【发布时间】:2016-05-20 19:25:15 【问题描述】:

我正在使用 Spring MVC 和 Spring Security ver4.0.1.RELEASE。 我试图将并发用户登录控制为 1,如果用户已经登录,则显示错误消息。 并发会话管理按预期工作,但 expireUrl("") 不工作。始终调用 .formLogin().loginPage("").failureUrl("") 而不是 expireUrl("")。请帮忙。

下面是我的 SpringSecurityConfiguration.java,它扩展了 WebSecurityConfigurerAdapter

protected void configure(HttpSecurity http) throws Exception 
  http.authorizeRequests()
  .antMatchers("/resources/**").permitAll()
    .antMatchers("/", "/home").permitAll()
    .antMatchers("/Access_Denied").permitAll()
    .antMatchers("/login").permitAll()      
    .and().formLogin().loginPage("/login")
    .failureUrl("/login?out=1")
    .usernameParameter("userID").passwordParameter("password")
    .and().csrf().and()
    .logout()
    .deleteCookies( "JSESSIONID" )
    .logoutSuccessUrl( "/logout" )
    .invalidateHttpSession( true )
    .and().exceptionHandling().accessDeniedPage("/accessDenied.jsp")
    .and()
    .sessionManagement()
    .maximumSessions(1) 
    expiredUrl("/login?time=1")
    .sessionRegistry(sessionRegistry);   

我的 Initializer 类如下所示 -

protected Filter[] getServletFilters() 
    return new Filter[]  new HiddenHttpMethodFilter() ;



public void onStartup(ServletContext servletContext) throws ServletException 
    super.onStartup(servletContext);
    servletContext.addListener(new SessionListener());
    servletContext.addListener(new CustomHttpSessionEventPublisher());

以下链接提供了此类安全配置的额外信息 -

http://codehustler.org/blog/spring-security-tutorial-form-login-java-config/ https://gerrydevstory.com/2015/08/02/managing-spring-security-user-session/

【问题讨论】:

【参考方案1】:

您是否尝试过将会话管理上移到链上?

protected void configure(HttpSecurity http) throws Exception 
  http.authorizeRequests()
  .antMatchers("/resources/**").permitAll()
    .antMatchers("/", "/home").permitAll()
    .antMatchers("/Access_Denied").permitAll()
    .antMatchers("/login").permitAll()   
    .and().sessionManagement()
    .maximumSessions(1) 
    .expiredUrl("/login?time=1")
    .sessionRegistry(sessionRegistry);   
    .and().formLogin().loginPage("/login")
    .failureUrl("/login?out=1")
    .usernameParameter("userID").passwordParameter("password")
    .and().csrf().and()
    .logout()
    .deleteCookies( "JSESSIONID" )
    .logoutSuccessUrl( "/logout" )
    .invalidateHttpSession( true )
    .and().exceptionHandling().accessDeniedPage("/accessDenied.jsp")       

【讨论】:

感谢您的回复。 formLoging() 没有为会话管理定义,因此这是不可能的:)

以上是关于并发会话管理总是重定向到 failureurl - Java Config的主要内容,如果未能解决你的问题,请参考以下文章

Grails Spring Security - 登录后总是重定向到特定页面?

如何在获取 post 调用后管理重定向请求

Spring Security 在新的应用程序启动时重定向到 invalid-session-url

启动从和管理员角色到客户端的重定向?

重定向后如何管理 JWT?

Spring Security:会话过期而不重定向到过期网址?