- 浏览: 193768 次
- 性别:
- 来自: 南京
文章分类
最新评论
前言:
在实际应用中,我们可能会限制一个用户同时登录同一个应用的次数。例如,我们希望系统中只有一个‘张三’能登录,从而阻止用户‘张三’利用两个不同的session进入我们的web应用中,为此spring security为我们提供了以下两种策略实现这个功能:
注意:当采用第二种方式时,如果一个用户没有明确的执行logout(例如用户直接关闭了浏览器),在这个用户的session没有过期前,他将不能再次登录系统
本示例采用第一种策略,设置最大并发登录次数为1
环境:
spring boot 版本:1.5.4.RELEASE
1.项目结构
2.配置类SecurityConfig.java
主要是追加了sessionManagement().maximumSessions(1).expiredUrl("/login?expired");这个配置,代表的意思是启用session控制,最大并发session数是1,当session过期后用户被重定向到 /login页面
3.启动类SecurityConcurrencyApp.java
4.项目pom文件
5.index页面
6.启动项目
选中启动类,选择 Run As->Java application,启动后在浏览器中输入
http://localhost:8080/index.html
正常情况下,我们会被重定向到login界面
输入用户名:user;密码:password,进入index页面
之后我们打开另一个浏览器(例如之前用safari,现在用chrome,或者在另一台电脑上打开浏览器),重新执行上面的登录步骤,当在新浏览器中进入index页面后,再回到之前的浏览器中执行刷新,会发现我们被重新定向到了登录页面,证明我们设定的并发登录控制起到了作用
下载源码
在实际应用中,我们可能会限制一个用户同时登录同一个应用的次数。例如,我们希望系统中只有一个‘张三’能登录,从而阻止用户‘张三’利用两个不同的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页面后,再回到之前的浏览器中执行刷新,会发现我们被重新定向到了登录页面,证明我们设定的并发登录控制起到了作用
下载源码
发表评论
-
spring-security(二十五)鉴权
2018-03-27 11:21 1597前言 本文将详细探讨spring security中的鉴权 ... -
test
2018-03-19 21:20 0什么是服务发现 ... -
spring-security(二十四)CSRF
2018-03-24 09:54 81561.什么是CSRF攻击 下面我们以一个具体的例子来说明这种常见 ... -
spring-security(二十三)Remember-Me认证
2018-03-09 21:06 1340前言: Remember-me认证方式指的是能在不同的会话 ... -
spring-security(二十二)基本认证和摘要认证
2018-03-06 16:58 1800前言: 在web应用中,非常流行以基本认证和摘要认证作为备 ... -
spring-security(二十一)核心Filter-UsernamePasswordAuthenticationFilter
2018-03-04 11:05 1236一、UsernamePasswordAuthenticatio ... -
spring-security(二十)核心Filter-SecurityContextPersistenceFilter
2018-02-28 21:40 1129一、SecurityContextPersistenceFil ... -
spring-security(十九)核心Filter-ExceptionTranslationFilter
2018-02-27 16:31 2058前言: 在spring的安全 ... -
spring-security(十八)核心Filter-FilterSecurityInterceptor
2018-02-25 10:59 2343前言: 当用spring secur ... -
spring-security(二十六)整合CAS 实现SSO
2018-04-05 18:09 12401.cas 认证流程 2.spring security ... -
spring-security(十七)Filter顺序及简介
2018-02-22 18:16 7899前言: spring security在 ... -
spring-security(十六)Filter配置原理
2018-02-21 15:18 2384前言: spring security最常见的应用场景还是 ... -
spring-security(十五) Password编码
2018-02-19 15:15 1224前言: 在实际应用中 ... -
spring-security(十四)UserDetailsService
2018-02-19 11:35 1470前言: 作为spring security的核心类,大多数 ... -
spring-security(十三)核心服务类
2018-02-18 16:46 1410前言: 在之前的篇章中我们已经讲述了spring secu ... -
spring-security(十二)鉴权方式概述
2018-02-18 10:42 2525前言: 本文主要讲述在spring security鉴权的 ... -
spring-security(十一)Web应用认证过程
2018-02-17 17:17 1235前言: 本文将探讨当 ... -
spring-security(十)基本认证过程
2018-02-17 13:55 2104前言: 在spring security中认证具体指的是什 ... -
spring-security(九)-核心组件
2018-02-17 10:46 867前言: 本文主要介绍在spring security中的几 ... -
spring-security(八)java config-sample之cas client
2018-02-16 11:26 2067前言: SSO英文全称Single Sign On,单点登 ...
相关推荐
`Java-concurrency-master.zip`这个压缩包很可能包含了关于Java并发编程的各种资料和示例,对于学习和理解Java并发机制非常有帮助。 Java并发主要包括以下几个核心知识点: 1. **线程**:Java通过`Thread`类来创建...
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**是一种广泛应用于Java企业级项目中的安全框架,它基于Spring AOP(面向切面编程)和Servlet过滤器来提供全面的安全解决方案。该框架能够在Web请求级别以及方法调用级别处理身份验证...
配置 - 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-...
至于文件`PabloSichert-concurrency-logger-59c2d94`,这看起来是`concurrency-logger`项目的一个特定版本或分支。通常,这样的文件名表示它是从Git仓库中克隆下来的,其中`PabloSichert`可能是作者或维护者的用户名...
《Java并发编程实践》是Java并发编程领域的一本经典著作,由Addison-Wesley于2006年出版。这本书深入浅出地探讨了Java平台上的多线程和并发编程,为开发者提供了实用的指导和最佳实践。下面将详细阐述其中的知识点。...
- `spring-security-config` - `spring-security-taglibs` 这些依赖可以通过Maven或Gradle进行管理,确保项目中已经正确配置了这些依赖。 ##### 2. Web.xml配置 为了使Spring Security能够在Web环境中正常工作,...
这份“java-concurrency编程内部分享”压缩包包含了关于Java并发编程的一份PPT,它可能涵盖了以下几个关键知识点: 1. **线程与进程**:首先,会讲解线程和进程的基本概念,它们的区别和联系。在Java中,线程是执行...
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-master"包含了该书中的源代码示例,这对于学习和实践书中理论提供了宝贵的资源。 在Java并发编程中,有几个核心概念和技术是必须掌握的: 1. **线程**:线程...
这里的"java_concurrency_in_practice_source"源代码正是书中实例的实现,它涵盖了Java多线程编程中的关键概念和技术。 1. **线程基础**:Java中创建线程有两种方式,一是通过`Thread`类的子类,二是实现`Runnable`...
<concurrency-control max-sessions="1" error-if-maximum-exceeded="true"/> <session-fixation-protection strategy="migrateSession"/> </session-management> <logout invalidate-session="true" logout-url...
《C++并发实战第二版》是一本深入探讨C++多线程编程的权威书籍,其电子版资源以Markdown格式提供。这本书由资深C++专家Anthony Williams撰写,详细讲解了C++11及后续版本中的并发编程特性,为开发者提供了丰富的实践...
官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装
开源项目-kevchn-go-concurrency-patterns.zip,Implementations of Golang Concurrency Patterns from Rob Pike's 2012 Talk
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 ...
在这个压缩包中,"The-Art-of-Java-Concurrency-Programming-master"是主目录,里面可能包含了书中各个章节的源代码、测试用例和其他相关材料。 在Java并发编程中,有几个核心知识点是必不可少的: 1. **线程基础*...
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™,...
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可以通过配置`<session-config>`元素或使用`HttpSessionEventPublisher`监听器来设置会话超时时间。 4. **会话并发控制** - 会话并发控制限制了同一用户在同一时间可以活跃的会话数量,防止会话...