360SDN.COM

首页/Java/列表

shiro权限管理入门(一)

来源:IT技术大神  2017-09-11 12:13:39    评论:0点击:

什么是shiro?

shiro是Apache的一个开源框架,它将软件系统的安全认证相关的功能抽取出来,实现用户身份认证,权限授权、加密、会话管理等功能,组成了一个通用的安全认证框架。它可以实现如下的功能:

1.验证用户

2.对用户执行访问控制,如:判断用户是否具有角色admin,判断用户是否拥有访问的资源权限。

3.在任何环境下使用SessionAPI。例如C/S程序

4.可以使用多个用户数据源。例如一个是Oracle数据库,另外一个是MySQL数据库。

5.单点登录(SSO)功能

6."Remember Me"服务,类似于购物车的功能,shiro官方建议开启。


为何使用shiro?

因为shiro将安全认证相关的功能抽取出来组成了一个框架,因此使用shiro就可以非常快速的完成认证、授权等功能的开发,降低系统成本。

shiro使用广泛,shiro可以运行在web应用,非web应用,集群分布式应用中越来越多的用户开始使用shiro.

Spring中有Spring security(原名Acegi), 是一个权限框架,它和Spring的依赖过于紧密,没有shiro使用简单。shiro不依赖于Spring,而shiro就相对独立最主要是因为shiro使用简单‘灵活,所以现在越来越多的用户选择shiro


shiro核心组成部分:

shiro的4大组成部分——身份认证,授权,会话管理和加密

Authentication:身份验证(身份认证),简称"登录"。

Authorization:授权,给用户给用户分配角色或者权限资源。

Session Manager:用户Session管理器,可以让C/S程序也使用Session来控制权限。

Cryptography:将JDK中复杂的密码加密方式进行封装。

除了以上功能,shiro还提供很多扩展功能:

Web Support:主要针对web应用提供一些常用功能。

Caching:缓存可以使程序运行更有效率。

Concurrency:多线程相关功能。

Testing:帮助我们进行测试相关的功能。

"Run As":一个允许用户假设为另一个用户身份(如果允许)的功能,有时候在管理脚本时很有用。

"Remember  Me":记住用户身份,提供类似购物车的功能。


shiro运行大致流程:

Subject——主体,是与程序进行交互的对象,可以是人也可以是服务或其他程序,通常理解为用户。所有的Subject实例都必须绑定到一个SecurityManager上。我们与Subject交互,运行时shiro会自动转化为与SecurityManager交互的特定的subject的交互。

SecurityManager——SecurityManager是shiro的核心,初始化时协调各个模块运行。然而,一旦SecurityManager协调完毕,SecurityManager会被单独留下,且我们只需要去操作Subject即可,无需操作SecurityManager。但是需要了解的是当我们与一个Subject进行交互时,实质上是SecurityManager在处理Subject的安全操作。

Realms——Realms在shiro中作为程序和安全数据之间的"桥梁"或"连接器"。它用于获取安全数据来判断subject是否能够登录,subject拥有什么权限。有点类似于DAO。在配置realms时,需要至少一个realm。而且shiro提供了一些常用的Realms来连接数据源,如LDAP数据源的JndiLdapRealm,JDBC数据源的JdbcRealm,ini文件数据源的iniRealm,Properties文件数据源的PropertiesRealm,等等,我们也可以插入自己的Realm实现来代表自定义的数据源。像其他组件一样,Realms也是由SecurityManager控制。


shiro架构

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

SecurityManager:(org.apache.shiro.mgt.SecurityManager)如上所述,SecurityManager是shiro的核心,协调shiro的各个组件。SecurityManager就是安全管理器,负责对全部的subject进行安全管理。通过SecurityManager可以完成Subject的认证、授权等,实质上SecurityManager是通过Authenticator对主体进行认证,通过Authorizer对主体进行授权,通过SessionManager进行会话管理等等。SecurityManager是一个接口,继承了Authenticator,Authorizer,SessionManager这三个接口。

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

Authorizer:(org.apache.shiro.authz.Authorizer)即授权器,用户在通过认证器认证通过后,在访问时需要通过授权器判断用户是否有此功能的操作权限。最终是通过认证器对主体进行授权的。

Realm:(org.apache.shiro.realm.Realm)Realm即领域,相当于DataSource数据源,通过Realm存取认证、授权相关数据。SecurityManager通过认证器对主体进行安全认证需要通过Realm获取用户身份数据,比如:如果用户身份数据在数据库,那么Realm就需要从数据库获取用户的身份信息。授权也是如此,也需要通过Realm取出授权相关信息。注意:不要将Realm理解成只是从数据源获取数据,在Realm中还有认证授权校验的相关代码

SessionManager:(org.apache.shiro.session.SessionManager)会话管理。web应用中一般是web容器对Session进行管理,shiro框架定义了一套会话管理,它不依赖于web容器的Session,所以shiro可以使用在非web应用上,也可以将分布式应用的会话集中在一点进行管理,此特性可使它实现单点登录。

