专注Java领域技术
我们一直在努力

学习服务器端方法级权限控制一文就够了(JSP-250,@Secured,支持表达式的注解)

原文始发于:学习服务器端方法级权限控制一文就够了(JSP-250,@Secured,支持表达式的注解)

在服务器端我们可以通过 Spring security 提供的注解对方法来进行权限控制。
Spring Security在方法的权限控制上支持三种类型的注解:JSR-250注解、@Secured注解和支持表达式的注解。

这三种注解默认都是没有启用的,需要单独通过global-method-security元素的对应属性进行启用

一、JSR-250 注解

1. 前期配置

(1)pom.xml 导入相关依赖

<dependency>             <groupId>javax.annotation</groupId>             <artifactId>jsr250-api</artifactId>             <version>1.0</version> </dependency> 

(2)在 spring-security.xml 开启该注解

<security:global-method-security jsr250-annotations="enabled" > </security:global-method-security> 

学习服务器端方法级权限控制一文就够了(JSP-250,@Secured,支持表达式的注解)
(3)在需要权限控制的方法上添加注解:

  • @RolesAllowed表示访问对应方法时所应该具有的角色
    @RolesAllowed({"USER","ADMIN"}) 该方法只要具有"USER","ADMIN"任意一种权限就可以访问。这里可以省略前缀ROLE_,实际的权限可能是ROLE_ADMIN

  • @PermitAll表示允许所有的角色进行访问,也就是说不进行权限控制

  • @DenyAll是和PermitAll相反的,表示无论什么角色都不能访问

2. 使用示例

现在这里的要求是只有具有 ADMIN 权限的用户才能查询产品信息
学习服务器端方法级权限控制一文就够了(JSP-250,@Secured,支持表达式的注解)
(1)可以看到用户 Jack 具备 ADMIN 权限所以可以查看产品信息
学习服务器端方法级权限控制一文就够了(JSP-250,@Secured,支持表达式的注解)

学习服务器端方法级权限控制一文就够了(JSP-250,@Secured,支持表达式的注解)
(2)Mark 不具备ADMIN 权限,访问产品信息时,会报403错误,提示权限不足
学习服务器端方法级权限控制一文就够了(JSP-250,@Secured,支持表达式的注解)
学习服务器端方法级权限控制一文就够了(JSP-250,@Secured,支持表达式的注解)

二、@Secured注解

该注解不需要额外导入pom.xml

(1)配置 spring-security.xml

 <!--开启 @Secured注解-->     <security:global-method-security secured-annotations="enabled" ></security:global-method-security> 

(2)具体使用
学习服务器端方法级权限控制一文就够了(JSP-250,@Secured,支持表达式的注解)
注意这里分配权限时,需要指定完整名称加入前缀 ROLE_,不能省略

三、支持表达式的注解

  • @PostAuthorize 允许方法调用,但是如果表达式计算结果为false,将抛出一个安全性异常
@PostAuthorize User getUser("returnObject.userId == authentication.principal.userId or hasPermission(returnObject, 'ADMIN')"); 
  • @PostFilter 允许方法调用,但必须按照表达式来过滤方法的结果
  • @PreFilter 允许方法调用,但必须在进入方法之前过滤输入值

这里拿 @PostAuthorize 举例讲解:

(1)spring-security.xml 开启注解

<!--开启支持表达式的注解-->     <security:global-method-security pre-post-annotations="enabled"> </security:global-method-security> 

(2)具体使用

学习服务器端方法级权限控制一文就够了(JSP-250,@Secured,支持表达式的注解)
(3)常用的内置表达式:

表达式 描述
hasRole([role]) 当前用户是否拥有指定角色。
hasAnyRole([role1,role2]) 多个角色是一个以逗号进行分隔的字符串。如果当前用户拥有指定角色中的任意一个则返回true。
hasAuthority([auth]) 等同于hasRole
hasAnyAuthority([auth1,auth2]) 等同于hasAnyRole
Principle 代表当前用户的principle对象
authentication 直接从SecurityContext获取的当前Authentication对象
permitAll 总是返回true,表示允许所有的
denyAll 总是返回false,表示拒绝所有的
isAnonymous() 当前用户是否是一个匿名用户
isRememberMe() 表示当前用户是否是通过Remember-Me自动登录的
isAuthenticated() 表示当前用户是否已经登录认证成功了。
isFullyAuthenticated() 如果当前用户既不是一个匿名用户,同时又不是通过Remember-Me自动登录的,则返回true。
赞(0) 打赏
未经允许不得转载:Java小咖秀 » 学习服务器端方法级权限控制一文就够了(JSP-250,@Secured,支持表达式的注解)
免责声明

抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

专注Java技术 100年

联系我们联系我们

你默默的关注就是最好的打赏~

支付宝扫一扫打赏

微信扫一扫打赏