在实际应用中,我们可能会限制一个用户同时登录同一个应用的次数。例如,我们希望系统中只有一个‘张三’能登录,从而阻止用户‘张三’利用两个不同的session进入我们的web应用中,为此spring security为我们提供了以下两种策略实现这个功能:
- 当同样的用户再次登录的时候,就将前一次登录过的session信息自动设置成过期
- 直接报出一个错误,提示用户已经登录,从而阻止本次登录
注意: 当采用第二种方式时,如果一个用户没有明确的执行logout(例如用户直接关闭了浏览器),在这个用户的session没有过期前,他将不能再次登录系统
本示例采用第一种策略,设置最大并发登录次数为1
环境:
spring boot 版本:1.5.4.RELEASE
1.项目结构
2.配置类SecurityConfig.java
package falcon.chengf.security.sample.javaconfig.concurrency; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; /** * @author: 作者: chengaofeng * @date: 创建时间:2018-02-15 10:33:55 * @Description: TODO * @version V1.0 */ @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { // @formatter:off @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth .inMemoryAuthentication() .withUser("user").password("password").roles("USER"); } // @formatter:on // @formatter:off @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .anyRequest().authenticated() .and() .formLogin() .and() .sessionManagement() .maximumSessions(1) .expiredUrl("/login?expired"); } // @formatter:on }
主要是追加了sessionManagement().maximumSessions(1).expiredUrl("/login?expired");这个配置,代表的意思是启用session控制,最大并发session数是1,当session过期后用户被重定向到 /login页面
3.启动类SecurityConcurrencyApp.java
package falcon.chengf.security.sample.javaconfig.concurrency; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * Hello world! * */ @SpringBootApplication public class SecurityConcurrencyApp { public static void main( String[] args ) { SpringApplication.run(SecurityConcurrencyApp.class, args); } }
4.项目pom文件
4.0.0 falcon.chengf security-sample-javaconfig-concurrency 0.0.1-SNAPSHOT jar security-sample-javaconfig-concurrency http://maven.apache.org UTF-8 org.springframework.boot spring-boot-starter-parent 1.5.4.RELEASE pom import junit junit test org.springframework.boot spring-boot-starter-web org.springframework.security spring-security-config org.springframework.security spring-security-web org.springframework spring-test org.springframework.boot spring-boot-maven-plugin repackage ${start-class}
5.index页面
Static hello,security
6.启动项目
选中启动类,选择 Run As->Java application,启动后在浏览器中输入
http://localhost:8080/index.html
正常情况下,我们会被重定向到login界面
输入用户名:user;密码:password,进入index页面
之后我们打开另一个浏览器(例如之前用safari,现在用chrome,或者在另一台电脑上打开浏览器),重新执行上面的登录步骤,当在新浏览器中进入index页面后,再回到之前的浏览器中执行刷新,会发现我们被重新定向到了登录页面,证明我们设定的并发登录控制起到了作用
下载源码