Spring与Shiro整合及加载权限表达式问题
作者:StanleyBlogs 发布时间:2023-10-01 09:29:50
如何加载权限表达式
我们在上章内容中画了一张图,里面有三个分项,用户 角色 权限;
那么接下来我们就要思考一个问题了,这三张表中的数据要从何而来呢?
用户表
首先先看用户表,用户表的数据库是从用户注册而来;
角色
角色的话肯定是我们手动去创建出来,但是我们在创建角色之前呢?是不是需要先有权限后才能去创建角色呢?因为角色是依赖于权限,只要先有了权限,我们就可以讲它们归类,分配给我们某一个角色;
所以我们的突破口就是,权限该如何去加载这个问题;
我们可以打开我们的Cotroller在接口上可以看到凡是带有Shiro注解的,都是需要有相对应的权限才可以访问的:
重新加载权限
那,问题就来了,我们如何将注解中的权限表达式(employee:edit)存入到数据库中呢?
我们在之前的操作中,是手动的将表达式复制粘贴到数据库中,也就是手动添加进去的,那你想一下,如果需要添加非常多的权限,我们还依然用手动的方式,显然非常麻烦!
那我们能不能想一种办法,就是让用户一点击或进入这个接口执行一个方法马上让它把所有Cotroller中的权限表达式给全部拿出来存入到数据库中;
能不能做到呢?
答案是可以的!
我们在页面上有一个功能是重新加载权限,这个意思就是我们点击后,你加下来的编码,给某给接口添加某项权限的时候,就会帮你把所有Cotrolle中的新添加的权限重新的保存到数据库中;
这个按钮就是一个Url,点击后就进入到了我们在Cotroller编写的接口方法中:
接下来,我们就来看下这个reload接口是如何编写的:
中间的部分就是获取权限表达式,画箭头的是调用了接j口执行的Sql保存操作也就是insert;
此次的接口是对象保存的方式,接口的具体编写也非常简单,其实就跟用户注册一样,将name(权限名称)resource(表达式)作为插入字段即可;
然后在方面结尾调用接口,需要传入一个对象,这个对象(Permisssion p )就是我们存进去的权限名称以及表达式对象;
具体Sql语句编写方式:
insert into permission (name,resource) values("permissionName","PermissionResource");
编写自定义注解来获取权限昵称
我们在reload接口中,拿到的仅仅都是表达式,和获取Requesmapping,但是我们在数据库中有一列是权限名称,因为光靠表达式并非知道它的中文意思,所以我们需要自定义注解,从而获取注解内部的中文诠释;
我们可以看到,这个注解是会报错的,因为这个注解并不是spring或java内置的,更不是第三方依赖的jar包,而是需要我们自定义,所以,自定义注解名字可以随便起,但是一定要有意义;
我们来看看自定义注解是如何创建的;
1.编写好自己的注解
就按照上图的例子我起的名字是@PermissionName;
2.创建一个注解在realm路径下(根据公司项目的结构定义)
注意,Kind:一定选择Annotation(自定义注解);Name可以随便起,但是一定要有意义,我这里直接叫PermissionName就好了;
我这里就把注解创建在realm目录下,因为毕竟这个也是Shiro的一部分,也可以将它放入到工具包下也可以,根据公司的项目结构来,如果这是一个新加入的功能,推荐放入realm包下,并在内打上注解介绍;
3.编写自定义注解类
该注解仅仅获取权限名称使用,以上结构写死即可;
解决重复插入问题(去重)
编写完成后,我们开始进入测试,我们来看看是否可以执行成功,将权限名称以及表达式保存进数据库中:
执行成功,以及加载了全部的权限列表,并且都保存至数据库中;
但是问题来了,如果我们再次点击加载权限列表会怎么样?
我们发现,重复添加了,这种情况在实际开发当中是绝对不允许的,如何解决呢?
去重操作
我们需要在PermissionController类中第0步,再添加一个功能,就是去重;
这个时候,我们需要去调用接口去数据库中查询一下,看看是否有重复,如果重复,我们就跳过,如果没重复,我们就保存进来;
1.我们编写获取所有员工权限的接口
/**
获取所有权限表达式
*/
List<String>getAllResources();
2.编写Sql
select resource From permission;
permission就是表,resource是其中的列(权限表达式);我们仅需获取这一个列即可
3.编写实现类
实现类就非常简单,掉Mapper层,执行sql,用集合接收,数据接收到后,直接retrun过去即可;
4.在Controller类中调用
画箭头就是新加入的内容,根据以上指引编写即可;
总结
以上所述是小编给大家介绍的Spring与Shiro整合及加载权限表达式问题网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
来源:https://www.cnblogs.com/StanleyBlogs/p/12061640.html


猜你喜欢
- 属性CascadeType.REFRESH:级联刷新,当多个用户同时作操作一个实体,为了用户取到的数据是实时的,在用实体中的数据之前就可以调
- 可以使用 Intent.createChooser() 的方法来创建 Intent,并传入想要的 Sting 作为标题。 以wallpape
- 在练习Java的Scanner时,EditPlus如何读取从键盘输入的数呢?例如如下程序,编译通过,运行时却输入不了数据:package m
- 最近的一个接口项目,传的参数要求是json,需要特殊处理一下。重点是这两句话:httpPost.setHeader("Conten
- springcloud eureka切换nacos配置中心地址: http://10.166.9.7:8848/nacos/bootstra
- RecyclerView上拉加载,先看效果:网上有很多这类得框架,不过在自己的项目只用到上拉加载的功能,所以自己封装一个简单点的。主要依赖B
- 作为Android的四大组件之一,ContentProvider作为进程之间静态数据传递的重要手段,其在系统级别的应用中起了重大的作用。毫无
- 关于unicode和utf的关系,可以简单的记忆:Unicode是一个编码组织、一个编码规范、在java中指utf-16;utf是Unico
- 前言 今天在看Android ContentProvider实现的时候,突然想到了Java类在new的过
- 在阎宏博士的《JAVA与模式》一书中开头是这样描述责任链(Chain of Responsibility)模式的:责任链模式是一种对象的行为
- Logback日志基础配置logback日志配置有很多介绍,但是有几个非常基础的,容易忽略的。下面是最简单的一个配置,注意加粗的描述<
- 本文实例讲述了Android返回键功能的实现方法。分享给大家供大家参考。具体如下:在开发android应用时,常常通过按返回键(即keyCo
- 一、泛型集合List<T>排序经sort方法之后,采用了升序的方式进行排列的。 List<int> list = n
- 前言:函数式编程是一种编程范式,其中程序是通过应用和组合函数来构造的。它是一种声明式编程范式,其中函数定义是表达式树,每个表达式树返回一个值
- 1. 前言我在Spring Security 实战干货:内置 Filter 全解析对Spring Security的内置过滤器进行了罗列,但
- 在java的开发中,java开发人员建议,尽量少用内部类,要把内部类提出他所处的那个类,单独生成一个类。直接来代码:package com.
- iOS中有封装好的选择图片后长按出现动画删除效果,效果如下 而Android找了很久都没有找到有这样效果的第三方组件,
- 前言:如果让大家说出一款国内比较热门的社交软件,那无疑就是QQ和微信了,说到微信,无不例外的会想到微信公众号和小程序,所以现在它们已经是很多
- 简介CAS的原理其实很简单,为了保证在多线程环境下我们的更新是符合预期的,或者说一个线程在更新某个对象的时候,没有其他的线程对该对象进行修改
- Spring Bean的生命周期?首先说一下Servlet的生命周期:实例化,初始init,接收请求service,销毁destroy;Sp