Spring与Shiro整合 加载权限表达式

作者 : Stanley 罗昊

【转载请注明出处和署名,谢谢!】

如何加载权限表达式 

我们在上章内容中画了一张图,里面有三个分项,用户 角色 权限;

那么接下来我们就要思考一个问题了,这三张表中的数据要从何而来呢?

用户表

首先先看用户表,用户表的数据库是从用户注册而来;

角色

角色的话肯定是我们手动去创建出来,但是我们在创建角色之前呢?是不是需要先有权限后才能去创建角色呢?因为角色是依赖于权限,只要先有了权限,我们就可以讲它们归类,分配给我们某一个角色;

所以我们的突破口就是,权限该如何去加载这个问题;

我们可以打开我们的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整合 加载权限表达式的更多相关文章

  1. SpringBoot集成Shiro 实现动态加载权限

    一.前言 本文小编将基于 SpringBoot 集成 Shiro 实现动态uri权限,由前端vue在页面配置uri,Java后端动态刷新权限,不用重启项目,以及在页面分配给用户 角色 . 按钮 .ur ...

  2. shiro不重启动态加载权限

    最近一朋友让我帮他做一个后台权限管理的项目.我就在我原来的项目加加改改但是还是不理想,查了不少资料也走了不了弯路...... shiro基本的配置我就不多说了这个很简单自己查查资料就完成----下面是 ...

  3. Spring与Shiro整合 静态注解授权

    Spring与Shiro整合 静态注解授权 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 使用Shiro的种类 首先,Shiro的授权方式共有三种: 1.编程式授权(不推荐) 2. ...

  4. Spring Security实现基于RBAC的权限表达式动态访问控制

    昨天有个粉丝加了我,问我如何实现类似shiro的资源权限表达式的访问控制.我以前有一个小框架用的就是shiro,权限控制就用了资源权限表达式,所以这个东西对我不陌生,但是在Spring Securit ...

  5. Spring Boot的属性加载顺序

        伴随着团队的不断壮大,往往不需要开发人员知道测试或者生产环境的全部配置细节,比如数据库密码,帐号信息等.而是希望由运维或者指定的人员去维护配置信息,那么如果要修改某项配置信息,就不得不去修改项 ...

  6. 业务逻辑:五、完成认证用户的动态授权功能 六、完成Shiro整合Ehcache缓存权限数据

    一. 完成认证用户的动态授权功能 提示:根据当前认证用户查询数据库,获取其对应的权限,为其授权 操作步骤: 在realm的授权方法中通过使用principals对象获取到当前登录用户 创建一个授权信息 ...

  7. Spring源码剖析3:Spring IOC容器的加载过程

    本文转自五月的仓颉 https://www.cnblogs.com/xrq730 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https ...

  8. Spring Boot JPA 懒加载

    最近在使用spring jpa 的过程中经常遇到懒加载的错误:"` org.hibernate.LazyInitializationException: could not initiali ...

  9. 微服务架构 | *2.3 Spring Cloud 启动及加载配置文件源码分析(以 Nacos 为例)

    目录 前言 1. Spring Cloud 什么时候加载配置文件 2. 准备 Environment 配置环境 2.1 配置 Environment 环境 SpringApplication.prep ...

随机推荐

  1. 阿里云ECS服务器部署HADOOP集群(二):HBase完全分布式集群搭建(使用外置ZooKeeper)

    本篇将在阿里云ECS服务器部署HADOOP集群(一):Hadoop完全分布式集群环境搭建的基础上搭建,多添加了一个 datanode 节点 . 1 节点环境介绍: 1.1 环境介绍: 服务器:三台阿里 ...

  2. 移动端自动化测试Appium环境搭建(part1-2-3)

    Appium移动端自动化测试相信大家都不陌生,appium的铁哥们是selenium,不管是selenium还是appium,都是调用webdriver来做自动化测试.今天关于appium的介绍我们不 ...

  3. Yum —— CentOS 下包管理工具 学习笔记

    环境:CentOS 7 (阿里云服务器) 一.linux 发行版下的包管理阵营 包管理系统 除了方便你安装和管理包之外,还能帮你解决依赖问题. 下面就介绍2个最主要的: 1.Debian 系 - dp ...

  4. 生成Alpine LXC容器的根文件系统

    一个Alpine LXC容器的文件系统内容包括以下内容 根文件系统 应用程序,库文件以及配置文件 根文件系统主要包含alpine linux最小系统所需要的组件.下面主要讲一下制作根文件系统的方法. ...

  5. 提高PHP性能效率的几个技巧!

    如何提高效率问题,往往同样的功能,不一样的代码,出来的效率往往大不一样. ● 用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会,注意:只有ec ...

  6. Jenkins 实现前端自动打包,自动部署代码及邮件提醒功能

    在之前的公司,我们前端使用webpack构建项目,项目构建完成后,我们会使用ftp或linux的一些命令工具上传我们的文件到服务器上,这种方式虽然是可以,但是最近面试的时候,人家会问我前端如何部署项目 ...

  7. wordpress开源小程序

    wordpress多端开源小程序正式发布了,目前支持微信/QQ/百度/今日头条. 目前我们的开源小程序,已经建立了微信QQ交流群,需要的可以加下,微信添加hackdex(备注开源拉你入群),QQ群:7 ...

  8. [需求设计]从一个小需求感受Redis的独特魅力

    分享一个简单的小需求应该怎么设计实现以及有关Redis的使用 Redis在实际应用中使用的非常广泛,本篇文章就从一个简单的需求说起,为你讲述一个需求是如何从头到尾开始做的,又是如何一步步完善的.之前写 ...

  9. 关于JMeter原子性相关探究

    1.背景 最近宝路遇到个项目,在使用JMeter过程中引发了一些思考,宝路尝试用各种方式去验证,进而有了今天"JMeter原子性"相关主题. 2.目的 探究JMeter的事务的原子 ...

  10. U盘安装centos 7 提示 “Warning: /dev/root does not exist

    背景介绍:公司需要使用台式机安装Centos 7.5 系统,来部署一个测试的数据库,在安装Centos 7.5 系统的时候,使用U启安装,但有问题. 提示信息如下 如图:安装centos 7时提示 & ...