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>
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。