本文为转载学习
原文链接: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>
比较方法授权的类型:
以下这段话值得注意:
强烈建议在接口上声明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支持更复杂的表达式,包括含有方法参数的表达式。