本文正式进入主题。本文将介绍如下内容:
Apache Shiro(日语“堡垒(Castle)”的意思)是一个强大易用的Java安全框架,提供了认证、授权、加密和会话管理功能,可为任何应用提供安全保障 - 从命令行应用、移动应用到大型网络及企业应用。—— [ 百度百科 ]
shiro已经将安全认证相关的功能抽取出来组成一个框架,使用shiro就可以非常快速的完成认证、授权等功能的开发,降低系统开发成本。
shiro使用广泛,shiro可以运行在web应用、非web应用、集群分布式应用中越来越多的用户开始使用shiro。
java领域中spring security也是一个开源的权限管理框架,但是spring security依赖spring运行,而shiro就相对独立,最主要因为shiro使用简单、灵活。
图中的subject就是请求主体。subject请求都交给Security Manager进行处理。Security Manager是暴露给主体请求的唯一一个接口。
在Security Manager 中又有Authenticator、Authorized、
SessionManager、Realm、SessionDAO和Cache Manager模块。下面会详细介绍这些模块的作用。
Subject即主体,外部应用与 subject进行交互,subject记录了当前操作用户,将用户的理解为当前操作的主体,可以是通过浏览器请求的用户,也可能是一个运行的程序。
Subject在shiro中是一个接口,接口中定义了很多认证授权的方法,外部程序通过subject进行认证授权,而subject通过Security Manager安全管理器进行认证授权。
Sercurity Manager即安全管理器,对所有的subject进行管理,它是shiro的核心,负责对所有的subject进行安全管理。通过Security Manager可以完成对shiro的认证、授权等,但是实质上Security Manager是通过Authenticator进行认证、通过Authorizer进行授权、通过sessionManager进行会话管理等。
SecurityManager是一个接口,继承了Authenticator、Authorizer、SessionManager这三个接口。
Authenticator即认证器,对subject身份进行认证,Authenticator是一个接口,shiro提供了ModularRealmAuthenticator实现类,通过ModularRealmAuthenticator基本上可以满足大多数的需求,也可以自定义认证器。
Authorizer即授权器,subject认证通过后,在访问功能时需要通过授权器判断用户是否有此功能的操作权限。
realm即域,相当于DataSource数据源,securityManager进行安全认证需要通过realm获取用户权限数据,比如:如果用户身份信息存储在数据库那么realm就需要从数据库获取用户身份信息。
注意: 不要把realm理解成只是从数据源取数据,在realm中还有认证授权校验相关的代码。
sessionManager 即会话管理,shiro框架提供了一套会话管理,它不依赖web容器的session,所以shiro可以使用在非web环境中,也可以将分布式应用的会话集中在一点管理,此特性可使它实现单点登录。
sessionDAO即会话管理DAO,是对session会话管理操作的一套接口,比如要将session存储到数据库,可以使用jdbc将会话存储到数据库。
CacheManager即缓存管理,将用户权限存储在缓存,可以提高性能。
crypography即密码管理,shiro提供了一套加密/解密的组件,方便开发。提供了常用的散列、加/解密算法。
与其他Java开源项目一样,只需要加入jar包就可以开始使用shiro 了。shiro-core.jar是必选的,还提供了与web整合的shiro-web、与spring整合的shiro-spring、与任务调度quartz整合的shiro-quartz等,下面给出shiro各jar包的maven坐标。
<dependency>
<groupId>org.apache.shirogroupId>
<artifactId>shiro-coreartifactId>
<version>1.2.3version>
dependency>
<dependency>
<groupId>org.apache.shirogroupId>
<artifactId>shiro-webartifactId>
<version>1.2.3version>
dependency>
<dependency>
<groupId>org.apache.shirogroupId>
<artifactId>shiro-springartifactId>
<version>1.2.3version>
dependency>
<dependency>
<groupId>org.apache.shirogroupId>
<artifactId>shiro-ehcacheartifactId>
<version>1.2.3version>
dependency>
<dependency>
<groupId>org.apache.shirogroupId>
<artifactId>shiro-quartzartifactId>
<version>1.2.3version>
dependency>
当然也可以引入shiro-all包括shiro所有的jar包,但是不建议使用。还是用到什么引入什么。
<dependency>
<groupId>org.apache.shirogroupId>
<artifactId>shiro-allartifactId>
<version>1.2.3version>
dependency>