后端基于方法的权限控制--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("ROLETELLER","ROLEADMIN"), 该方法只允许 ROLETELLER 或 ROLEADMIN 角色的用户访问.
    @Secured("ISAUTHENTICATEDANONYMOUSLY"), 该方法允许匿名用户访问.

  2. JSR-205

    @DenyAll 注解, 拒绝所有的访问

    @PermitAll 注解, 运行所有访问

    @RolesAllowed({"USER","ADMIN"}), 该方法只允许有 ROLEUSER 或 ROLEADMIN 角色的用户访问.

  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)

转载于:https://juejin.im/post/5d499f5b518825053d34d756

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值