Apache shiro 笔记整理之身份认证

时间:2022-03-19 03:18:30

以下内容是在看了涛哥的《跟我一起学shiro》 和 视频《一头扎入进shiro》 后整理出来备忘和方便自己和其他人学习。

个人主页:http://www.itit123.cn/ 更多干货等你来拿

身份认证流程图:

Apache shiro 笔记整理之身份认证

Subject认证主体,主要包含身份和凭证:

principals:身份,用来标识登录用户的主体身份。

credentials:凭证,比如密码之类用来证明用户。


realm:域,shiro从域中验证数据。

从数据库中读取用户信息进行用户验证

第一步:创建数据表(该表名貌似只能用users,大家可以试试)

DROP TABLE IF EXISTS `shiro_user`;
CREATE TABLE `shiro_user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`username` varchar(255) DEFAULT NULL,
`password` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

第二步:导入相关的jar包

<dependencies>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.2.4</version>
</dependency>

<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.16</version>
</dependency>

<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>

<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.22</version>
</dependency>
</dependencies>


第三步:配置ini文件

[main]配置代码,[users]配置用户角色

[main]
;注:不要在结尾处使用";" 。 "." 相当于 set方法 。 引用对象需要加"$"
;定义jdbcRealm实例
jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm
;配置数据源c3p0
dataSource=com.mchange.v2.c3p0.ComboPooledDataSource
;加载驱动
dataSource.driverClass=com.mysql.jdbc.Driver
;链接数据库
dataSource.jdbcUrl=jdbc:mysql://localhost:3306/shiro
;数据库帐号密码
dataSource.user=root
dataSource.password=root
;设置数据源
jdbcRealm.dataSource=$dataSource
;设置realm
securityManager.realms=$jdbcRealm


第四步:和HelloWorld代码相似,只是数据是从数据库中读取

package com.shiro.class01;

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;

public class HelloWorld {

public static void main(String[] args) {
// 1.读取配置文件,初始化SecurityManager工厂
Factory<SecurityManager> factory=new IniSecurityManagerFactory("classpath:jdbc_realm.ini");
// 2.获取securityManager实例
SecurityManager securityManager=factory.getInstance();
// 3.把securityManager实例绑定到SecurityUtils
SecurityUtils.setSecurityManager(securityManager);
// 4.获取当前执行的用户
Subject currentUser=SecurityUtils.getSubject();
// 5.创建token令牌,用户名/密码
UsernamePasswordToken token=new UsernamePasswordToken("ITDragon", "123456");
try{
// 6.登录时认证身份
currentUser.login(token);
System.out.println("身份认证成功!");
}catch(AuthenticationException e){
e.printStackTrace();
System.out.println("身份认证失败!");
}
// 7.退出
currentUser.logout();
}

}


遇到的问题:

1.Unknown character set: 'utf8mb4' ;将mysql-connector-java 版本换低点即可。

2.Table 'shiro.users' doesn't exist ;貌似表名只能为users,不然找不到。