【权限管理】基础原理篇

来源:互联网 发布:fastjson与json 编辑:程序博客网 时间:2024/05/29 13:23

这两天在做移动端之余也接触一点儿权限的知识。。基础,考试,新生都有一定的了解,唯一对权限是最陌生的。在AngularJs的摧残下,不得不找点儿别的事儿来做做。原本想看一点儿关于shiro的东西,经人推荐了一套视频,里面讲解shiro之前先讲解了以下权限的原理部分,感觉特别好。就燕青老师讲的总结一下,让自己印象深刻一下下。个人感觉传智燕青老师讲的这个shiro视频挺好的,推荐大家看看。有想看的可以找我要哦~

 

什么是权限管理?

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

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

 

用户身份认证

身份认证,就是判断一个用户是否为合法用户的处理过程。最常用的简单身份认证方式是系统通过核对用户输入的用户名和口令,看其是否与系统中存储的该用户的用户名和口令一致,来判断用户身份是否正确。对于采用指纹等系统,则出示指纹;对于硬件Key等刷卡系统,则需要刷卡。

 

授权

授权,即访问控制,控制谁能访问哪些资源。主体进行身份认证后需要分配权限方可访问系统的资源,对于某些资源没有权限是无法访问的。

 

权限表结构设计

用户身份认证基本用一个用户表就可以进行验证,主要看一下授权表结构设计。

授权可简单理解为whowhat(which)进行How操作:Who即主体(Subject

What即资源(Resource),How即权限/许可(Permission)。

主体、资源、权限关系如下图:


对上面的主体、资源、权限通过数据模型表示。

主体(账号、密码)

资源(资源名称、访问地址)

权限(权限名称、资源id

角色(角色名称)

角色和权限关系(角色id、权限id

主体和角色关系(主体id、角色id

如下图:


通常企业开发中将资源和权限表合并为一张权限表,如下:

资源(资源名称、访问地址)

权限(权限名称、资源id

合并为:

权限(权限名称、资源名称、资源访问地址)

如图:


即映射出了以下几张表:


这几张表是权限的通用表,每个公司可能针对自己的业务会有不同。


权限管理解决方案

管理权限有粗粒度和细粒度之分,粒度不同对待方式不同。

 

粗粒度

对资源类型的管理称为粗颗粒度权限管理,即只控制到菜单、按钮、方法,粗粒度的例子比如:用户具有用户管理的权限,具有导出订单明细的权限。

 

细粒度

对资源实例的控制称为细颗粒度权限管理,即控制到数据级别的权限,比如:用户只允许修改本部门的员工信息,用户只允许导出自己创建的订单明细。

 

如何实现粗粒度和细粒度

对于细颗粒度的权限管理不建议做成系统架构级别的功能,因为对数据级别的控制是系统的业务需求,随着业务需求的变更业务功能变化的可能性很大,建议对数据级别的权限控制在业务层个性化开发,比如:用户只允许修改自己创建的商品信息可以在service接口添加校验实现,service接口需要传入当前操作人的标识,与商品信息创建人标识对比,不一致则不允许修改商品信息。

 

对于粗颗粒度的权限管理可以很容易做系统架构级别的功能,即系统功能操作使用统一的粗颗粒度的权限管理。

实现方式两种:

1)基于url拦截

基于url拦截是企业中常用的权限管理方法,实现思路是:将系统操作的每个url配置在权限表中,将权限对应到角色,将角色分配给用户,用户访问系统功能通过Filter进行过虑,过虑器获取到用户访问的url,只要访问的url是用户分配角色中的url则放行继续访问。

 

2)使用权限框架

对于权限管理基本上每个系统都有,使用权限管理框架完成权限管理功能的开发可以节省系统开发时间,并且权限管理框架提供了完善的认证和授权功能有利于系统扩展维护,但是学习权限管理框架是需要成本的,所以选择一款简单高效的权限管理框架显得非常重要。我们系统中选择的框架就是shiro

 

基于url拦截的平时我们遇到的很多,如果用的是框架像SpringMvcStruts2,我们可以使用他们的拦截器进行拦截,如果不使用框架我们用filter进行过滤。

基于shiro框架完成权限管理,我们下篇详细介绍。


1 0