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

 更新时间:2019年12月19日 13:27:15   作者:StanleyBlogs  
这篇文章主要介绍了Spring与Shiro整合及加载权限表达式问题,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

如何加载权限表达式

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

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

用户表

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

角色

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

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

我们可以打开我们的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整合及加载权限表达式问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

相关文章

  • Java8 Lamdba函数式推导

    Java8 Lamdba函数式推导

    这篇文章主要介绍了Java8 Lamdba函数式推导,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • java8如何用Stream查List对象某属性是否有重复

    java8如何用Stream查List对象某属性是否有重复

    这篇文章主要介绍了java8如何用Stream查List对象某属性是否有重复的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • 关于报错IDEA Terminated with exit code 1的解决方法

    关于报错IDEA Terminated with exit code 

    如果在IDEA构建项目时遇到下面这样的报错IDEA Terminated with exit code 1,那必然是Maven的设置参数重置了,导致下载错误引起的,本文给大家分享两种解决方法,需要的朋友可以参考下
    2022-08-08
  • java线程并发countdownlatch类使用示例

    java线程并发countdownlatch类使用示例

    javar的CountDownLatch是个计数器,它有一个初始数,等待这个计数器的线程必须等到计数器倒数到零时才可继续。
    2014-01-01
  • Java内存释放实现代码案例

    Java内存释放实现代码案例

    这篇文章主要介绍了Java内存释放实现代码案例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-12-12
  • Mybatis-plus与Mybatis依赖冲突问题解决方法

    Mybatis-plus与Mybatis依赖冲突问题解决方法

    ,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧这篇文章主要介绍了Mybatis-plus与Mybatis依赖冲突问题解决方法
    2021-04-04
  • Java DOM4J方式生成XML的方法

    Java DOM4J方式生成XML的方法

    今天小编就为大家分享一篇Java DOM4J方式生成XML的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • SpringBoot中application.properties与application.yml区别小结

    SpringBoot中application.properties与application.yml区别小结

    本文主要介绍了SpringBoot中application.properties与application.yml区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-10-10
  • java的内部类和外部类用法讲解

    java的内部类和外部类用法讲解

    本文详细讲解了java的内部类和外部类用法,文中通过示例代码介绍的非常详细。对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • Java 内部类的定义与范例

    Java 内部类的定义与范例

    说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉。原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法。今天我们就来一探究竟
    2021-11-11

最新评论