第一个程序用户认证

相关配置

由于现在还不需要整合到SSM中,所以直接创建maven的quickstart就可以了

引入相关依赖,并且调整一下Java的目录结构

1
2
3
4
5
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.7.0</version>
</dependency>

还需要引入shiro的配置文件,配置文件后缀为.ini结尾的文件 shiro对名字和位置没有过于严格的要求 只需要放在当前项目下的任意位置即可

在整合了Spring boot后,是不需要这个配置文件的 只是在学习过程中使用

shiro.ini

1
2
3
4
[users]
xiaochen=123
zhangsan=123456
lisi=789

[users]是写死的,后面的数据必须以键值对的方式来写

测试

  1. 创建安全管理器对象

  2. 给安全管理器设置realm

  3. SecurityUtils 给全局安全工具类设置安全管理器

  4. 关键对象 subject 主体

  5. 创建令牌

创建一个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
40
package 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

这异常就是密码错误