Spring Security应用开发(10) 并发控制之基本介绍

同一个用户使用不同的浏览器登录,将会导致什么结果呢?Spring Security提供了多种选项。

<!-- session管理 -->

 <sec:session-management

  session-fixation-protection="changeSessionId"

  session-authentication-error-url="/login/session_error.action?id=max_session_error"

  invalid-session-url="/login/session_error.action?id=invalid_session_error"

  >

 <sec:concurrency-control  

   max-sessions="1"

   expired-url="/login/session_error.action?id=session_expired_error"

   error-if-maximum-exceeded="false"

 />

 </sec:session-management>

session-management配置的最终效果受到session-fixation-protection属性和max-sessions属性以及error-if-maximum-exceeded属性的共同影响。

(1)对于session-management标签的session-fixation-protection属性,Eclipse给出的API DOC信息如下:

Attribute : session-fixation-protection

Indicates how session fixation protection will be applied when a user authenticates. If set to

"none", no protection will be applied. "newSession" will create a new empty session, with only

Spring Security-related attributes migrated. "migrateSession" will create a new session and copy

all session attributes to the new session. In Servlet 3.1 (Java EE 7) and newer containers,

specifying "changeSessionId" will keep the existing session and use the container-supplied

session fixation protection (HttpServletRequest#changeSessionId()). Defaults to

"changeSessionId" in Servlet 3.1 and newer containers, "migrateSession" in older containers.

Throws an exception if "changeSessionId" is used in older containers.

session-fixation-protection属性有4个可能的值用来控制用户在登录前后的session特征。

(a)none:不进行Session fixation固化保护。

(b)newSession:创建新的session,仅仅Spring Security相关的属性会迁移到新的session。

(c)migrateSession:创建新的session,所有属性会迁移到新的session。

(d)changeSessionId:保留登录之前的session不变。

(2)max-sessions属性控制同一个用户的最多的session个数,当为1时,只能某个浏览器上处于已登录状态。当为-1时表示不受限制。

(3)error-if-maximum-exceeded属性控制是否在用户的已登录session的个数超出max-sessions时报告错误。

true:该用户已登录的session个数超出时报告错误导致登录失败,跳转到

session-authentication-error-url指定URL。

false:超出时不报告错误,但是会导致之前已经登录的session失效过期,之前已经登录的session在做任何页面跳转操作时会跳转到expired-url指定的URL。

API DOC原文如下:

Specifies that an unauthorized error should be reported when a user attempts to login when they

already have the maximum configured sessions open. The default behaviour is to expire the original session. If the session-authentication-error-url attribute is set on the session-management URL, the user will be redirected to this URL

(4)invalid-session-url。

在设置了此属性的情况下,在用户先前的登录session被后面的登录session挤掉之后,先前的session无效了。此时在先前登录的浏览器中进行页面跳转操作时,将会跳转到invalid-session-url指定的URL。

(5)session-authentication-error-url。在error-if-maximum-exceeded为true时,如果session个数超出限制则使用此URL来报告错误。但是,如果form-login结点配置了authentication-failure-url这个属性,则会以form-login结点的配置为准。

(6)expired-url。

用于控制在登录session被后来的登录session挤掉后,再在先登录session中进行页面跳转时,将跳转到expired-url指定的URL。

使用过程中发现如下现象:

在设置了invalid-session-url时,没发现跳转到此URL的情况,在再次登录时都是跳转到了invalid-session-url。在没有设置invalid-session-url时,才跳转到expired-url。

API DOC:

The URL a user will be redirected to if they attempt to use a session which has been "expired"

because they have logged in again.

时间: 2024-08-27 21:25:15

Spring Security应用开发(10) 并发控制之基本介绍的相关文章

Spring Security应用开发(11) 并发控制之实践

本文分别介绍了四种不同情况下,Spring Security的Session管理和并发控制的不同配置的配置方法,以及所产生的效果. (1)首先编写了session_error.jsp页面,用于展示session相关错误信息. 错误信息通过页面参数id传入. <p>Session Error:${param.id }</p> <p>${SPRING_SECURITY_LAST_EXCEPTION.message}</p> (2)编写相应的SessionCont

Spring Security OAuth2 开发指南。

官方原文:http://projects.spring.io/spring-security-oauth/docs/oauth2.html 翻译及修改补充:Alex Liao. Spring OAuth2.0 提供者实现原理: Spring OAuth2.0提供者实际上分为: 授权服务 Authorization Service. 资源服务 Resource Service. 虽然这两个提供者有时候可能存在同一个应用程序中,但在Spring Security OAuth中你可以把 他它们各自放在

Spring Security 4.2.10 过滤器顺序

spring security 的版本为4.2.10.文档章节13.3.文档原文 无论是否使用这些过滤器,总的顺序如下: 顺序 名称 功能 1 ChannelProcessingFilter 可根据配置进行协议的重定向(HTTP与HTTPS) 2 SecurityContextPersistenceFilter 针对每个web请求开始时加载SecurityContext,并在web请求结束时将SecurityContext保存到HttpSession中 3 ConcurrentSessionFi

Spring Security应用开发(16)基于表达式的访问控制

1.1.1. 通用表达式 Spring Security 使用基于Spring EL的表达式来进行访问控制.内置的表达式如下表所示: 表达式 描述 hasRole(role) 当前主体(principal)是否支持role角色.支持则返回true hasAnyRole(role1,role2) 当前主体是否支持role1,role2中的任意一个角色. hasAuthority(authority) 跟hasRole(role)相似. hasAnyAuthority(authority1,auth

Spring Security应用开发(19)基于方法的授权(三)AOP

本文介绍使用AOP的配置方式来实现基于方法的授权. (1)首先使用Spring Security提供的protect-pointcut进行配置. protect-pointcut结点配置访问符合指定条件的方法锁需要的角色列表. <!-- 使用AOP的方式来定义方法级别的访问控制 --> <sec:global-method-security> <sec:protect-pointcut access="ROLE_USER,ROLE_ADMIN" expre

Spring Security应用开发(21)基于方法的授权(五)使用@Secured注解

Spring Security提供了@Secured注解来实现基于方法的授权控制. @Secured注解可以指定一个字符串数组参数作为value的值,表示当前用户具备这些角色中的任何一个角色即可满足授权条件. (1)启用@Secured注解. <sec:global-method-security secured-annotations="enabled" /> (2)使用Secured注解. //getUserByName()方法可以被具备ROLE_ADMIN或者ROLE

Spring Security应用开发(17)基于方法的授权(一)评估

Spring Security提供了4个用于方法的注解: @PreAuthorize.@PostAuthorize.@PreFilter和@PostFilter.本文介绍前面2个注解. @PreAuthorize 使用Spring Security的表达式来在方法执行之前控制允许执行某个方法. 如果表达式评估结果为false,则该方法不会被执行.@PreAuthorize的表达式通常是对方法的参数进行检查. @PostAuthorize 使用Spring Security的表达式在方法执行之后控

Spring Security应用开发(20)基于方法的授权(四)使用@RolesAllowed注解

Spring Security还提供了一种基于注解的方式来实现基于方法的授权.这就是本文介绍的@RolesAllowed注解.@RolesAllowed是JSR250定义的注解. (1)在spring-security.xml文件中启用JSR250注解支持. <!-- 启用JSR250支持:@RolesAllowed注解 --> <sec:global-method-security jsr250-annotations="enabled" /> (2)在需要授

Spring Security应用开发(05)自定义表单认证

Spring Security自动产生的登录页面非常简陋,但是Spring Security提供了丰富的自定义功能. 1.1.1. 密码摘要处理 数据库中的密码字段可以使用SHA摘要算法处理后再保存,而不是以明文保存. mysql> select * from users; +----------+----------+---------+ | username | password | enabled | +----------+----------+---------+ | lisi | 1