一、权限管理の引言

I、什么是权限管理

	基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现对用户访问系统的控制,按照安全规则或者[安全策略](http://baike.baidu.com/view/160028.htm) 控制用户可以访问而且只能访问自己被授权的资源。

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

II、权限管理

Authentication:身份认证/登录,验证用户是不是拥有相应的身份; 

Authorization:授权,即权限验证,验证某个已认证的用户是否拥有某个权限;即判断用 户是否能做事情,常见的如:验证某个用户是否拥有某个角色。或者细粒度的验证某个用 户对某个资源是否具有某个权限;

1、Authentication 认证

  1. Subject:主体

​ 访问系统的用户,主体可以是用户、程序等,进行认证的都称为主体;

  1. Principal:身份信息

​ 是主体(subject)进行身份认证的标识,标识必须具有唯一性,如用户名、手机号、邮箱地址等,一个主体可以有多个身份,但是必须有一个主身份(Primary Principal)。

  1. credential:凭证信息

​ 是只有主体自己知道的安全信息,如密码、证书等。

  1. token = Principal + credential + 票据信息

2、Authorization 授权

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

What,即资源(Resource),如系统菜单、页面、按钮、类方法、系统商品信息等。资源包括资源类型和资源实例,比如商品信息为资源类型,类型为t01的[商品]()为资源实例,编号为001的商品信息也属于资源实例。

How,权限/许可(Permission),规定了主体对资源的操作[许可](),权限离开资源没有意义,如用户查询权限、用户添加权限、某个类方法的调用权限、编号为001用户的修改权限等,通过权限可知主体对哪些资源都有哪些操作许可。

权限分为粗颗粒和细颗粒, 粗颗粒权限是指对资源类型的权限,细颗粒权限是对资源实例的权限。

权限模型

权限控制

粗粒度——基于角色的RBAC:RBAC基于角色的访问控制(Role-Based Access Control)是以角色为中心进行访问控制,比如:主体的角色为总经理可以查询企业运营报表,查询员工工资信息等。

缺点:以角色进行访问控制粒度较粗,如果上图中[查询工资所需要的角色变化为总经理和部门经理](),此时就需要修改判断逻辑为“判断主体的角色是否是总经理或部门经理”,系统可扩展性差。
修改代码如下:

if([主体.hasRole("]()总经理角色id") ||  主体.hasRole("部门经理角色id")){

        查询工资

}

细粒度——基于资源的RBAC:RBAC基于资源的访问控制(Resource-Based Access Control)是以资源为中心进行访问控制,比如:主体必须具有查询工资权限才可以查询员工工资信息等。

优点:系统设计时定义好查询工资的权限标识,即使查询工资所需要的角色变化为总经理和部门经理也只需要将“查询工资信息权限”添加到“部门经理角色”的权限列表中,判断逻辑不用修改,系统可扩展性强。

if(主体.hasPermission("查询工资权限标识")){
	查询工资
}

Shiro

Shiro是apache旗下一个开源框架,它将软件系统的安全认证相关的功能抽取出来,实现用户身份认证,权限授权、加密、会话管理等功能,组成了一个通用的安全认证框架。
java领域中spring security(原名Acegi)也是一个开源的权限管理框架,但是spring security依赖spring运行,而shiro就相对独立,最主要是因为shiro使用简单、灵活,所以现在越来越多的用户选择shiro。

原文地址:https://www.cnblogs.com/adrien/p/10218783.html