01-Shiro的入门程序-认证(ssm+Shiro)
一、创建Java Project
jar包:
二、创建ini文件,shiro-first.ini
# 对用户信息进行配置,这个文件相当于数据源、数据库 [users] # 用户名和密码 Peter=111111 Tom=222222
三、创建测试类 AuthenticationTest.java
package cn.itcast.shiro.authentication; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.config.IniSecurityManagerFactory; import org.apache.shiro.mgt.SecurityManager; import org.apache.shiro.subject.Subject; import org.apache.shiro.util.Factory; import org.junit.Test; // 认证测试 public class AuthenticationTest { // 登录和退出 @Test public void testLoginAndLogout() { // 创建SecurityManager工厂 Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro-first.ini"); // 获取SecurityManager SecurityManager securityManager = factory.getInstance(); // 将securityManager设置到运行环境中 SecurityUtils.setSecurityManager(securityManager); // 创建Subject,这个就是从数据库中获取的正确的主体,包含用户名和凭证(如密码、数字签名、指纹等等) Subject subject = SecurityUtils.getSubject(); // 创建Token,这个token就是用户输入的用户名和密码做成的token令牌,将来要从数据库中获取 UsernamePasswordToken token = new UsernamePasswordToken("Peter", "111111"); // 认证提交,认证不通过时会报异常 try { subject.login(token); } catch (AuthenticationException e) { e.printStackTrace(); } // 认证结果:认证通过放回true,失败返回false boolean isAuthenticated = subject.isAuthenticated(); // 打印认证结果 System.out.println("认证结果:" + isAuthenticated); // 退出操作 subject.logout(); // 再次打印认证结果 boolean isAuthenticatedAfterLogout = subject.isAuthenticated(); System.out.println("认证结果:" + isAuthenticatedAfterLogout); } }
工程结构:
四、运行结果
(1)输入正确的用户名和密码,返回true;
(2)输入错误的用户名,不管密码对不对,都报异常:org.apache.shiro.authc.UnknownAccountException
(3)输入正确的用户名,错误的密码,报异常:org.apache.shiro.authc.IncorrectCredentialsException
(4)如果中间插入logout(),认证结果是false
--------------------------------------------------------------------------------------
认证过程:(追溯shiro源码)
1、创建token令牌,token中有用户提交的认证信息即账号和密码
2、执行subject.login(token),最终由securityManager通过Authenticator进行认证
3、Authenticator的实现ModularRealmAuthenticator调用realm从ini配置文件取用户真实的账号和密码,这里使用的是IniRealm(shiro自带)
4、IniRealm先根据token中的账号去ini中找该账号,如果找不到则给ModularRealmAuthenticator返回null,如果找到则匹配密码,匹配密码成功则认证通过。
--------------------------------------------------------------------------------------
常见的异常:
UnknownAccountException:账号错误
IncorrectCredentialsException:凭证错误
DisabledAccountException:帐号被禁用
LockedAccountException:帐号被锁定
ExcessiveAttemptsException:登录失败次数过多
ExpiredCredentialsException:凭证过期