本文共 2578 字,大约阅读时间需要 8 分钟。
在中介绍了将用户信息保存在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数据库连接池的依赖:
然后 我们创建jdbc_realm.ini文件,用于配置jdbcRealm:4.0.0 com.shiro Shiro01 0.0.1-SNAPSHOT Shiro01 org.apache.shiro shiro-core 1.2.4 org.slf4j slf4j-log4j12 1.7.12 c3p0 c3p0 0.9.1.2 commons-logging commons-logging 1.2 mysql mysql-connector-java 5.1.37
[main]jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealmdataSource=com.mchange.v2.c3p0.ComboPooledDataSourcedataSource.driverClass=com.mysql.jdbc.DriverdataSource.jdbcUrl=jdbc:mysql://localhost:3306/db_shirodataSource.user=rootdataSource.password=rootjdbcRealm.dataSource=$dataSourcesecurityManager.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至此,我们完成了shiro的jdbcRealm的身份认证。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("身份认证失败!"); } }}