SessionDAO:SessionDAO即会话dao,是对Session会话操作的一套接口,比如要将Session存储到数据库,可以通过JDBC将会话存储到数据库。针对个性化的Session数据存储(存到数据库)需要使用SessionDAO。

CacheManager:(org.apahce.shiro.cache.CacheManager)缓存管理器,主要对Session和授权数据进行缓存,比如将授权数据通过cachemanager进行缓存管理,和ehcache整合对缓存数据进行管理,可以减少不必要的后台访问,提高应用效率,增加用户体验。

Cryptography:(org.apache.shiro.crypto.*)密码管理,提供了一套加密/解密组件,对JDK中的加密解密算法进行了封装,方便开发。比如提供常用的散列、加/解密等功能,比如MD5散列算法。


shiro相关jar

与其他Java开源框架类似,将shiro的jar包加入项目就可以使用shiro提供的功能了。shiro-core时核心包必须选用,还提供了与web整合的shiro-web、与Spring整合的shiro-spring、与任务调度quartz整合的shiro-quartz、与ehcache整合的shiro-ehcache。下边是shiro各个jar包的Maven坐标。


  • [html] view plaincopy print?

  • <dependency>  

  •     <groupId>org.apache.shiro</groupId>  

  •     <artifactId>shiro-core</artifactId>  

  •     <version>1.2.3</version>  

  • </dependency>  

  • <dependency>  

  •     <groupId>org.apache.shiro</groupId>  

  •     <artifactId>shiro-web</artifactId>  

  •     <version>1.2.3</version>  

  • </dependency>  

  • <dependency>  

  •     <groupId>org.apache.shiro</groupId>  

  •     <artifactId>shiro-spring</artifactId>  

  •     <version>1.2.3</version>  

  • </dependency>  

  • <dependency>  

  •     <groupId>org.apache.shiro</groupId>  

  •     <artifactId>shiro-ehcache</artifactId>  

  •     <version>1.2.3</version>  

  • </dependency>  

  • <dependency>  

  •     <groupId>org.apache.shiro</groupId>  

  •     <artifactId>shiro-quartz</artifactId>  

  •     <version>1.2.3</version>  

  • </dependency>  

[html] view plaincopy print?

  • <dependency>  

  •     <groupId>org.apache.shiro</groupId>  

  •     <artifactId>shiro-core</artifactId>  

  •     <version>1.2.3</version>  

  • </dependency>  

  • <dependency>  

  •     <groupId>org.apache.shiro</groupId>  

  •     <artifactId>shiro-web</artifactId>  

  •     <version>1.2.3</version>  

  • </dependency>  

  • <dependency>  

  •     <groupId>org.apache.shiro</groupId>  

  •     <artifactId>shiro-spring</artifactId>  

  •     <version>1.2.3</version>  

  • </dependency>  

  • <dependency>  

  •     <groupId>org.apache.shiro</groupId>  

  •     <artifactId>shiro-ehcache</artifactId>  

  •     <version>1.2.3</version>  

  • </dependency>  

  • <dependency>  

  •     <groupId>org.apache.shiro</groupId>  

  •     <artifactId>shiro-quartz</artifactId>  

  •     <version>1.2.3</version>  

  • </dependency>  

<dependency>  <groupId>org.apache.shiro</groupId>  <artifactId>shiro-core</artifactId>  <version>1.2.3</version></dependency><dependency>  <groupId>org.apache.shiro</groupId>  <artifactId>shiro-web</artifactId>  <version>1.2.3</version></dependency><dependency>  <groupId>org.apache.shiro</groupId>  <artifactId>shiro-spring</artifactId>  <version>1.2.3</version></dependency><dependency>  <groupId>org.apache.shiro</groupId>  <artifactId>shiro-ehcache</artifactId>  <version>1.2.3</version></dependency><dependency>  <groupId>org.apache.shiro</groupId>  <artifactId>shiro-quartz</artifactId>  <version>1.2.3</version></dependency>

也可以通过引入shiro-all包括shiro所有的包

[html] view plaincopy print?

  • <dependency>  

  •     <groupId>org.apache.shiro</groupId>  

  •     <artifactId>shiro-all</artifactId>  

  •     <version>1.2.3</version>  

  • </dependency>  


  • <dependency>  

  •     <groupId>org.apache.shiro</groupId>  

  •     <artifactId>shiro-all</artifactId>  

  •     <version>1.2.3</version>  

</dependency>  

IT技术大神   小白到大神的进阶之路

长按识别二维码,加关注

阅读原文

为您推荐

友情链接 |九搜汽车网 |手机ok生活信息网|ok生活信息网|ok微生活
 Powered by www.360SDN.COM   京ICP备11022651号-4 © 2012-2016 版权