工程结构
其中shiro-first.ini配置文件在这里充当数据库了
[users]
zhangsan=111111
lisi=22222
具体流程:
@Test
public void testLoginAndLogout(){
//创建securityManager工厂,通过ini配置文件创建securityManager
Factory<org.apache.shiro.mgt.SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro-first.ini");
//通过factory工厂,创建securityManager
SecurityManager securityManager = factory.getInstance();
//将securityManager设置当前的运行环境中
SecurityUtils.setSecurityManager(securityManager);
//从SecurityUtils里面创建一个subject,subject就是主体
Subject subject = SecurityUtils.getSubject();
//在认证提价前,准备token,token就是一个令牌,用户和密码
UsernamePasswordToken token = new UsernamePasswordToken("zhangsan","111111");
//执行认证的提交
try {
//执行认证的提交,认证不通过就会抛出异常
subject.login(token);
} catch (AuthenticationException e) {
e.printStackTrace();
}
//这是认证是否通过,返回的是boolean类型的数据类型
boolean isAuthenticated = subject.isAuthenticated();
System.out.println("是否认证通过"+isAuthenticated);
//退出
subject.logout();
//当用户退出的时候,认证是否还通过
isAuthenticated = subject.isAuthenticated();
System.out.println("是否认证通过"+isAuthenticated);
}
具体实现的原理如下:
1.通过ini配置文件创建securityManager,这相当于springmvc中的前端控制器,负责调控整个认证的过程,但是他本身是不干活的
2.调用subject.login,提交token,token前面已经准备好了的
3.当执行subject.login(token)这个方法的时候,token会传递到securityManager,securityManager将token交给
ModularRealmAuthenticator进行认证
4.ModularRealmAuthenticator将token交给IniRealm,IniRealm从shiro-first.ini查询用户信息,
IniRealm根据账号查询用户名和密码出来,
IniRealm如果查询到用户信息,IniRealm就给ModularRealmAuthenticator返回用户信息(包括用户名和密码)
IniRealm如果没有查到用户信息,就给ModularRealmAuthenticator返回null,
ModularRealmAuthenticator接受IniRealm返回Authentication认证信息
如果IniRealm返回的认证是null,ModularRealmAuthenticator抛出异常(org.apache.shiro.authc.UnknownAccountException)
如果返回的认证信息不是null(说明IniRealm找到了用户),ModularRealmAuthenticator对IniRealm返回用户密码
和token中的密码进行对比,如果不一致抛出异常(org.apache.shiro.authc.IncorrectCredentialsException)