前言
虽然做了不少用Shiro为安全框架的项目,但是都没对Shiro做个什么研究。刚好最近有个项目,领导希望我能把Shiro框架吃透。Shiro作为一个开源框架,一直听说其源码不难读懂。我想把在activiti中学习源码的经验,也搬到Shiro上。通过源码去认知Shiro,而不是各种文档、百度去了解。因此这系列的文章,会穿插不少源码分析,对于源码无感的读者,请忽略源码解读部分。本系列文章会使用Shiro1.5.3版本,集成开发环境使用eclipse 4.15.0版本。
Shiro的maven配置与快速开始
maven配置
Shiro入门的开发很简单,新建一个maven项目,在pom文件中添加shiro-core即可。因为本次例子我们会考虑连接数据库,所以mysql连接驱动以及druid连接池也会导入,还有junit作为测试。pom.xml如下:
<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.sadoshi.shiro</groupId>
<artifactId>shiro-ini</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.3</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>1.5.3</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.25</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>0.2.23</version>
</dependency>
</dependencies>
</project>
使用ini配置文件
使用ini配置文件作为Shiro的安全认证及授权是Shiro最基本的配置方式。先在resource目录下新建shiro.ini文件:
[users]
zhang=123
wang=123
这里很简单,只是定义了两个用户,一个叫zhang,一个叫wang,他们的密码都是123。接着我们写一个测试类App.java:
public class App{
@Test
public void testHelloworld() {
Environment env = new BasicIniEnvironment("classpath:shiro.ini");
org.apache.shiro.mgt.SecurityManager
org.apache.shiro.mgt.SecurityManager securityManager = env.getSecurityManager();
SecurityUtils.setSecurityManager(securityManager);
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken("zhang", "123");
try {
subject.login(token);
} catch (AuthenticationException e) {
e.printStackTrace();
}
subject.logout();
}
}
5-7行获取securityManager。在旧版和网上例子中(包括官方例子)都是使用IniSecurityManagerFactory进行初始化。但这个类实际上已被废弃,官方建议是使用Environment进行初始化(PS:但官方给的例子令这种说法毫无说服力)。通过subject获取ini文件里配置的账号密码信息,然后第12行与创建的token信息进行登录验证。创建的token可以理解为用户登录时填写的用户名密码信息。如果没有抛出异常,则证明登录成功。以上就是最简单的Shiro登录验证方式。
使用数据库配置
通常项目中,我们很少会把账户密码、授权等信息写在配置文件里面,绝大多数情况是写在数据库里面的。一般的教程极少用数据库作为例子,因为涉及到建表、表结构等等问题,篇幅会比较大,通常读者需要通过理解ini配置文件,再研究如何通过数据库实现。本系列文章也不例外,但是在初学阶段,还是会写写关于数据库配置方法的使用。
首先执行以下sql创建数据库及数据表:
drop database if exists shiro;
create database shiro;
use shiro;
create table users (
id bigint auto_increment,
username varchar(100),
password varchar(100),
password_salt varchar(100),
constraint pk_users primary key(id)
) charset=utf8 ENGINE=InnoDB;
为users表添加如下记录:

接着编写ini配置shiro-jdbc-realm.ini:
[main]
jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm
dataSource=com.alibaba.druid.pool.DruidDataSource
dataSource.driverClassName=com.mysql.jdbc.Driver
dataSource.url=jdbc:mysql://localhost:3306/shiro
dataSource.username=root
#dataSource.password=
jdbcRealm.dataSource=$dataSource
securityManager.realms=$jdbcRealm
然后编写测试类:
public class App{
@Test
public void testJDBCRealm() {
Factory<org.apache.shiro.mgt.SecurityManager> factory =
new IniSecurityManagerFactory("classpath:shiro-jdbc-realm.ini");
org.apache.shiro.mgt.SecurityManager securityManager = factory.getInstance();
SecurityUtils.setSecurityManager(securityManager);
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken("zhang", "123");
try {
subject.login(token);
} catch (AuthenticationException e) {
e.printStackTrace();
}
Assert.assertEquals(true, subject.isAuthenticated());
subject.logout();
}
}
这个测试类使用IniSecurityManagerFactory初始化的方式获取securityManager,和上面的例子Environment初始化效果一样。实际上Environment也是调用IniSecurityManagerFactory来初始化的。不过IniSecurityManagerFactory作为被废弃的方式,还是尽量使用Environment为好。
可以看到数据库配置方式总体上和ini配置方式没什么区别。我们在代码中并未指定保存的账户密码的地方和字段,但Shiro能找到是users表的username和password字段,显然这是Shiro源码的默认方式,后面源码分析的时候我们会看看是怎么回事。
小结
本文内容不多,是Shiro最基本的入门文章,也是希望自己和读者都一步一步去了解Shiro,而不是上来就中高级。另外也发现ini文件中有很多东西可以配置,Shiro也会默认很多配置。对于想驾驭Shiro的程序员来说,这些都非常值得我们去探索。
对于其内部机制的思考,留下了三个问题:
1、ini文件是怎么读入并被初始化?
2、securityManager具体是用哪个实现类,是怎么初始化得来的?
3、默认Realm是什么,怎么来的?
后面的文章将去分析这三个问题。
本文介绍Shiro安全框架的基本配置和使用方法,包括通过ini文件和数据库进行认证授权的步骤,适合初学者逐步掌握Shiro。
1148

被折叠的 条评论
为什么被折叠?



