131

如何基于shiro实现权限管理开发(实战篇)? - 恒生技术之眼 - 恒生研究院

 6 years ago
source link: http://rdc.hundsun.com/portal/article/841.html?
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

如何基于shiro实现权限管理开发(实战篇)?

上篇文章,我们主要介绍了关于权限管理的基础知识和实现权限管理的解决方案--轻量级安全框架SHIRO的介绍(请戳蓝色链接:如何基于shiro实现权限管理开发(入门篇)?),本篇文章我们主要以实战模式介绍如何基于shiro从认证到授权的权限管理开发实现。

了解完了权限的基本知识和shiro的总体结构设计,我们就可以来使用一下shiro框架,因为篇幅有限,下面会抽取部分关键代码来做示例讲解,完整的工程和使用文档已上传到网上,可以自行下载来阅读和使用。

【认证】

认证流程

f_f2b24d0fe85a1f6eb987de0951726455.png

认证,我们可以简答的理解为这就是一个用户登录的过程。

认证代码

核心的认证和授权操作,我们只需要继承shiro的AuthorizingRealm,重写里面的doGetAuthenticationInfo和doGetAuthorizationInfo方法,也就是获取认证信息和权限信息的两个方法。

认证的示例代码如下:

f_9e7ba15ecb6098a861ddd42fe148c156.png

Realm在之前也有过介绍,是我们获取权限信息的地方,这个来源由很多种,最常见的就是从数据库中读取用户的身份信息和权限信息进行校验。 

接口中传入的参数token,我们可以从里面取出凭证信息,也就是之前提到过principal这个概念,它是一个可以唯一代表用户的一个标识,就像我们的身份证号,也可能是系统里的userId之类的信息。我们拿到了这个userId后,就可以去数据库里查出来用户真实的密码,全部塞入info中返回给shiro,框架会自己在内部,对realm提供的password和用户传入的password进行比对,若一致则认证通过,可以开始访问系统的资源了。

【授权】

授权流程

f_18e0e36545cbcd8bfdfe9e542b51c524.png

定义权限
采用适当的权限模型后,我们还需要做一件事情,就是让shiro知道我们需要的那些权限,shiro这边采用的定义权限的方式,是通过一个“权限字符串”来声明的,权限字符串的规则是:“资源标识符:操作:资源实例标识符”,意思是对哪个资源的哪个实例具有什么操作,“:”是资源/操作/实例的分割符,权限字符串也可以使用*通配符。

例子:
用户创建权限:user:create,或user : create : *
用户修改实例001的权限:user : update : 001
用户实例001的所有权限:user : * : 001
当你对资源划分好之后,将这些信息存储到数据库中,和角色表关联起来,但是你还有一步要做,就是在代码中,将访问资源的代码和这些权限标识符绑定起来,也就是你要让shiro知道,这个资源是什么权限。

Shiro支持三种方式的授权
▪ 编程式
通过写if-else授权代码完成。

f_b3705c6082e24f01374e328fe4a37500.png

▪ 注解式
通过在执行的java方法上放置相应的权限的注解来完成。

f_3c4914b717fc724f90d5d306ab5d8a12.png

▪ JSP/GSP标签式
在JSP/GSP页面上通过相应的标签来完成。

f_3564c7eff11a1cd11ec426c74cc4d3b9.png

授权代码

在完成了权限的定义之后,重写的另外一个方法doGetAuthorizationInfo则是授权相关了。

在这个方法里,做的就是将传入的用户的权限全部查找出来,并填入到AuthorizerInfo中,交给shiro去判断,用户是否可以访问这个资源,因为之前已经在代码或者配置文件中定义好了权限信息并告诉了shiro,shiro知道你拥有的权限,和这个资源本身所需的权限,自然可以轻易的得出你是否能访问这个资源。

f_00b11f2c36189e8b3317a3916e836012.png
【小小建议】

有关shiro的完整文档、材料和示例代码均已上传到github上,可自行上去下载,若有什么错误指正和建议,大家一起讨论学习一起进步。
shiro的两个demo:
github.com/zeewane/shiro-demo
github.com/zeewane/shiro-login-example2
shiro的学习材料整理:

github.com/zeewane/znote/ tree/master/Shiro


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK