shiro 认证流程
认证流程从上面流程可以看出最重要的就是 Authenticator 和 Realm.
入门程序
使用Shiro 架包搭建工程
注:这里暂时没用到 Spring Hibernate 等架包.
构建securityManager环境步骤
创建shiro-first.ini
#对用户信息进行配置
[users]
#用户账号和密码
zhangsan=111111
lisi=22222
// 创建securityManager工厂,通过ini配置文件创建securityManager工厂
Factory<SecurityManager> factory = new IniSecurityManagerFactory(
"classpath:shiro-first.ini");
// 创建SecurityManager
SecurityManager securityManager = factory.getInstance();
// 将securityManager设置当前的运行环境中
SecurityUtils.setSecurityManager(securityManager);
// 从SecurityUtils里边创建一个subject
Subject subject = SecurityUtils.getSubject();
// 在认证提交前准备token(令牌)
// 这里的账号和密码 将来是由用户输入进去
UsernamePasswordToken token = new UsernamePasswordToken("zhangsan",
"111111");
try {
// 执行认证提交
subject.login(token);
} catch (AuthenticationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 是否认证通过
boolean isAuthenticated = subject.isAuthenticated();
System.out.println("是否认证通过:" + isAuthenticated);
// 退出操作
subject.logout();
// 是否认证通过
isAuthenticated = subject.isAuthenticated();
System.out.println("是否认证通过:" + isAuthenticated);
程序执行流程
- 通过 ini 配置文件创建SecurityManager
- 调用 subject.login() 方法提交认证.
内部通过 SecurityManager 进行认证,在SecurityManager进行认证的时候会调用 Authenticator 接口的实现类 RealmSecurityManager.
3.然后 RealmSecurityManager 再去调用 ModularRealmAuthenticator 进行认证.认证时 ModularRealmAuthenticator 会拿着用户输入的 token 和 shiro-first.ini 中配置的用户账号和密码进行对比.
4.如何对比呢?
ModularRealmAuthenticator 会调用 Realm 接口的实现类 IniRealm, IniRealm 负责从 shiro-first.ini 中查询用户信息(账号和密码), 如果找不到账号会返回 null, 如果找到账号,则会将账号和密码返回.
ModularRealmAuthenticator 会判断 IniRealm 返回的信息,如果为 null 则跑出 org.apache.shiro.authc.UnknownAccountException
异常.
如果密码输出错,则跑出org.apache.shiro.authc.IncorrectCredentialsException
异常.
总结
IniRealm: 读取 ini 配置文件, 将来要连接数据,那么就需要仿照此类来读取数据库的账号和密码.
RealmSecurityManager: 用来判断Realm找到的用户名和密码是否匹配, 或是否找到用户.
网友评论