范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

想要控制好权限,这八个注解你必须知道

  小伙伴们知道松哥最近在做 TienChin 项目,项目里涉及到一个问题,那就是数据权限过滤,有不少小伙伴对这个问题觉得特别迷,希望松哥松哥能整一篇文章讲讲,好吧,安排。
  在讲数据权限之前,我们有必要先和大家介绍一下 Spring Security 中的权限注解,把这个捋清楚了,再去看 TienChin 项目的权限注解,你就会发现非常容易了。  1. Spring Security 中的权限注解
  Spring Security 中支持多种权限注解,首先我们需要通过  @EnableGlobalMethodSecurity  注解开启权限注解的使用,方式如下: @Configuration @EnableGlobalMethodSecurity(prePostEnabled = true,securedEnabled = true, jsr250Enabled = true) public class SecurityConfig extends WebSecurityConfigurerAdapter { }
  在这个注解中我们一共设置了三个属性:  prePostEnabled :这个表示开启 Spring Security  提供的四个权限注解,@PostAuthorize 、@PostFilter 、@PreAuthorize  以及 @PreFilter ,这四个注解支持权限表达式,支持 SpEL,功能比较丰富。 securedEnabled :开启 Spring Security  提供的 @Secured  注解,该注解不支持权限表达式。 jsr250Enabled :开启 JSR-250  提供的注解,主要包括@DenyAll 、@PermitAll  以及 @RolesAllowed  三个注解,这些注解也不支持权限表达式。
  以上这些注解的含义分别如下:  @PostAuthorize :在目标方法执行之后进行权限校验。 @PostFilter :在目标方法执行之后对方法的返回结果进行过滤。 @PreAuthorize :在目标方法执行之前进行权限校验。 @PreFilter :在目标方法执行之前对方法参数进行过滤。 @Secured :访问目标方法必须具备相应的角色。 @DenyAll :拒绝所有访问。 @PermitAll :允许所有访问。 @RolesAllowed :访问目标方法必须具备相应的角色。
  这是所有的,当然一般来说我们只要设置  prePostEnabled=true  就够用了,也就是前四个注解基本上就能满足大部分需求了。
  另外还有一种比较"古老"的方法配置基于方法的权限管理,那就是通过 XML 文件配置方法拦截规则,目前已经很少有用 XML 文件来配置 Spring Security 了,所以对于这种方式我们不做过多介绍。感兴趣的小伙伴可以查看官网的相关介绍: https://docs.spring.io/spring-security/ site/docs/5.4.0/reference/html5/#secure-object-impls 。 2. 权限注解实践
  接下来我们通过几个简单的案例来学习一下上面几种不同注解的用法。
  首先创建一个 Spring Boot 项目,引入 Web 和 Spring Security 依赖,项目创建完成后,添加如下配置文件:  @EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true, jsr250Enabled = true) public class SecurityConfig{ }
  为了方便起见,我们将使用单元测试进行验证,所以这里就不进行额外的配置了,通过 @EnableGlobalMethodSecurity 注解开启其他权限注解的使用即可。
  接下来创建一个  User  类以备后续使用: public class User {     private Integer id;     private String username;      //省略getter/setter }
  准备工作完成后,我们来逐个讲解一下前面注解的用法。  2.1 @PreAuthorize
  @PreAuthorize  注解可以在目标方法执行之前对其进行安全校验,在安全校验时,可以直接使用权限表达式。例如可以定义如下方法: @Service public class HelloService {     @PreAuthorize("hasRole("ADMIN")")     public String hello() {         return "hello";     } }
  这里使用了权限表达式 hasRole,表示执行该方法必须具备 ADMIN 角色才可以访问,否则不可以访问。接下来我们在单元测试中来测试该方法:  @SpringBootTest class BasedOnMethodApplicationTests {     @Autowired     HelloService helloService;     @Test     @WithMockUser(roles = "ADMIN")     void preauthorizeTest01() {         String hello = helloService.hello();         assertNotNull(hello);         assertEquals("hello", hello);     } }
  通过  @WithMockUser(roles = "ADMIN")  注解设定当前执行的用户角色是 ADMIN,然后调用 helloService 中的方法进行测试即可。如果将用户角色设置为其他字符,那单元测试就不会通过。
  当然,这里除了 hasRole 表达式之外,也可以使用其他权限表达式,甚至也可以同时使用多个权限表达式,如下所示:  @Service public class HelloService {     @PreAuthorize("hasRole("ADMIN") and authentication.name=="javaboy"")     public String hello() {         return "hello";     } }
  表示访问者名称必须是 javaboy,而且还需要同时具备 ADMIN 角色,才可以访问该方法。此时通过如下代码对其进行测试:  @SpringBootTest class BasedOnMethodApplicationTests {     @Autowired     HelloService helloService;     @Test     @WithMockUser(roles = "ADMIN",username = "javaboy")     void preauthorizeTest01() {         String hello = helloService.hello();         assertNotNull(hello);         assertEquals("hello", hello);     } }
  在  @PreAuthorize  注解中,还可以通过 #  引用方法的参数,并对其进行校验,例如如下方法表示请求者的用户名必须等于方法参数 name 的值,方法才可以被执行: @PreAuthorize("authentication.name==#name") public String hello(String name) {     return "hello:" + name; }
  测试方法如下:  @Test @WithMockUser(username = "javaboy") void preauthorizeTest02() {     String hello = helloService.hello("javaboy");     assertNotNull(hello);     assertEquals("hello:javaboy", hello); }
  当模拟的用户名和方法参数相等时,单元测试就可以通过。  2.2 @PreFilter
  @PreFilter 主要是对方法的请求参数进行过滤,它里边包含了一个内置对象 filterObject 表示要过滤的参数,如果方法只有一个参数,则内置的 filterObject 对象就代表该参数;如果方法有多个参数,则需要通过 filterTarget 来指定 filterObject 到底代表哪个对象:  @PreFilter(value = "filterObject.id%2!=0",filterTarget = "users") public void addUsers(List users, Integer other) {     System.out.println("users = " + users); }
  上面代码表示对方法参数 users 进行过滤,将 id 为奇数的 user 保留。
  然后通过单元测试对该方法进行测试:  @Test @WithMockUser(username = "javaboy") void preFilterTest01() {     List users = new ArrayList<>();     for (int i = 0; i < 10; i++) {         users.add(new User(i, "javaboy:" + i));     }     helloService.addUsers(users, 99); }
  执行单元测试方法,addUsers 方法中只会打印出 id 为奇数的 user 对象。  2.3 @PostAuthorize
  @PostAuthorize  是在目标方法执行之后进行权限校验。可能有小伙伴会觉得奇怪,目标方法都执行完了才去做权限校验意义何在?其实这个主要是在 ACL 权限模型中会用到,目标方法执行完毕后,通过 @PostAuthorize 注解去校验目标方法的返回值是否满足相应的权限要求。
  不过呢,即使你的权限模型不是 ACL,也没关系,也有可能用到这个注解,反正记得它的作用:方法执行完成后,根据用户的权限信息过滤出需要返回给用户的数据。
  从技术角度来讲, @PostAuthorize  注解中也可以使用权限表达式,但是在实际开发中权限表达式一般都是结合 @PreAuthorize 注解一起使用的。@PostAuthorize 包含一个内置对象 returnObject,表示方法的返回值,开发者可以对返回值进行校验: @PostAuthorize("returnObject.id==1") public User getUserById(Integer id) {     return new User(id, "javaboy"); }
  这个表示方法返回的 user 对象的 id 必须为 1,调用才会顺利通过,否则就会抛出异常。
  然后通过单元测试对该方法进行测试:  @Test @WithMockUser(username = "javaboy") void postAuthorizeTest01() {     User user = helloService.getUserById(1);     assertNotNull(user);     assertEquals(1,user.getId());     assertEquals("javaboy",user.getUsername()); }
  如果调用时传入的参数为 1,单元测试就会顺利通过。  2.4 @PostFilter
  @PostFilter  注解是在目标方法执行之后,对目标方法的返回结果进行过滤,该注解中包含了一个内置对象 filterObject,表示目标方法返回的集合/数组中的具体元素: @PostFilter("filterObject.id%2==0") public List getAll() {     List users = new ArrayList<>();     for (int i = 0; i < 10; i++) {         users.add(new User(i, "javaboy:" + i));     }     return users; }
  这段代码表示 getAll 方法的返回值 users 集合中 user 对象的 id 必须为偶数。
  然后我们通过单元测试对其进行测试,代码如下:  @Test @WithMockUser(roles = "ADMIN") void postFilterTest01() {     List all = helloService.getAll();     assertNotNull(all);     assertEquals(5, all.size());     assertEquals(2,all.get(1).getId()); } 2.5 @Secured
  @Secured  注解也是 Spring Security  提供的权限注解,不同于前面四个注解,该注解不支持权限表达式,只能做一些简单的权限描述。 @Secured({"ROLE_ADMIN","ROLE_USER"}) public User getUserByUsername(String username) {     return new User(99, username); }
  这段代码表示用户需要具备 ROLE_ADMIN 或者 ROLE_USER 角色,才能访问 getUserByUsername 方法。
  然后我们通过单元测试对其进行测试,代码如下:  @Test @WithMockUser(roles = "ADMIN") void securedTest01() {     User user = helloService.getUserByUsername("javaboy");     assertNotNull(user);     assertEquals(99,user.getId());     assertEquals("javaboy", user.getUsername()); }
  注意,这里不需要给角色添加  ROLE_  前缀,系统会自动添加。 2.6 @DenyAll
  @DenyAll  是 JSR-250  提供的方法注解,看名字就知道这是拒绝所有访问: @DenyAll public String denyAll() {     return "DenyAll"; }
  然后我们通过单元测试对其进行测试,代码如下:  @Test @WithMockUser(username = "javaboy") void denyAllTest01() {     helloService.denyAll(); }
  在单元测试过程中,就会抛出异常。  2.7 @PermitAll
  @PermitAll  也是 JSR-250  提供的方法注解,看名字就知道这是允许所有访问: @PermitAll public String permitAll() {     return "PermitAll"; }
  然后我们通过单元测试对其进行测试,代码如下:  @Test @WithMockUser(username = "javaboy") void permitAllTest01() {     String s = helloService.permitAll();     assertNotNull(s);     assertEquals("PermitAll", s); } 2.8 @RolesAllowed
  @RolesAllowed 也是 JSR-250 提供的注解,可以添加在方法上或者类上,当添加在类上时,表示该注解对类中的所有方法生效;如果类上和方法上都有该注解,并且起冲突,则以方法上的注解为准。我们来看一个简单的案例:  @RolesAllowed({"ADMIN","USER"}) public String rolesAllowed() {     return "RolesAllowed"; }
  这个表示访问 rolesAllowed 方法需要具备 ADMIN 或者 USER 角色,然后我们通过单元测试对其进行测试,代码如下:  @Test @WithMockUser(roles = "ADMIN") void rolesAllowedTest01() {     String s = helloService.rolesAllowed();     assertNotNull(s);     assertEquals("RolesAllowed", s); }
  这就是常见的方法权限注解。
  好啦,今天就先和小伙伴们介绍这么多,下面文章我再和小伙伴们介绍这些注解在 TienChin 项目中的应用。
  原文链接:https://mp.weixin.qq.com/s/1NlWRwiBs8dl3Lu40haz5Q

EnclaveAudioCineHomePro追求高端体验的THX认证无线家庭影院EnclaveAudioCineHomePro是专门为追求高端家庭影院体验而不需要大型扬声器的用户设计的,并且它是真无线的影院系统。如果回音壁音响已经满足不了你的需求,那么你可以对CIT2021参展商巡礼赛万特(SAVANT)作为国内集家用与专业影音集成两者于一体的综合性大型展会,从2011年开始,CIT中国影音集成科技展已经成为影音集成行业的交流殿堂,拥有覆盖面广与行业性强的突出优势,面向范围囊括全宅让你的音响器材投资发挥最大价值意大利高级机架BAS(Bassocontinuo)莱雅Lyra2。1音响层架来自麦景图70周年金光闪闪套装用户的热烈好评,搭配套装的意大利Bassocontinuo(BAS)Cla科普AppleMusic无损音乐专题(2)前文回顾新鲜热辣的新版AppleMusic无损初体验(一)由于话题是从AppleMusic开始的,所以第一个要说的必定是AppleMusic。它在2015年推出,是Apple公司进绝佳的搭配,一听灵魂都酥了法国作曲家柏辽兹曾经写到萨克斯的主要特点是音色美妙变化,深沉而平静,富有感情,轻柔而忧伤,好像回声中的回声在寂静无声的时刻,没有任何别的乐器能发出这种奇妙的声响。萨克斯管不但能出色充满诚意的升级NADM17V2环绕声处理器M28多声道功率放大器在2015年的时候,我就写过NADM17M27的评论文章,它们就是今天主角M17V2M28的前身,是一套支持7。1声道环绕声处理能力的前后级AV功放。两代机型对比起来,虽然M17V天工盛世获委任成为LEAK(英国力克)中国总代理据天工盛世消息自2021年6月22日起,IAG先歌国际影音正式授权深圳市天工盛世科技有限公司为LEAK(英国力克)中国(不含港澳台)总代理,负责LEAK相关产品的推广销售及售后工作AUREA(奥睿)9。2。4全景声影院系统彰显兼容并蓄举重若轻的强者风范如果要评选五月底广州音响唱片展上视听效果最震撼的展厅,位于东方宾馆6楼会议室的圣谛展厅绝对榜上有名。展厅内搭建的是一套造价超百万的9。2。4全景声影院系统,选用三只AUREA17充先睹为快!(12)9。7。8声道造价250余万的James极品影院美国定制安装市场,Sonance和旗下品牌JamesLoudspeaker(简称James)都极具影响力。日前公布的2021CEPro100品牌分析报告中,它们几乎出现在了每个与音坚果投影参展UDE2021,超近距投影让美好生活近入想象2021年7月30日8月1日,UDE国际消费电子博览会将在上海新国际博览中心如期举行。坚果投影携带多款旗舰精品,将新世代家庭影院带到UDE2021。坚果投影是一家专业从事智能投影和CD已过时?连锁超市森宝利停售CD引发争议近日英国广播公司报道称,英国第二大连锁超市森宝利(Sainsburys)发出呼吁,要求停售光碟,并确认将很快下架其超市内的CD和DVD。不过考虑到黑胶唱片近年来不断复苏,因此该举措
138页K8S经典实战案例,图文细致代码可复制,进阶学习仅分享3天K8S是一个完备的分布式系统支撑平台,具有多种优质能力,同时K8S提供完善的管理工具,涵盖了包括开发部署运维在内的各个环节。在容器技术革命中,K8S俨然已是容器编排领域的王者,阿里一张思维导图囊括90Linux知识点,高清彩图,仅分享3天很多朋友在学习Linux的时候,都无从下手,不知道从哪学起,也不知道该学什么,今天给大家分享一份Linux思维导图,导图中的4个颜色分别着代表不同程度的学习重点红色需重点学习,常用一文详解HTTP,超强总结,值得收藏HTTP是什么?我们要打开一个网站的时候,只需要在浏览器地址栏,输入其域名就可以了,比如www。magedu。com但当我们打开网页时,却显示httpwww。magedu。com或VIM从入门到精通VIM命令操作手册!速速来领它来了,它来了,vim学习笔记和vim命令操作手册终于整理好了,有需要的小伙伴,可以来领取啦!Vim是从vi发展出来的一个文本编辑器。代码补完编译及错误跳转等方便编程的功能特别丰富一文讲透彻网络协议与管理,概念模型设备等全部包含,快拿走网络协议是网络运行的基石,也是计算机之间通信的准则,更是前后端开发必须掌握的知识点之一,因此了解网络协议与管理,对于IT行业从业人员来说有着莫大的好处。学习需要捷径,今天给大家分析计算机网络学不会?647页超全面计算机网络笔记,珍藏版干货满满不少朋友都反映计算机网络太难学,那么计算机网络为什么这么难学?一知识点太多。网络的构成就像一个社会,错综复杂,内容繁多二知识点乏味。知识点很无趣,理论过于抽象,不容易理解。但其实计这张思维导图,涵盖Python所有核心知识点,PDF赶快拿走这张Python思维导图,涵盖了所有的核心知识点,包括基础知识爬虫函数模块类和对象等,从以往假大空的知识堆砌转变为清晰实用的知识体系,十分适合初学者参考学习。讲解详细,十分高清,核膜拜!华为大牛总结的Linux学习笔记,超全面详细看这一篇就够了近年来,Linux系统已经不再局限于业内人士使用了,除了IT行业,也渗透到了其他领域,对于IT人员来说,光了解Linux基础是远远不够的,深层原理也要熟练掌握。今天给大家分享一份L最详细计算机网络学习笔记(有这一篇就够了)作为程序员的你,不管在从事开发还是运维,计算机网络的重要性绝对不亚于语言基础,毕竟平时开发和维护经常会和网络打交道。而计算机网络学习的核心内容就是网络协议的学习。特别是针对运维人员GPDPocket2掌上电脑,还是你钟情的那个7英寸设备为了适配宽屏视频的需求,现在的屏幕是越来越长,长宽比从最初的43一路演变成20。59,屏幕越来越长,而相同尺寸下,越长的屏幕其实有效显示面积是越小的,过长的样子也丧失了美感。权衡视工作一时爽,出门用GPDP2Max掌上电脑工作一直爽有那样一种人,他们喜欢工作,沉迷于工作中的挑战,他们工作时甚至有爽的感觉,他们时时刻刻带着他们的生产力工具笔记本电脑,他们是工作狂。但时刻带着硕大沉重的生产力工具真的是不爽,而一款