0
点赞
收藏
分享

微信扫一扫

shiro第一个程序


工程结构

shiro第一个程序_抛出异常



其中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)



举报

相关推荐

0 条评论