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)编写相应的SessionController类。

@Controller

@RequestMapping(value="/login")

public class SessionController {

@RequestMapping("/session_error.action")

public ModelAndView  session_error(String id){

System.out.println("session_error:" + id);

ModelAndView  mv = new ModelAndView();

mv.setViewName("login/session_error");

return mv;

} 

}

(3)编写spring-security.xml中的session管理相关配置,同时增加相关的匿名访问控制支持。

(a)情况一:首先测试在session个数超过限制时不报错,而且没有配置invalid-session-url的情况。

 <!-- 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>

   <!-- 匿名访问 -->

   <sec:anonymous  enabled="true" granted-authority="ROLE_ANONYMOUS" />

   <sec:intercept-url pattern="/"  access="hasRole(‘ROLE_ANONYMOUS‘)  or hasRole(‘ROLE_USER‘)" />

   <sec:intercept-url pattern="/login/**"  access="hasRole(‘ROLE_ANONYMOUS‘)  or hasRole(‘ROLE_USER‘)" />

在浏览器1中登录成功。

然后在浏览器2中登录成功。

再返回到浏览器1中去点击一个链接。

可以看到先前已登录的浏览器1的登录失效过期了。

(b)情况二:再测试测试在session个数超过限制时不报错,而且配置了invalid-session-url的情况。

 <!-- 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>

在浏览器1中登录成功。

在浏览器2中登录成功。

再返回浏览器1,点击一个链接。

可以看到页面跳转到了invalid-session-url指定的URL,而不再是expired-url指定的URL。

(c)情况三:测试在session个数超过限制时报错的情况。此时是否指定invalid-session-url影响不大。

在使用form-login表单验证的情况下,都将跳转到form-login的属性authentication-failure-url指定的URL,如果没指定此URL,则跳转到该属性的默认值指定的URL。

<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="true"

 />

 </sec:session-management>

<sec:form-login login-page="/login/login_form.action"

      username-parameter="username"

      password-parameter="password"

      login-processing-url="/login/login_process.action"

      authentication-success-forward-url="/login/login_success.action"

      authentication-failure-url="/login/login_failed.action"

  />

在浏览器1中登录成功。

然后在浏览器2中登录。

此时跳转到了form-login的authentication-failure-url指定的URL。

(d)情况四:测试在session个数超过限制时报错的情况。在没有使用form-login表单认证的情况下,超过session个数限制时将跳转到session-manager的属性authentication-failure-url指定的URL。本次测试启用了HTTP basic 认证。

<!-- 登录相关页面 -->

 <!--

 <sec:form-login login-page="/login/login_form.action"

      username-parameter="username"

      password-parameter="password"

      login-processing-url="/login/login_process.action"

      authentication-success-forward-url="/login/login_success.action"

      authentication-failure-url="/login/login_failed.action"

  />

  -->

  <!-- HTTP Basic Authentication -->

 <sec:http-basic />

在浏览器1中登录成功。

在浏览器2中登录:

可以看到登录失败时页面跳转到了session-manager结点的属性authentication-failure-url指定的URL。

对上述四种情况下的测试情况,总结如下:

(1)Spring security的配置参数非常灵活多变,能够适应比较复杂的应用需求。

(2)配置参数过于灵活,实际应用时容易出错。

(3)本次测试基本验证了前一篇博客的内容。

时间: 2024-08-29 16:05:03

Spring Security应用开发(11) 并发控制之实践的相关文章

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" inv

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应用开发(09)密码错误次数限制

实现登录时密码错误次数限制功能,就是在登录界面中当用户提交了错误的密码时在数据库中记录下这个错误次数,直到错误次数达到指定次数时,锁定用户账户,此时即便输入正确的密码,也不能登录. 需要完成如下工作: (1)修改用户表users的结构,增加相关字段. (2)自定义实现UserDetailsService,用于加载额外的数据字段. (3)自定义实现AuthenticationProvider,用于捕获登录成功和失败的事件. (3)修改spring-security.xml文件,配置上述(2)和(3

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