读书人

SpringSecurity札记3-Securing Methods

发布时间: 2012-06-30 17:20:12 作者: rapoo

SpringSecurity笔记3-Securing Methods

????? SpringSecurity方法层安全基于SpringAOP技术,它有自己的@Secured注解,SpringSecurity支持四种方法层

的安全:

????? (1) Methods annotated with @Secured.

????? (2) Methods annotated with JSR-250's @RolesAllowed.

????? (3) Methods annotated with Spring's pre- and post-invocation annotations.

????? (4) Methods matching one or more explicitly declared pointcuts.

????? 启用方法层注解

????? <global-method-security secured-annotations="enabled" />

1. Securing methods with @Secured

??? @Secured({"ROLE_SPITTER", "ROLE_ADMIN"})
??? public void addSpittle(Spittle spittle) {
?????????? // ...
??? }

??? 示例说明:指认证的用户必须被授予"ROLE_SPITTER", "ROLE_ADMIN"其中的一个权限才能访问该方法;如果没

??? 有这两个中任何一个权限将抛出异常或是AuthenticationException or AccessDeniedException的子异常。如

??? 果方法被在Web请求中调用,异常将被SpringSecurity自动调用。

2. Using JSR-250's @RolesAllowed

??? <global-method-security jsr250-annotations="enabled" />

??? JSR-250's @RolesAllowed与secured-annotations可同时被启用,推荐使用该方式启用注解,因为他是Java的

??? 标准注解。

3. Pre-/Post-invocation security with SpEL

??? <global-method-security pre-post-annotations="enabled" />

??? 主要有四个:

??? (1) @PreAuthorized: 基于表达式的结果在调用方法前限制方法被访问。

??? @PreAuthorize("hasRole('ROLE_SPITTER')")
??????????? public void addSpittle(Spittle spittle) {
??????????? // ...
???? }

??? 拥有角色ROLE_SPITTER的用户可以访问addSpittle方法。

??? @PreAuthorize("(hasRole('ROLE_SPITTER') and #spittle.text.length() <= 140)
?????????? or hasRole('ROLE_PREMIUM')")
???? public void addSpittle(Spittle spittle) {
??????????????? // ...
??? }

??? 拥有角色ROLE_SPITTER的用户的参数spittle字符只能少于140ge,而拥有角色ROLE_PREMIUM的用户则不受

??? 此限制。

??? (2) @PostAuthorized: 如果表达式结果为false,允许方法被调用,同时抛出一个安全异常。

??? 该注解主要是基于被保护的方法的返回值来决定执行表达式,例如:

??? @PostAuthorize("returnObject.spitter.username == principal.username")
??? public Spittle getSpittleById(long id) {
????????? // ...
??? }

??? 当返回的Spittle对象属于被认证的用户时才可以访问该方法,本例中returnObject是SpringEL提供的一个name

??? 用于方便获取返回的对象,而principal是SpringSecuroty提供的用于代表被当前认证的用户。如果认证失败,则

??? AccessDeniedException异常将抛出。

??? (3) @PostFilter:允许一个方法被调用,但是用每一个表达式去过滤方法的结果。

??? (4) @PreFilter: 允许一个方法被调用,但是过滤在进如方法之前的输入。

4. 声明方法层的安全切点

??? 用于同时给多个方法添加安全:

??? <global-method-security>
??? <protect-pointcut access="ROLE_SPITTER"? expression=
????????????? "execution(@com.habuma.spitter.Sensitive * *.*(String))"/>
??? </global-method-security>

??? 该配置将识别任何拥有@Sensitive的方法,而access属性则指,认证的用户必须拥有的角色去访问表达式识别的

??? 方法。

读书人网 >软件架构设计

热点推荐