在《一头扎进Shiro-HelloWorld》中介绍了将用户信息保存在Subject认证主体,用shiro.ini模拟数据库记录用户名、密码信息完成验证的过程,这篇文章我们将讲解如何通过Realm完成shiro的身份验证。
首先我们介绍下Subject认证主体。
Subject认证主体包含两个信息:
Principals:身份,可以是用户名,邮件,手机号码等等,用来标识一个登录主体身份;
Credentials:凭证,常见有密码,数字证书等等;
然后我们通过下图了解下shiro的身份认证流程。
在过程5中,我们介绍shiro的realm机制。
Realm:意思是域,Shiro从 Realm中获取验证数据;
Realm 有很多种类,例如常见的jdbc realm,jndi realm,text realm。这篇文章我们主要介绍jdbcRealm。
接着我们需要在项目的pom文件中添加对mysql连接驱动和c3p0数据库连接池的依赖:
<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.shiro</groupId>
<artifactId>Shiro01</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Shiro01</name>
<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.12</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.37</version>
</dependency>
</dependencies>
</project>
然后
我们创建jdbc_realm.ini文件,用于配置jdbcRealm:
[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/db_shiro
dataSource.user=root
dataSource.password=root
jdbcRealm.dataSource=$dataSource
securityManager.realms=$jdbcRealm
最后我们通过main方法测试jdbcRealm连接:
package com.tgb.shiro;
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 JdbcRealmRest {
public static void main(String[] args) {
// 初始化SecurityFactory工厂
Factory<SecurityManager> factory = new IniSecurityManagerFactory(
"classpath:jdbc_realm.ini");
// 获取SessionFactory实例
SecurityManager securityManager = factory.getInstance();
// 把SecurityManager实例绑定到SecurityUtils
SecurityUtils.setSecurityManager(securityManager);
// 获得当前执行的用户
Subject currentUser = SecurityUtils.getSubject();
// 创建token令牌,用户名/密码
UsernamePasswordToken token = new UsernamePasswordToken("java1234",
"123456");
try {
//身份认证
currentUser.login(token);
System.out.println("身份认证成功!");
} catch (AuthenticationException e) {
e.printStackTrace();
System.out.println("身份认证失败!");
}
}
}
至此,我们完成了shiro的jdbcRealm的身份认证。