技术开发 频道

使用Spring Security保护Web应用的安全

  权限控制表达式

  有些情况下,对于某种资源的访问条件可能比较复杂,并不只是简单的要求当前用户具有某一个角色即可,而是由多种条件进行组合。权限控制表达式允许使用一种简单的语法来描述比较复杂的授权条件。Spring Security 内置了一些常用的表达式,包括 hasRole()用来判断当前用户是否具有某个角色,hasAnyRole()用来判断当前用户是否具备列表中的某个角色,以及 hasPermission()用来判断当前用户是否具备对某个领域对象的某些权限等。这些基本表达式可以通过 and和 or等组合起来,表示复杂的语义。当通过 启用了表达式支持之后,就可以在 元素的 access属性上使用表达式。

  表达式还可以用来对方法调用进行权限控制,主要是用在方法注解中。要启用 Spring Security 提供的方法注解,需要添加元素 。这几个方法注解分别是:

  @PreAuthorize:该注解用来确定一个方法是否应该被执行。该注解后面跟着的是一个表达式,如果表达式的值为真,则该方法会被执行。如 @PreAuthorize("hasRole('ROLE_USER')")就说明只有当前用户具有角色 ROLE_USER的时候才会执行。

  @PostAuthorize:该注解用来在方法执行完之后进行访问控制检查。

  @PostFilter:该注解用来对方法的返回结果进行过滤。从返回的集合中过滤掉表达式值为假的元素。如 @PostFilter("hasPermission(filterObject, 'read')")说明返回的结果中只保留当前用户有读权限的元素。

  @PreFilter:该注解用来对方法调用时的参数进行过滤。

  会话管理

  Spring Security 提供了对 HTTP 会话的管理功能。这些功能包括对会话超时的管理、防范会话设置攻击(Session fixation attack)和并发会话管理等。

  如果当前用户的会话因为超时而失效之后,如果用户继续使用此会话来访问,Spring Security 可以检测到这种情况,并跳转到适当的页面。只需要在 元素下添加 元素即可,属性 invalid-session-url指明了会话超时之后跳转到的 URL 地址。

  有些 Web 应用会把用户的会话标识符直接通过 URL 的参数来传递,并且在服务器端不进行验证,如用户访问的 URL 可能是 /myurl;jsessionid=xxx。攻击者可以用一个已知的会话标识符来构建一个 URL,并把此 URL 发给要攻击的对象。如果被攻击者访问这个 URL 并用自己的用户名登录成功之后,攻击者就可以利用这个已经通过认证的会话来访问被攻击者的数据。防范这种攻击的办法就是要求用户在做任何重要操作之前都重新认证。Spring Security 允许开发人员定制用户登录时对已有会话的处理,从而可以有效的防范这种攻击。通过 元素的属性 session-fixation-protection可以修改此行为。该属性的可选值有 migrateSession、newSession和 none。migrateSession是默认值。在这种情况下,每次用户登录都会创建一个新的会话,同时把之前会话的数据复制到新会话中。newSession表示的是只创建新的会话,而不复制数据。none表示的是保持之前的会话。

  在有些情况下,应用需要限定使用同一个用户名同时进行登录所产生的会话数目。比如有些应用可能要求每个用户在同一时间最多只能有一个会话。可以通过 元素的子元素 来限制每个用户的并发会话个数。如 就限定了每个用户在同一时间最多只能有两个会话。如果当前用户的会话数目已经达到上限,而用户又再次登录的话,默认的实现是使之前的会话失效。如果希望阻止后面的这次登录的话,可以设置属性 error-if-maximum-exceeded的值为 true。这样的话,后面的这次登录就会出错。只有当之前的会话失效之后,用户才能再次登录。

0
相关文章