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

来源:互联网 发布:数据输入 编辑:程序博客网 时间:2024/05/29 08:09

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

本文我们将来介绍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.JdbcRealmdataSource = com.mchange.v2.c3p0.ComboPooledDataSourcedataSource.driverClass=com.mysql.jdbc.DriverdataSource.jdbcUrl=jdbc:mysql://localhost:3306/shirodataSource.user=rootdataSource.password=1234jdbcRealm.dataSource=$dataSourcesecurityManager.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 实例绑定到SecurityUtilsSecurityUtils.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.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







1 0