第一个程序用户认证
相关配置
由于现在还不需要整合到SSM中,所以直接创建maven的quickstart就可以了
引入相关依赖,并且调整一下Java的目录结构
1 | <dependency> |
还需要引入shiro的配置文件,配置文件后缀为.ini
结尾的文件 shiro对名字和位置没有过于严格的要求 只需要放在当前项目下的任意位置即可
在整合了Spring boot后,是不需要这个配置文件的 只是在学习过程中使用
shiro.ini1
2
3
4[users]
xiaochen=123
zhangsan=123456
lisi=789
[users]是写死的,后面的数据必须以键值对的方式来写
测试
创建安全管理器对象
给安全管理器设置realm
SecurityUtils 给全局安全工具类设置安全管理器
关键对象 subject 主体
创建令牌
创建一个TestAuthenticator类1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40package com.ceit;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.realm.text.IniRealm;
import org.apache.shiro.subject.Subject;
public class TestAuthenticator {
public static void main(String[] args) {
//1. 创建安全管理器对象
DefaultSecurityManager securityManager = new DefaultSecurityManager();
//2. 给安全管理器设置realm
securityManager.setRealm(new IniRealm("classpath:shiro.ini"));
//3. SecurityUtils 给全局安全工具类设置安全管理器
SecurityUtils.setSecurityManager(securityManager);
//4. 关键对象 subject 主体
Subject subject = SecurityUtils.getSubject();
//5. 创建令牌
UsernamePasswordToken token = new UsernamePasswordToken("xiaochen","123");
try {
System.out.println("认证状态:"+subject.isAuthenticated());
subject.login(token); //用户认证
System.out.println("认证状态:"+subject.isAuthenticated());
}catch (UnknownAccountException e){
e.printStackTrace();
System.out.println("用户名不存在");
}catch (IncorrectCredentialsException e){
e.printStackTrace();
System.out.println("密码错误");
}
}
}
这里踩了一个坑 提示了报错1
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder
查了一下只需要maven引入依赖即可1
2
3
4
5<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.7.2</version>
</dependency>
正常认证通过的话,是不会有异常抛出的
运行结果1
2认证状态:false
认证状态:true
如果没有认证通过1
org.apache.shiro.authc.UnknownAccountException
则会直接抛出这样的异常 异常的意思就是用户名不存在
如果是用户名正确而密码不正确就会抛出1
org.apache.shiro.authc.IncorrectCredentialsException
这异常就是密码错误