`

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

阅读更多
前言:
  在实际应用中,我们可能会限制一个用户同时登录同一个应用的次数。例如,我们希望系统中只有一个‘张三’能登录,从而阻止用户‘张三’利用两个不同的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文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>falcon.chengf</groupId>
	<artifactId>security-sample-javaconfig-concurrency</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>security-sample-javaconfig-concurrency</name>
	<url>http://maven.apache.org</url>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	</properties>

	<dependencyManagement>

		<dependencies>
			<dependency>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-starter-parent</artifactId>
				<version>1.5.4.RELEASE</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.security</groupId>
			<artifactId>spring-security-config</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.security</groupId>
			<artifactId>spring-security-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
		</dependency>
	</dependencies>
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<executions>
					<execution>
						<goals>
							<goal>repackage</goal>
						</goals>
					</execution>
				</executions>
				<configuration>
					<mainClass>${start-class}</mainClass>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>

5.index页面
<!DOCTYPE html>
<html>
<head>
<title>Static</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
	hello,security
</body>
</html>

6.启动项目
选中启动类,选择 Run As->Java application,启动后在浏览器中输入
http://localhost:8080/index.html
正常情况下,我们会被重定向到login界面



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


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

下载源码
  • 大小: 39.4 KB
  • 大小: 27.6 KB
  • 大小: 19.1 KB
分享到:
评论

相关推荐

    Java-concurrency-master.zip

    `Java-concurrency-master.zip`这个压缩包很可能包含了关于Java并发编程的各种资料和示例,对于学习和理解Java并发机制非常有帮助。 Java并发主要包括以下几个核心知识点: 1. **线程**:Java通过`Thread`类来创建...

    Java-Concurrency-Essentials

    Concurrency is always a challenge for developers and writing concurrent programs can be extremely hard. There is a number of things that could potentially blow up and the complexity of systems rises ...

    初识 Spring Security - v1.1.pdf

    **Spring Security**是一种广泛应用于Java企业级项目中的安全框架,它基于Spring AOP(面向切面编程)和Servlet过滤器来提供全面的安全解决方案。该框架能够在Web请求级别以及方法调用级别处理身份验证...

    spring security 参考手册中文版

    配置 - spring-security-config.jar 26 LDAP - spring-security-ldap.jar 26 ACL - spring-security-acl.jar 26 CAS - spring-security-cas.jar 26 OpenID - spring-security-openid.jar 26 测试 - spring-security-...

    Node.js-concurrency-loggerHTTP日志中间件

    至于文件`PabloSichert-concurrency-logger-59c2d94`,这看起来是`concurrency-logger`项目的一个特定版本或分支。通常,这样的文件名表示它是从Git仓库中克隆下来的,其中`PabloSichert`可能是作者或维护者的用户名...

    Java-Concurrency-in-Practice.rar

    《Java并发编程实践》是Java并发编程领域的一本经典著作,由Addison-Wesley于2006年出版。这本书深入浅出地探讨了Java平台上的多线程和并发编程,为开发者提供了实用的指导和最佳实践。下面将详细阐述其中的知识点。...

    spring security3配置

    - `spring-security-config` - `spring-security-taglibs` 这些依赖可以通过Maven或Gradle进行管理,确保项目中已经正确配置了这些依赖。 ##### 2. Web.xml配置 为了使Spring Security能够在Web环境中正常工作,...

    java-concurrency编程内部分享.zip_java-concurrency

    这份“java-concurrency编程内部分享”压缩包包含了关于Java并发编程的一份PPT,它可能涵盖了以下几个关键知识点: 1. **线程与进程**:首先,会讲解线程和进程的基本概念,它们的区别和联系。在Java中,线程是执行...

    Android代码-java-concurrency-patterns

    Java Concurrency Patterns and Features Concurrency Patterns and features found in Java, through multithreaded programming. Features: Threads and Runnables Locks Intrinsic Explicit Reentrant Read...

    the-art-of-java-concurrency-programming:Java并发编程的艺术原始代码

    压缩包文件"the-art-of-java-concurrency-programming-master"包含了该书中的源代码示例,这对于学习和实践书中理论提供了宝贵的资源。 在Java并发编程中,有几个核心概念和技术是必须掌握的: 1. **线程**:线程...

    java_concurrency_in_practice_source源代码

    这里的"java_concurrency_in_practice_source"源代码正是书中实例的实现,它涵盖了Java多线程编程中的关键概念和技术。 1. **线程基础**:Java中创建线程有两种方式,一是通过`Thread`类的子类,二是实现`Runnable`...

    Spring Security2中设置Cookie的保存时间

    &lt;concurrency-control max-sessions="1" error-if-maximum-exceeded="true"/&gt; &lt;session-fixation-protection strategy="migrateSession"/&gt; &lt;/session-management&gt; &lt;logout invalidate-session="true" logout-url...

    CPP-Concurrency-In-Action-2ed-2019-master.zip

    《C++并发实战第二版》是一本深入探讨C++多线程编程的权威书籍,其电子版资源以Markdown格式提供。这本书由资深C++专家Anthony Williams撰写,详细讲解了C++11及后续版本中的并发编程特性,为开发者提供了丰富的实践...

    python2-oslo-concurrency-3.25.1-1.el7.noarch.rpm

    官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装

    开源项目-kevchn-go-concurrency-patterns.zip

    开源项目-kevchn-go-concurrency-patterns.zip,Implementations of Golang Concurrency Patterns from Rob Pike's 2012 Talk

    Java 9 Concurrency Cookbook - Second Edition

    Java 9 Concurrency Cookbook - Second Edition by Javier Fernandez Gonzalez English | 25 Apr. 2017 | ASIN: B01KOG6V5M | 594 Pages | AZW3 | 4.11 MB Key Features Get detailed coverage of important ...

    java并发编程艺术源码-The-Art-of-Java-Concurrency-Programming:Java并发编程的艺术

    在这个压缩包中,"The-Art-of-Java-Concurrency-Programming-master"是主目录,里面可能包含了书中各个章节的源代码、测试用例和其他相关材料。 在Java并发编程中,有几个核心知识点是必不可少的: 1. **线程基础*...

    Core Java Volume II 最新第8版 part1全两卷 (附随书源码)

    For detailed coverage of XML processing, networking, databases, internationalization, security, advanced AWT/Swing, and other advanced features, look for the forthcoming eighth edition of Core Java™,...

    Java Concurrency in Practice JAVA并发编程实践(中英文版)

    Using the concurrency building blocks in java.util.concurrent Performance optimization dos and don'ts Testing concurrent programs Advanced topics such as atomic variables, nonblocking algorithms, ...

    spring security 3.x session-management 会话管理失效

    Spring Security可以通过配置`&lt;session-config&gt;`元素或使用`HttpSessionEventPublisher`监听器来设置会话超时时间。 4. **会话并发控制** - 会话并发控制限制了同一用户在同一时间可以活跃的会话数量,防止会话...

Global site tag (gtag.js) - Google Analytics