Spring Security如何对方法进行安全管理呢?

Java-教程王 SpringSecurity 发布时间:2021-08-06 15:08:57 阅读数:18018 1
我们都知道Spring Security可以对方法提供安全管理,那么它对方法进行安全管理采用的是何种技术呢?
下文将一一道来,如下所示:
实现原理:
    Spring Security对方法进行安全管理时,使用Spring AOP对方法进行功能扩展

实现思路:
    在Spring Security对方法进行注解添加
    <global-method-security secured-annotations="enabled" />
spring Security支持4种方法级别安全性的方法:
  1. 使用@Secured注解方法,这是spring自带的注解方法。@Secured("")内部的字符串不具有SpEL特性,只能是具体的权限
  2. 使用@JSR-250 @RelosAllowed注解的方法。作用和使用方法与@Secured一样,不同在于它不是spring框架的,所以可以做到和spring框架的解耦
  3. 使用Spring 方法调用前和调用后注解方法。这些方法支持SpEL
  4. 匹配一个或多个明确声明的切点方法

@Secured和 @RelosAllowed

@Secured("ROLE_ADMIN")
public void addUser(User user){
    ...  
}
@RolesAllowed("ROLE_ADMIN")
public void updateUser(User user){
    ...  
}

使用Spring 方法调用前和调用后注解方法

采用SpEL方法有四种
  1. @PreAuthorize: 在方法调用前,基于表达式计算结果来限制方法访问
  2. @PostAuthorize: 允许方法调用,但是如果表达式结果为fasle则抛出异常
  3. @PostFilter :允许方法调用,但必须按表达式过滤方法结果
  4. @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>

版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaFramework/SpringSecurity/202108/641.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者