Shiro学习(一)——Shiro配置与快速开始

Shiro 专栏收录该内容
7 篇文章 0 订阅

前言

虽然做了不少用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是什么,怎么来的?

后面的文章将去分析这三个问题。

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值