116

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

 6 years ago
source link: http://rdc.hundsun.com/portal/article/842.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实现权限管理开发(入门篇)?

只要有用户参与的系统一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源。

权限管理包括用户认证和授权两部分,权限管理包括用户身份认证和授权两部分,简称认证授权。对于需要访问控制的资源用户首先经过身份认证,认证通过后用户具有该资源的访问权限方可访问。

【如何控制权限】

基于角色的权限控制
RBAC(role based access control)系统角色包括:总经理、部门经理等等,角色针对用户来划分。

f_78d5af4de8af4f83b1f0945d871d5769.png

问题:
角色是针对人划分的,人作为用户在系统中是活动资源,如果用户的权限出现变更,就需要去修改代码。如总经理突然也想看报表,就需要在if中添加角色。

f_c6de07a570dd00c825fcd8e9f137e03a.png

综上可得:
基于角色的访问控制不利于系统维护,可拓展性不高。

▲ 基于资源的权限控制
RBAC(resource based access control),资源在系统中是不变的,比如:类中的方法,页面中的按钮,访问这个按钮的权限是不会变的,变的只是你有没有这个权限,比如你一定要有查看工资这个资源的权限,你才可以查看。
对资源的访问需要有permission权限,代码如下:
f_acaf3a7ccdffa06f4a8df2fd85d3472b.png

优点:
系统设计的时候只需要去定义好权限标识符,如果用户的权限发生变更,需要添加或者删除,也只要通过权限修改模块把权限赋给这个角色,而不用去修改判断的逻辑代码,系统的拓展性更强。

综上,建议使用基于资源的权限控制来实现权限管理。

权限管理解决方案】

一、粗粒度&细粒度权限

粗粒度权限管理,对资源类型的权限管理。资源类型比如:菜单、url连接、用户添加页面、用户信息、类方法、页面中按钮。

粗粒度权限管理比如:超级管理员可以访问户添加页面、用户信息等全部页面,部门管理员可以访问用户信息页面包括页面中所有按钮,用户具有用户管理的权限。

细粒度权限管理,对资源实例和数据级别的权限管理。
细粒度权限管理比如:部门经理只可以访问本部门的员工信息,用户只可以看到自己的菜单,大区经理只能查看本辖区的销售订单。

粗粒度和细粒度例子:

系统有一个用户列表查询页面,对用户列表查询分权限,如果粗颗粒管理,张三和李四都有用户列表查询的权限,张三和李四都可以访问用户列表查询。

进一步进行细颗粒管理,张三(研发中心)和李四(人力资源部)只可以查询自己本部门的用户信息。张三只能查看研发中心的用户信息,李四只能查看人力资源部的用户信息。细粒度权限管理就是数据级别的权限管理。

二、 实现粗粒度和细粒度权限管理

▪  如何实现粗粒度权限管理

粗粒度权限管理适合把权限管理的代码抽取出来,放到系统架构的级别去统一处理,比如通过spring mvc的拦截器实现授权。

▪ 如何实现细粒度权限管理

细粒度管理是数据级别的,没有共性,针对细粒度权限管理就是业务逻辑的一部分,随着业务需求的变更业务功能变化的可能性很大,适合在业务层去处理,这样更为简单,不适合抽取功能,这样抽出来的功能拓展性不强。建议细粒度的权限管理放到业务层。

比如:部门经理只可以查看本部门的员工信息,在service接口出定义一个部门id的参数,Controller会从用户信息中获取到这个id,就知道了这个用户属于哪个部门,调用service的时候把这个id也传进去,就可以实现部门经理只能查询本部门的员工信息。再比如,用户只允许修改自己创建的商品信息。可以在service的接口处添加校验,service传入当前操作用户的id,然后去和商品创建者的id进行对比,不一致的话就不允许修改商品。

三、基于url拦截的权限管理

基于url拦截的方式在实际开发中是比较常用的一种方式,对于web系统,通过filter过滤器实现拦截,也可以通过spring mvc的拦截器来实现基于url的拦截。

四、基于框架管理的权限管理

对于粗粒度权限管理,建议使用框架来实现,节省开发成本,提升开发效率。Shiro就是一个优秀的粗粒度权限管理框架。

轻量级安全框架--Shiro】

Apache Shiro一个功能强大,使用简单的轻量级Java安全框架,它为开发人员提供一个直观而全面的认证,授权,加密及会话管理的解决方案,它将软件系统的安全认证相关的功能抽取出来,实现用户身份认证,权限授权、加密、会话管理等功能,组成了一个通用的安全认证框架。

其实在Java领域中还有一个框架也比较有名,Spring Security。Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转Inversion of Control ,DI: Dependency Injection 依赖注入)和AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作。

但是Spring Security和Spring依赖过于紧密,而且使用没有Shiro来的简单。Shiro不依赖于Spring,不但可以实现web应用的权限管理,还可以实现C/S系统、分布式系统权限管理。Shiro更加轻量,越来越多的企业中也在使用Shiro。

Shiro主要功能
Shiro的主要功能是管理应用程序中与安全相关的全部,同时尽可能支持多种实现方法。Shiro是建立在完善的接口驱动设计和面向对象原则之上的,支持各种自定义行为。Shiro提供的默认实现,使其能完成与其他安全框架同样的功能。
功能点描述:
▪ 身份认证/登录,验证用户是不是拥有相应的身份;
▪ 授权,即权限验证,验证某个已认证的用户是否拥有某个权限;即判断用户是否能做事情,常见的如:验证某个用户是否拥有某个角色。或者细粒度的验证某个用户对某个资源是否具有某个权限;
▪ 会话管理,即用户登录后就是一次会话,在没有退出之前,它的所有信息都在会话中;会话可以是普通JavaSE环境的,也可以是如Web环境的;
▪ 加密,保护数据的安全性,如密码加密存储到数据库,而不是明文存储;
▪ Web支持,可以非常容易的集成到Web环境; Caching:缓存,比如用户登录后,其用户信息、拥有的角色/权限不必每次去查,这样可以提高效率;
▪ Shiro支持多线程应用的并发验证,即如在一个线程中开启另一个线程,能把权限自动传播过去;
▪ 提供测试支持;
▪ 允许一个用户假装为另一个用户(如果他们允许)的身份进行访问;
▪ 常见功能,即一次登录后,下次再来的话不用登录了。
▲ Shiro架构

f_d8c7c07c38391e5e728688db902ef35c.png

本章节,我们学习了关于权限管理的基础知识和实现权限管理的解决方案--轻量级安全框架SHIRO的介绍,但是二者到底如何结合才能开发权限管理呢,下篇文章我们继续讲解如何基于shiro的权限管理开发实现。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK