Spring Security如何对方法进行安全管理呢?
我们都知道Spring Security可以对方法提供安全管理,那么它对方法进行安全管理采用的是何种技术呢?
下文将一一道来,如下所示:
配置如下
下文将一一道来,如下所示:
实现原理:
Spring Security对方法进行安全管理时,使用Spring AOP对方法进行功能扩展
实现思路:
在Spring Security对方法进行注解添加
<global-method-security secured-annotations="enabled" />
spring Security支持4种方法级别安全性的方法:
- 使用@Secured注解方法,这是spring自带的注解方法。@Secured("")内部的字符串不具有SpEL特性,只能是具体的权限
- 使用@JSR-250 @RelosAllowed注解的方法。作用和使用方法与@Secured一样,不同在于它不是spring框架的,所以可以做到和spring框架的解耦
- 使用Spring 方法调用前和调用后注解方法。这些方法支持SpEL
- 匹配一个或多个明确声明的切点方法
@Secured和 @RelosAllowed
@Secured("ROLE_ADMIN")
public void addUser(User user){
...
}
@RolesAllowed("ROLE_ADMIN")
public void updateUser(User user){
...
}
使用Spring 方法调用前和调用后注解方法
采用SpEL方法有四种- @PreAuthorize: 在方法调用前,基于表达式计算结果来限制方法访问
- @PostAuthorize: 允许方法调用,但是如果表达式结果为fasle则抛出异常
- @PostFilter :允许方法调用,但必须按表达式过滤方法结果
- @PreFilter:允许方法调用,但必须在进入方法前过滤输入值
@PreAuthorize("hasRole('ROLE_ADMIN')")
public void addUser(User user){
//当拥有角色ROLE_ADMIN时,则可访问此方法
....
}
//returnObject可以获取返回对象user,判断user属性username是否和访问该方法的用户对象的用户名一样。不一样则抛出异常。
@PostAuthorize("returnObject.user.username==principal.username")
public User getUser(int userId){
//允许进入
...
return user;
}
//将结果过滤,即选出性别为男的用户
@PostFilter("returnObject.user.sex=='男' ")
public list<User> getUserList(){
//允许进入
...
return user;
}
匹配一个或多个明确声明的切点方法
为多个方法设置相同的授权检查,spring security提供了 <protect-pointcut>元素配置如下
<global-method-security secured-annotations="enabled" >
<protect-pointcut access="ROLE_ADMIN" expression="execution(@com.securitytest.service.UserService**.*(String)"
</global-method-security>
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


