Shiro之通过数据库验证身份

前言

参考百度上说的Apache Shiro是一个强大易用的java安全框架,提供了认证、授权、加密和会话管理功能,可以为任何应用提供安全保障,而其主要为解决以下四个问题:
1、 认证-用户身份识别,常被称为用户登录
2、 授权-访问控制
3、 密码加密-保护或隐藏数据防止被偷窥
4、 会话管理-每用户相关的时间敏感的状态

身份认证流程

以下是从其官网上截取的原理图
Alt text

Subject认证主体

其中认证主体包含两个信息:
Principals: 身份,可以是用户名,邮件,手机号码等等,用来标识一个登陆主体身份;
Credentials: 凭证,常见有密码,数字证书等等;

Realm&JDBC&Reaml

Realm:意思是域,Shiro从Reaml中获取验证数据;
Realm有很多种类,例如常见的jdbc realm

码上有戏

1.在eclipse中新建一个maven工程,并且配置pom.xml
主要配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<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.12</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.37</version>
</dependency>
</dependencies>

主要有shiro的核心包、日志包,数据源及数据库连接包

  1. 在resource包下新建jdbc_realm.ini用于配置从数据库中获取验证数据
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    [main] //声明以下是代码片段
    //相当于new了一个jdbcRealm类
    jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm
    //声明一个数据源,这里用了c3p0
    dataSource=com.mchange.v2.c3p0.ComboPooledDataSource
    //声明驱动
    dataSource.driverClass=com.mysql.jdbc.Driver
    //声明url,其中localhost可更改为ip地址
    dataSource.jdbcUrl=jdbc:mysql://localhost:9806/db_shiro
    //配置数据库用户名、密码
    dataSource.user=root
    dataSource.password=root
    //添加数据源
    jdbcRealm.dataSource=$dataSource
    //添加数据域
    securityManager.realms=$jdbcRealm

这里数据库中需要注意的是,数据库中的表名必须为users,并且字段必须为userName和password

  1. 在src/main/java文件下新建一个HelloWorld类,目前数据这里手动构造一个
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    package com.zwl.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 HelloWorld {
    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("admin", "123456");
    try {
    //身份认证
    currentUser.login(token);
    System.out.println("身份认证成功!");
    } catch (AuthenticationException e) {
    e.printStackTrace();
    System.out.println("身份认证失败!");
    }
    // 退出
    currentUser.logout();
    }
    }

这里通过更改token来模拟验证数据是否正确

相关源代码,已放在github

热评文章