什么是认证
也就是身份认证,就是判断一个用户是否为合法用户的处理过程,通过核对用户输入的用户名和口令,看其是否与系统中存储的该用户的用户名和口令是否一致,来判断用户的身份是否正确。
关键对象
对面名称 | 概述 |
---|---|
Subject(主体) | 用户 |
Principal(身份信息) | 是主体(Subject)进行身份认证的标识,标识必须具有唯一性,如用户名、手机号、邮箱地址等 |
Credential(凭证信息) | 是只有主体自己知道的安全信息,如密码、证书等 |
使用 ini 完成认证
在 Maven 中添加依赖 jar包,修改 pom.xml 依赖如下所示:
代码语言:html复制<dependencies>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.4.0</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
logging
依赖是 Shiro 所依赖的包你尽管添加就行。
在 resources
下 添加 Shiro.ini 配置文件,首先准备一些用户身份和凭据信息(Shiro.ini)内容如下所示:
[users]
Yby6=1234
Yangbuyi=1234
如上是在 Shiro.ini 中定义了两个用户一个是 Yby6 一个是 Yangbuyi 密码为 1234
登录和退出
如上图的步骤分别为如下所解释的:
- 构建
SecurityManager
工厂 - 在通过工厂创建
SecurityManager
- 在将 SecurityManager 设置到运行环境中
- 在创建一个 Subject 实例
- 在创建 Token 令牌
- 用户登录
- 用户退出
最终代码如下所示:
代码语言:java复制/**
* @author yby6
*/
public class Demo {
public static void main(String[] args) {
IniSecurityManagerFactory factory = new IniSecurityManagerFactory("classpath:shiro.ini");
SecurityManager securityManager = factory.getInstance();
SecurityUtils.setSecurityManager(securityManager);
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken("yby6", "1234");
try {
subject.login(token);
} catch (UnknownAccountException e) {
System.out.println("用户名不存在");
e.printStackTrace();
} catch (IncorrectCredentialsException e) {
System.out.println("密码错误");
e.printStackTrace();
}
System.out.println("是否认证" subject.isAuthenticated());
subject.logout();
System.out.println("是否认证" subject.isAuthenticated());
}
}
认证流程图
认证代码执行流程
- 调用
subject.login
方法进行登录,其会自动委托给securityManager.login
方法进行登录。
- securityManager 通过 Authenticator(认证器)进行认证。
- Authenticator 的实现 ModularRealmAuthenticator 调用 Realm 从 ini 配置文件中取用户真实的账号和密码。
- IniRealm 先根据 token 中的账号去 ini 中找该账号,如果找不到则给 ModularRealmAuthenticator 返回 null,如果找到则匹配密码,匹配密码成功则认证通过。
- 最后调用
Subject.logout
进行退出操作。
最后
本期结束咱们下次再见