Shiro的介绍

发表时间:2017-07-18 19:00:04 浏览量( 22 ) 留言数( 0 )

学习目标:

1、了解什么权限管理

2、了解Shiro


学习过程:

一、权限管理的基本概念

    一般指根据系统设置的安全规则或者安全策略,用户可以访问而且只能访问自己被授权的资源,不多不少。权限管理几乎出现在任何系统里面,只要有用户和密码的系统。 很多人常将“用户身份认证”、“密码加密”、“系统管理”等概念与权限管理概念混淆。

    权限管理一般包括用户身份认证和授权两部分。

1、用户身份认证

    用户身份认证,严格来说就不属于权限管理范畴。用户身份认证,是要解决这样的问题:用户告诉系统“我是谁”,系统就问用户凭什么证明你就是“谁”呢?对于采用用户名、密码验证的系统,那么就是出示密码。当用户名和密码匹配,则证明当前用户是谁;对于采用指纹等系统,则出示指纹;对于硬件Key等刷卡系统,则需要刷卡。

相关概念:    

    Subject:主体

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

    Principal:身份信息

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

    credential:凭证信息

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

2、授权

    授权,即访问控制,授权可简单理解为who对what(which)进行How操作,控制谁能访问哪些资源。主体进行身份认证后需要分配权限方可访问系统的资源,对于某些资源没有权限是无法访问的。

相关概念:

    Who,即主体(Subject),主体需要访问系统中的资源。

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

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


二、权限的分类

 1、从控制力度来看,可以将权限管理分为两大类

(1)功能级权限管理

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

(2)数据级权限管理

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


2、从控制方向来看,也可以将权限管理分为两大类

(1)从系统获取数据,比如查询订单、查询客户资料;

(2)向系统提交数据,比如删除订单、修改客户资料。


3、基于角色和基于资源

(1)基于角色的访问控制(Role-Based Access Control)

    既然角色代表了可执行的操作这一概念,一个合乎逻辑的做法是在软件开发中使用角色来控制对软件功能和数据的访问。这种权限控制方法就叫基于角色的访问控制(Role-Based Access Control),或简称为RBAC。

(2)基于资源的访问控制:Resource-Based Access Control

    如果你仍想保留或模拟传统的基于角色的权限访问控制,你可以将权限(可执行的操作)直接分配给某个角色。这种情况下,你依旧是在使用基于角色的权限访问控制方式。


三、权限管理框架

   我们在前面学习Hibernate时也学习过权限管理模块的数据库设计,那么我们今天学习也会采用类型的数据库结构,但是代码逻辑需要我们自己实现,这几天我们将会学习shiro这个通用的权限管理模块了,除了Shiro之外,Spring家族里面也有一个流行的权限管理模块--Spring Security。

1、权限模型结构

主体、资源、权限的数据模型表示



主体(账号、密码)

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

权限(权限名称、资源id)

角色(角色名称)

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

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


2、shiro介绍:

    shiro是apache提供的强大而灵活的开源安全框架,它主要用来处理身份认证,授权,企业会话管理和加密。shiro功能:用户验证、用户执行访问权限控制、在任何环境下使用session API,如cs程序。可以使用多数据源如同时使用oracle、mysql。单点登录(sso)支持。remember me服务。详细介绍还请看官网的使用手册:http://shiro.apache.org/reference.html

与spring security区别,个人觉得二者的主要区别是:

(1)shiro灵活性强,易学易扩展。同时,不仅可以在web中使用,可以工作在任务环境内中。

(2)acegi灵活性较差,比较难懂,同时与spring整合性好。

如果对权限要求比较高的项目,个人建议使用shiro,主要原因是可以很容易按业务需求进行扩展。


而且Shiro的API也是非常简单;其基本功能点如下图所示:

attcontent/0b93e962-a08f-4918-bf4e-d36fd61e99b1.png


Subject

    Subject即主体,外部应用与subject进行交互,subject记录了当前操作用户,将用户的概念理解为当前操作的主体,可能是一个通过浏览器请求的用户,也可能是一个运行的程序。Subject在shiro中是一个接口,接口中定义了很多认证授相关的方法,外部程序通过subject进行认证授,而subject是通过SecurityManager安全管理器进行认证授权.

SecurityManager 

    SecurityManager即安全管理器,对全部的subject进行安全管理,它是shiro的核心,负责对所有的subject进行安全管理。通过SecurityManager可以完成subject的认证、授权等,实质上SecurityManager是通过Authenticator进行认证,通过Authorizer进行授权,通过SessionManager进行会话管理等。

    SecurityManager是一个接口,继承了Authenticator, Authorizer, SessionManager这三个接口。

Authenticator

    Authenticator即认证器,对用户身份进行认证,Authenticator是一个接口,shiro提供ModularRealmAuthenticator实现类,通过ModularRealmAuthenticator基本上可以满足大多数需求,也可以自定义认证器。

Authorizer

    Authorizer即授权器,用户通过认证器认证通过,在访问功能时需要通过授权器判断用户是否有此功能的操作权限。

realm

   Realm即领域,相当于datasource数据源,securityManager进行安全认证需要通过Realm获取用户权限数据,比如:如果用户身份数据在数据库那么realm就需要从数据库获取用户身份信息。

SessionManager

    sessionManager即会话管理,shiro框架定义了一套会话管理,它不依赖web容器的session,所以shiro可以使用在非web应用上,也可以将分布式应用的会话集中在一点管理,此特性可使它实现单点登录。

SessionDAO

    SessionDAO即会话dao,是对session会话操作的一套接口,比如要将session存储到数据库,可以通过jdbc将会话存储到数据库。

CacheManager

    CacheManager即缓存管理,将用户权限数据存储在缓存,这样可以提高性能。

Cryptography

    Cryptography即密码管理,shiro提供了一套加密/解密的组件,方便开发。比如提供常用的散列、加/解密等功能。

Testing

    提供测试支持;

Run As

    允许一个用户授权成为另一个用户(如果他们允许)的身份进行访问;

Remember Me

    记住我,这个是非常常见的功能,即一次登录后,下次再来的话不用登录了

Concurrency

    shiro支持多线程应用的并发验证,即如在一个线程中开启另一个线程,能把权限自动传播过去;

Web Support

    Web支持,可以非常容易的集成到Web环境;