• 后端基于方法的权限控制--Spirng-Security


    后端基于方法的权限控制--Spirng-Security
    默认情况下, Spring Security 并不启用方法级的安全管控. 启用方法级的管控后, 可以针对不同的方法通过注解设置不同的访问条件;Spring Security 支持三种方法级注解, 分别是 JSR-205/Secured 注解/prePostEnabled。

    开启方法级别注解
    
    <global-method-security secured-annotations="enabled" />
    
    <global-method-security jsr250-annotations="enabled" />
    
    <global-method-security pre-post-annotations="enabled" />
    
    
    //@Secured 注解
    @EnableGlobalMethodSecurity(securedEnabled=true)
    //JSR-205 注解
    @EnableGlobalMethodSecurity(jsr250Enabled=true)
    //@PreAuthorize 类型的注解(支持 Spring 表达式)
    @EnableGlobalMethodSecurity(prePostEnabled=true)
    
    开始方法级别的注释使用
    1. Secured
      只有满足角色的用户才能访问被注解的方法, 否则将会抛出 AccessDenied 异常.

      @Secured("ROLE_TELLER","ROLE_ADMIN"), 该方法只允许 ROLE_TELLER 或 ROLE_ADMIN 角色的用户访问.
      @Secured("IS_AUTHENTICATED_ANONYMOUSLY"), 该方法允许匿名用户访问.

    2. JSR-205

      @DenyAll 注解, 拒绝所有的访问
      @PermitAll 注解, 运行所有访问
      @RolesAllowed({"USER","ADMIN"}), 该方法只允许有 ROLE_USER 或 ROLE_ADMIN 角色的用户访问.

    3. PreAuthorize
      JSR-205 和 Secured 注解功能较弱, 不支持 Spring EL 表达式. 推荐使用 @PreAuthorize 类型的注解.

      @PreAuthorize 注解, 在方法调用之前, 基于表达式结果来限制方法的使用.
      @PostAuthorize 注解, 允许方法调用, 但是如果表达式结果为 false, 将抛出一个安全性异常.
      @PostFilter 注解, 允许方法调用, 但必要按照表达式来过滤方法的结果.
      @PreFilter 注解, 允许方法调用, 但必须在进入方法之前过来输入值.

    详解PreAuthorize表达式
    1. returnObject 保留名
      对于 @PostAuthorize 和 @PostFilter 注解, 可以在表达式中使用 returnObject 保留名, returnObject 代表着被注解方法的返回值, 我们可以使用 returnObject 保留名对注解方法的结果进行验证.
      比如:
    @PostAuthorize ("returnObject.owner == authentication.name")
    public Book getBook();
    

    @PostAuthorize 和 @PostFilter 本身在方法之后使用 ;本身使用场景不多

    1. 表达式中的 # 号
      在表达式中, 可以使用 #argument123 的形式来代表注解方法中的参数 argument123.
      比如:
    @PreAuthorize ("#book.owner == authentication.name")
    public void deleteBook(Book book);
    

    还有一种 #argument123 的写法, 即使用 Spring Security @P注解来为方法参数起别名, 然后在 @PreAuthorize 等注解表达式中使用该别名. 不推荐这种写法, 代码可读性较差.

    @PreAuthorize("#c.name == authentication.name")
    public void doSomething(@P("c") Contact contact);
    
    1. 内置表达式有:
    表达式 备注
    hasRole([role]) 如果有当前角色, 则返回 true(会自动加上 ROLE_ 前缀)
    hasAnyRole([role1, role2]) 如果有任一角色即可通过校验, 返回true,(会自动加上 ROLE_ 前缀)
    hasAuthority([authority]) 如果有指定权限, 则返回 true
    hasAnyAuthority([authority1, authority2]) 如果有任一指定权限, 则返回true
    principal 获取当前用户的 principal 主体对象
    authentication 获取当前用户的 authentication 对象,
    permitAll 总是返回 true, 表示全部允许
    denyAll 总是返回 false, 代表全部拒绝
    isAnonymous() 如果是匿名访问, 返回true
    isRememberMe() 如果是remember-me 自动认证, 则返回 true
    isAuthenticated() 如果不是匿名访问, 则返回true
    isFullAuthenticated() 如果不是匿名访问或remember-me认证登陆, 则返回true
    hasPermission(Object target, Object permission)
    hasPermission(Object target, String targetType, Object permission)
  • 相关阅读:
    c#基础加强版之方法控制流复习-3控制台打印密码
    c#基础加强版之方法控制流复习-2变量是否初始化的问题
    c#基础加强版之方法控制流复习-1关于方法的讲解
    小菜学try语句,又被trouble给catch住了
    JQuery--CSS操作
    JavaScript--DOM操作
    JavaScript--选择器
    JQuery--jQuery对象与DOM对象
    JavaScript--DOM编程
    JDBC--调用函数&存错过程
  • 原文地址:https://www.cnblogs.com/weir110/p/11312598.html
Copyright © 2020-2023  润新知