spring-security(七)java config-sample之concurrency

阅读更多
前言:
  在实际应用中,我们可能会限制一个用户同时登录同一个应用的次数。例如,我们希望系统中只有一个‘张三’能登录,从而阻止用户‘张三’利用两个不同的session进入我们的web应用中,为此spring security为我们提供了以下两种策略实现这个功能:
  • 当同样的用户再次登录的时候,就将前一次登录过的session信息自动设置成过期
  • 直接报出一个错误,提示用户已经登录,从而阻止本次登录

注意: 当采用第二种方式时,如果一个用户没有明确的执行logout(例如用户直接关闭了浏览器),在这个用户的session没有过期前,他将不能再次登录系统
本示例采用第一种策略,设置最大并发登录次数为1
环境:
  spring boot 版本:1.5.4.RELEASE

1.项目结构

spring-security(七)java config-sample之concurrency_第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界面

spring-security(七)java config-sample之concurrency_第2张图片

输入用户名:user;密码:password,进入index页面


之后我们打开另一个浏览器(例如之前用safari,现在用chrome,或者在另一台电脑上打开浏览器),重新执行上面的登录步骤,当在新浏览器中进入index页面后,再回到之前的浏览器中执行刷新,会发现我们被重新定向到了登录页面,证明我们设定的并发登录控制起到了作用

下载源码
  • spring-security(七)java config-sample之concurrency_第3张图片
  • 大小: 39.4 KB
  • spring-security(七)java config-sample之concurrency_第4张图片
  • 大小: 27.6 KB
  • spring-security(七)java config-sample之concurrency_第5张图片
  • 大小: 19.1 KB
  • 查看图片附件

你可能感兴趣的:(security,spring)