spring security3.x学习(21)_关于方法过滤

本文为转载学习

原文链接:http://blog.csdn.net/dsundsun/article/details/11946949

@RolesAllowed("ROLE_USER")

public void changePassword(String username, String password); 

@RolesAllowed({"ROLE_USER","ROLE_ADMIN"})
public void changePassword(String username, String password);

"正如我们可能推断出的那样,@RolesAllowed注解并不支持SpEL 表达式。

"JSR-250还有两个其它的注解:@PermitAll 和@DenyAll。它们的功能正如你所预想的,允许和禁止对方法的任何请求。

在看一下@Secured注解实现方法安全:

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

因为@Secured与JSR标准的@RolesAllowed注解在功能上一致,所以并没有充分的理由在新代码中使用它,但是它能够在Spring的遗留代码中运行

还有一种,AOP技术:

实现方法安全的最后一项技术也可能是最强大的方法,它还有一个好处是不需要修改源代码。作为替代,它使用面向方面的编程方式为一个方法或方法集合声明切点(pointcut),而增强(advice)会在切点匹配的情况下进行基于角色的安全检查。AOP的声明只在Spring Security的XML配置文件中并不涉及任何的注解。 

<global-method-security>
  <protect-pointcut access="ROLE_ADMIN" expression="execution(* com.packtpub.springsecurity.service.IUserService.*(..))"/> 
  <protect-pointcut access="ROLE_ADMIN" expression="execution(* com.packtpub.springsecurity.service.I*Service.*(..))"/>
</global-method-security>

比较方法授权的类型:

spring security3.x学习(21)_关于方法过滤_第1张图片

以下这段话值得注意:

强烈建议在接口上声明AOP规则(以及其它的安全注解),而不是在实现类上。使用类(通过Spring的CGLIB代理)进行声明可能会导致应用出现不可预知的行为改变,通常在正确性方面比不上在接口定义安全声明(通过AOP)。

spring security还提供了一种方式:

xmlns:security="http://www.springframework.org/schema/security"(声明)
<bean id="userService" class="com.packtpub.springsecurity.service.UserServiceImpl">
  <security:intercept-methods>
    <security:protect access="ROLE_USER" method="changePassword"/>
  </security:intercept-methods>
</bean>

这种方式可以在配置文件上直接指定哪个方法需要哪个属性,不过书中这样描述它:

尽管阅读起来很容易,但是这种方式的方法安全声明在表现性上不如切点,在功能上不如我们已经见过的注解方式。但是,对于一定类型的工程,使用XML声明的方式足以满足你的需求。

可以使用简单的通配符来注明方法名,如,我们可以用如下的方式保护给定bean里所有的set方法:

<security:intercept-methods>
  <security:protect access="ROLE_USER" method="set*"/>
</security:intercept-methods>

方法名匹配可以包含前面或后面的正则表达式匹配符(*)。这个符号的存在意味着要对方法名进行通配符匹配,为所有匹配该正则表达式的方法添加拦截器。注意,其它常用的正则表达式操作符(如?或[)并不支持。请查阅相关的Java 文档以理解基本的正则表达式。更复杂的通配符匹配或正则匹配并不支持。

@PreAuthorize("#username == principal.username and hasRole('ROLE_USER')")
public void changePassword(String username, String password);

“Spring Security方法注解所绑定的SpEL支持更复杂的表达式,包括含有方法参数的表达式。



你可能感兴趣的:(SpringSecurity)