shiro入门实战笔记(3)--身份认证

时间:2021-01-27 15:19:22

[本系列文章是博主的学习笔记,而非经典教程,特此说明]

本文我们将来介绍shiro中基础常用的身份认证,我们将会通过实例的方式来说明shiro身份认证的流程和机制。

准备工作:

a.操作系统:win7 x64

b.开发工具:myeclipse 2014,jdk1.7,maven3.3.3,mysql5.0

-------------------------------------------------------------------------------------------------------------------------------------

正文开始:

1.创建shiro02工程,工程结构如下:【jdk显示为1.5的缘由上文中已经叙述,请读者自行查阅】

shiro入门实战笔记(3)--身份认证

2.我们接着来引入本例中所需要的jar包,pom文件的内容如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.java.shiro</groupId>
<artifactId>shiro02</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>shiro02</name>
<description>shiro02</description>
<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.13</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.38</version>
</dependency>
</dependencies>

</project>
写入上面的依赖,保存,maven会帮助我们自动的下载相关的包。下载号之后,我们在工程的maven dependencies下就可以看到如下内容,如果有遗漏,请读者认真检查。

shiro入门实战笔记(3)--身份认证

3.创建jdbc_realm.ini配置文件,位置在src/main/resources下,请注意,一定按照如下的格式书写:

[main]
jdbcRealm = org.apache.shiro.realm.jdbc.JdbcRealm
dataSource = com.mchange.v2.c3p0.ComboPooledDataSource
dataSource.driverClass=com.mysql.jdbc.Driver
dataSource.jdbcUrl=jdbc:mysql://localhost:3306/shiro
dataSource.user=root
dataSource.password=1234
jdbcRealm.dataSource=$dataSource
securityManager.realms=$jdbcRealm
现在,我们来逐一解释配置文件中的配置项的含义:

[main]:主体配置信息,后续还有别的配置。可以理解为保留字。shiro就是这么规定的,非这么写不可

jdbcRealm:固定配置,使用数据库作为用户信息的来源时,需要引用shiro包中的类

dataSource:数据源。此处可选的内容较多,在此以稳定性较好的c3p0为例。

dataSource.driverClass:数据库驱动,此处与本机使用的数据库保持一致

dataSource.jdbcUrl:数据库地址

dataSource.User:数据库用户名

dataSource.password:数据库用户对应的密码

jdbcRealm.dataSource:对我们在上面配置类中的常量赋值

securityManager.realms:对我们在上面配置类中的常量赋值

4.创建数据库:

上面我们已经显示了我们创建的示例代码使用的数据库名称为shiro,读者可以按照自己的兴趣起名字。注意表的名称必须为users,列的名称必须按照下面的规则创建,注意大小写,具体内容如下:

shiro入门实战笔记(3)--身份认证

5.创建log4j配置文件,配置内容在上文中已经叙述,本文就不再贴出代码了,请读者自行查阅。

6.创建JDBCRealm.java文件,代码我们基于上文的hellworld来编写:

package com.shiro.test;


import org.apache.shiro.SecurityUtils;
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 JDBCRealm{
public static void main(String[] args) {
//读取配置文件,初始化SecurityManager工厂
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:jdbc_realm.ini");
//获取SecurityManager实例
SecurityManager securityManager = factory.getInstance();
//把securityManager 实例绑定到SecurityUtils
SecurityUtils.setSecurityManager(securityManager);
//得到当前用户
Subject currentUser = SecurityUtils.getSubject();
//创建token令牌,用户名/密码
UsernamePasswordToken token = new UsernamePasswordToken("shiro01","1234");

try {
//登陆
currentUser.login(token);
System.out.println("success");
} catch (Exception e) {
e.printStackTrace();
System.out.println("fail");
}
//推出
currentUser.logout();
}
}
7.运行结果我们在此不在贴出,请读者自行查看。

9.下面,我们来说明shiro身份验证的过程。在这里,我们首先需要从官方文档中查看这部分内容的介绍:

shiro入门实战笔记(3)--身份认证

a.第一步,调用Subject.login(token)进行登陆,其会自动委托给Security Manager,调用之前,必须进行SecurityUtils.setSecurityManager()设置。

b.第二步,Security Manager负责真正的身份验证逻辑,它会委托给Authenticator进行身份验证。

c.第三步,Authenticator才是真正的身份验证者,shiro api中核心的身份认证入口,这里我们也可以自定义实现。

d.第四步,Authenticator可能会委托相应的Authentication Strategy进行多个realm身份认证,默认ModularRealmAuthenticator会调用Authentication Strategy进行多realm身份认证。

e.第五步,Authenticator会把相应的token传入realm,从realm中获取身份验证信息,如果没有返回,或者发生异常表示身份验证失败。此处可以配置多个realm,按照相应的顺序进行策略进行访问。这里realm可以理解为身份信息的来源。比如,我们在上文中从shiro.ini配置文件中获取用户信息,本文中我们从数据库中获取用户信息。我们使用的就是所谓的“realm”。

在此,有一个特别之处,其会在上文示例代码中的token中包含,并且在身份认证流程中使用。就是:

用户的身份:principals,即区分用户的主键,常用的如用户名,手机号,邮箱等。本例中为“shiro01”

用户的凭证:credentials,即证明“我就是我”的证明,常见的如密码,数字令牌,短信验证码等。本例中为“1234

-------------------------------------------------------------------------------------------------------

至此,shiro入门实战笔记(3)--身份认证结束

备注:

在本文中,我们已经基本介绍了shiro身份认证的基本流程,希望读者已经对上述的过程有了一个简单的了解,对于多个realm的使用等,由于博主目前只学习及实现到本文,后续如有深入研究,博主会继续更新此部分内容,敬请期待!

参考资料:

官方文档:http://shiro.apache.org/documentation.html

其他博文:http://jinnianshilongnian.iteye.com/blog/2018936