[本系列文章是博主的学习笔记,而非经典教程,特此说明]
本文我们将来介绍shiro中基础常用的身份认证,我们将会通过实例的方式来说明shiro身份认证的流程和机制。
准备工作:
a.操作系统:win7 x64
b.开发工具:myeclipse 2014,jdk1.7,maven3.3.3,mysql5.0
-------------------------------------------------------------------------------------------------------------------------------------
正文开始:
1.创建shiro02工程,工程结构如下:【jdk显示为1.5的缘由上文中已经叙述,请读者自行查阅】
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下就可以看到如下内容,如果有遗漏,请读者认真检查。
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,列的名称必须按照下面的规则创建,注意大小写,具体内容如下:
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身份验证的过程。在这里,我们首先需要从官方文档中查看这部分内容的介绍:
a.第一步,调用Subject.login(token)进行登陆,其会自动委托给Security Manager,调用之前,必须进行SecurityUtils.set SecurityManager()设置。
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