目录
SpringSecurity方法级安全
/    

SpringSecurity方法级安全

SpringSecurity方法级安全

摘抄自知乎地址:https://zhuanlan.zhihu.com/p/146155314

@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true, jsr250Enabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
  
}
  1. securedEnabled: 确定@Secured注解是否启用 --- 安全注解

    • @secured注解是用来定义业务方法的安全配置。在需要安全【角色/权限】的方法上指定@Secured,并且只有那些角色/权限的用户才能调用该方法

    • @Secured缺点 就是不支持Spring EL表达式。不够灵活。并且指定的角色 必须以ROLE_开头,不可省略。

      public interface UserService {
          List<User> findAllUsers();
      
          @Secured({"ROLE_user"})
          void updateUser(User user);
      
          @Secured({"ROLE_admin", "ROLE_user1"})
          void deleteUser();
      }
      
  2. jsr250Enabled: 确定@RolesAllowed... 是否启用 --- JSR-250注解

    • @DenyAll:拒绝所有访问
    • @RolesAllowed({"user", "admin"}):该方法只要具有user,admin任意一种权限就可以访问,这里可以省略ROLE_,实际的权限可能是ROLE_USER
    • @PermitAll:允许所有访问。
  3. prePostEnabled: 确定 前置注解 @PreAuthorize、@PostAuthorize,...]是否启用

    该注解更适合方法级的安全,也支持Spring 表达式语言,提供了基于表达式的访问控制

    // 只能user角色可以访问
    @PreAuthorize ("hasAnyRole('user')")
    // user 角色或者 admin 角色都可访问
    @PreAuthorize ("hasAnyRole('user') or hasAnyRole('admin')")
    // 同时拥有 user 和 admin 角色才能访问
    @PreAuthorize ("hasAnyRole('user') and hasAnyRole('admin')")
    // 限制只能查询 id 小于 10 的用户
    @PreAuthorize("#id < 10")
    User findById(int id);
    
    // 只能查询自己的信息
     @PreAuthorize("principal.username.equals(#username)")
    User find(String username);
    
    // 限制只能新增用户名称为abc的用户
    @PreAuthorize("#user.name.equals('abc')")
    void add(User user)
    
    • @PreAuthorize在方法调用之前,基于表达式的计算结果来限制对方法的访问
    • @PostAuthorize允许方法调用,但如果表达式计算结果为false,将抛出一个安全性异常。
    • @PostFilter 允许方法调用,但必须按照表达式来过滤方法的结果
    • @PreFilter 允许方法调用,但必须在进入方法之前过滤输入值。

同一应用程序中,可以启动多个类型的注解。但是只应该设置一个注解对于行为类的接口或类


标题:SpringSecurity方法级安全
作者:gitsilence
地址:https://blog.lacknb.cn/articles/2020/11/18/1605687334324.html