天天看点

shrio教程初级(四)shiro基础(认证)一、前言二、shrio的jar包三、shrio的ini认证程序实例四、shrio的ini认证-realms自定义四、shrio的ini认证-realms自定义(加密)

前面我们通过url拦截器实现了权限验证,功能齐全,开发难度也不大。但是为了更好的进行开发权限,开发我们选择shrio,终于扯上正题了是不是?当你学习shrio你会发现,都是一样的。嘎嘎

shiro使用广泛,shiro可以运行在web应用,非web应用,集群分布式应用中越来越多的用户开始使用shiro。简单好用用的人就多了哦。

首先一样来个图:

shrio教程初级(四)shiro基础(认证)一、前言二、shrio的jar包三、shrio的ini认证程序实例四、shrio的ini认证-realms自定义四、shrio的ini认证-realms自定义(加密)

subject:用户或者程序,可以是任何语言编写。(这个跟uel拦截器一样)

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

Authentic:认证器,Authenticator是一个接口,shiro提供ModularRealmAuthenticator实现类,通过ModularRealmAuthenticator基本上可以满足大多数需求,也可以自  定义认证器。(相当于ur权限l的登录拦截器哦)

Authorizer:Authorizer即授权器,用户通过认证器认证通过,在访问功能时需要通过授权器判断用户是否有此功能的操作权限(相当于url权限系统的权限拦截器)。

sessionManager:即会话管理,shiro框架定义了一套会话管理,它不依赖web容器的session,所以shiro可以使用在非web应用上,也可以将分布式应用的会话集中在一点管理,此特性可使它实现单点登录。(相当于ur权限系统里面自带的httpsession,而它可以独立)

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

realms:领域相当于datasource数据源,securityManager进行安全认证需要通过Realm获取用户权限数据,比如:如果用户身份数据在数据库那么realm就需要从数据库获取用户身份信息。(相当于ur权限系统里面自带的mysql,而它还支持验证)

注意:不要把realm理解成只是从数据源取数据,在realm中还有认证授权校验的相关的代码。

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

Cryptography:Cryptography即密码管理,shiro提供了一套加密/解密的组件,方便开发。比如提供常用的散列、加/解密等功能。MD5即是散列(相当于ur权限系统里面MD5)

就这么完美的解释,反正都是来自网络,而且专业简单的解释。

或者就ok

项目分析

shrio教程初级(四)shiro基础(认证)一、前言二、shrio的jar包三、shrio的ini认证程序实例四、shrio的ini认证-realms自定义四、shrio的ini认证-realms自定义(加密)

项目结构:

shrio教程初级(四)shiro基础(认证)一、前言二、shrio的jar包三、shrio的ini认证程序实例四、shrio的ini认证-realms自定义四、shrio的ini认证-realms自定义(加密)

加入上面的jar包core包即可以

再加入日志文件与包

shrio-frist.ini

1、通过ini配置文件创建securityManager

2、调用subject.login方法主体提交认证,提交的token

3、securityManager进行认证,securityManager最终由ModularRealmAuthenticator进行认证。

4、ModularRealmAuthenticator调用IniRealm(给realm传入token) 去ini配置文件中查询用户信息

5、IniRealm根据输入的token(UsernamePasswordToken)从 shiro-first.ini查询用户信息,根据账号查询用户信息(账号和密码)

如果查询到用户信息,就给ModularRealmAuthenticator返回用户信息(账号和密码)

如果查询不到,就给ModularRealmAuthenticator返回null

6、ModularRealmAuthenticator接收IniRealm返回Authentication认证信息 如果返回的认证信息是null,ModularRealmAuthenticator抛出异常(org.apach e.shiro.authc.UnknownAccountException)

如果返回的认证信息不是null(说明inirealm找到了用户),对IniRealm返回用户密码 (在ini文件中存在)和 token中的密码 进行对比,如果不一致抛出异常(org.apache.shiro.authc.IncorrectCredentialsException)

注意:1、是realm调用token信息,进行验证。

2、securityManager是调用ModularRealmAuthenticator进行认证返回AuthenticationInfo认证信息

我们知道realm就是数据源,即是我们经常说的各种数据库,但是我们前面例子用的是ini文件,我们现在来模拟一下用数据。(模拟)

自定义realm,继承我们的AuthorizingRealm。因为AuthorizingRealm就是我们realm的一个实现类

这个ini文件是制定我们的realms,而不再是指定数据

shrio-realm.ini

测试程序一样没有变,只是现在执行认证的时候进行的是我们自己定义的realm的认证

测试结果一样,就不用贴图了。

只需要在realm里面写入加密就ok