菜鸟学习shiro之用数据库作为Realm的认证源实现登录,角色身份的判定和权限验证3

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
数据传输服务 DTS,数据迁移 small 3个月
推荐场景:
MySQL数据库上云
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
简介: Maven的的依赖和第一篇是一样的副本直接用上两篇讲的无论是内部类的封装领域还是配置文件的认证源,这篇开始讲最关心的数据库作为境界的认证源这里使用的是四郎给我们提供的另一个内置的类JdbcRealm这个是连接数据库的一个内部类,话不多说了,具体的代码如下:import com.

Maven的的依赖和第一篇是一样的副本直接用

上两篇讲的无论是内部类的封装领域还是配置文件的认证源,这篇开始讲最关心的数据库作为境界的认证源

这里使用的是四郎给我们提供的另一个内置的类JdbcRealm这个是连接数据库的一个内部类,话不多说了,

具体的代码如下:

import com.alibaba.druid.pool.DruidDataSource;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.realm.jdbc.JdbcRealm;
import org.apache.shiro.realm.text.IniRealm;
import org.apache.shiro.subject.Subject;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class JdbcRealmTest {

    DruidDataSource druidDataSource = new DruidDataSource();
    {

        druidDataSource.setUrl("jdbc:mysql://localhost:3306/test");
        druidDataSource.setUsername("root");
        druidDataSource.setPassword("root");
    }

    @Test
    public void testAuthenticationTest() {

        // 设置内置的jdbc
        JdbcRealm jdbcRealm = new JdbcRealm();
        jdbcRealm.setDataSource(druidDataSource);
        // 权限数据的开关
        jdbcRealm.setPermissionsLookupEnabled(true);

        String sql = "select password from test_user where username = ?";
        jdbcRealm.setAuthenticationQuery(sql);

        String roleSql = "select role_name from test_user_role where user_name = ?";
        jdbcRealm.setUserRolesQuery(roleSql);

        // 1.构建SecurityManager环境
        DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
        defaultSecurityManager.setRealm(jdbcRealm);

        // 2.主体提交认证请求
        SecurityUtils.setSecurityManager(defaultSecurityManager);
        Subject subject = SecurityUtils.getSubject();

        // 这个是需要认证的信息
        UsernamePasswordToken token = new UsernamePasswordToken("xiaoming","654321");
        subject.login(token);

        System.out.println("isAuthenticated="+subject.isAuthenticated());

        //subject.logout();
        /*subject.checkRole("admin");

        subject.checkPermission("user:select");*/
        subject.checkRole("user");
    }
}
具体的数据库文件:

/ *
 Navicat Premium数据传输

 源服务器:根源
 服务器类型:MySQL的的
 源服务器版本:50722
 源主机:本地主机:3306
 源架构:测试

 目标服务器类型:MySQL的的
 目标服务器版本:50722
 文件编码:65001

 日期:28/07/2018 08:18:03
* /

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

- ----------------------------
- roles_permissions的表结构
- ------------ --- -------------
DROP TABLE IF EXISTS`coole_permissions`;
CREATE TABLE`colces_permissions`(
  `id` int(11)NOT NULL AUTO_INCREMENT,
  `role_name` varchar(255)CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
  `permission` varchar(255)CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
  PRIMARY KEY(`id`)使用BTREE
)ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;

- ----------------------------
- roles_permissions的记录
- ------------- --- ------------
插入`roles_permissions` VALUES(1,'admin','user:select');

SET FOREIGN_KEY_CHECKS = 1;
-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ------------

/ *
 Navicat Premium数据传输

 源服务器:根源
 服务器类型:MySQL的的
 源服务器版本:50722
 源主机:本地主机:3306
 源架构:测试

 目标服务器类型:MySQL的的
 目标服务器版本:50722
 文件编码:65001

 日期:28/07/2018 08:18:17
* /

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

- ----------------------------
- test_user的表结构
- ------------ --- -------------
DROP TABLE IF EXISTS`test_user`;
CREATE TABLE`test_user`(
  `username` varchar(255)CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
  `password` varchar(255)CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL
)ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT =动态;

- ----------------------------
- test_user的记录
- ------------- --- ------------
插入`test_user` VALUES('xiaoming','654321');

SET FOREIGN_KEY_CHECKS = 1;
-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -----------------

/ *
 Navicat Premium数据传输

 源服务器:根源
 服务器类型:MySQL的的
 源服务器版本:50722
 源主机:本地主机:3306
 源架构:测试

 目标服务器类型:MySQL的的
 目标服务器版本:50722
 文件编码:65001

 日期:28/07/2018 08:18:26
* /

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

- ----------------------------
- test_user_role的表结构
- ------------ --- -------------
DROP TABLE IF EXISTS`test_user_role`;
CREATE TABLE`test_user_role`(
  `user_name` varchar(255)CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
  `role_name` varchar(255)CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL
)ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT =动态;

- ----------------------------
- test_user_role的记录
- ------------- --- ------------
插入`test_user_role` VALUES('xiaoming','user');

SET FOREIGN_KEY_CHECKS = 1;
-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ----------------

/ *
 Navicat Premium数据传输

 源服务器:根源
 服务器类型:MySQL的
 源服务器版本:50722
 源主机:本地主机:3306
 源架构:测试

 目标服务器类型:MySQL的
 目标服务器版本:50722
 文件编码:65001

 日期:28/07/2018 08:18:32
* /

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

- ----------------------------
- user_roles的表结构
- ------------ ----------------
DROP TABLE IF EXISTS`user_roles`;
CREATE
  TABLE`user_roles` (`id` int(11)NOT NULL AUTO_INCREMENT,
  `username` varchar(255)CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
  `role_name` varchar(255)CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
  PRIMARY KEY(`id`)使用BTREE
)ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;

- ----------------------------
- user_roles的记录
- ------------- ---------------
INSERT INTO`user_roles` VALUES(1,'Mark','admin');

SET FOREIGN_KEY_CHECKS = 1;
-------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ------------------

/ *
 Navicat Premium数据传输

 源服务器:根源
 服务器类型:MySQL
 源服务器版本:50722
 源主机:localhost:3306
 源架构:测试

 目标服务器类型:MySQL
 目标服务器版本:50722
 文件编码:65001

 日期:28/07/2018 08:18:41
* /

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

- ----------------------------
- 用户表结构
- ------------ ---- ------------
DROP TABLE IF EXISTS`users`;
CREATE
  TABLE`user`(`id` int(11)NOT NULL AUTO_INCREMENT,
  `username` varchar(255)CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
  `password` varchar(255)CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL,
  PRIMARY KEY(`id`)使用BTREE
)ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;

- ----------------------------
- 用户记录
- ------------- ---- -----------
插入`users` VALUES(1,'Mark','123456');

SET FOREIGN_KEY_CHECKS = 1;

执行流程和前两篇一样。

 

相关实践学习
MySQL数据库DTS迁移上云
利用DTS数据迁移工具完成RDS实例间的数据迁移。
Sqoop 企业级大数据迁移方案实战
Sqoop是一个用于在Hadoop和关系数据库服务器之间传输数据的工具。它用于从关系数据库(如MySQL,Oracle)导入数据到Hadoop HDFS,并从Hadoop文件系统导出到关系数据库。 本课程主要讲解了Sqoop的设计思想及原理、部署安装及配置、详细具体的使用方法技巧与实操案例、企业级任务管理等。结合日常工作实践,培养解决实际问题的能力。本课程由黑马程序员提供。
相关文章
|
3天前
|
SQL 存储 Java
SQL数据库学习指南:从基础到高级
SQL数据库学习指南:从基础到高级
|
3天前
|
SQL Oracle 关系型数据库
数据库基础教程的全面总结与学习路径
数据库基础教程的全面总结与学习路径
|
4天前
|
运维 数据管理 数据库
数据管理DMS产品使用合集之遇到报错:数据库账号没有权限执行,该如何排查
阿里云数据管理DMS提供了全面的数据管理、数据库运维、数据安全、数据迁移与同步等功能,助力企业高效、安全地进行数据库管理和运维工作。以下是DMS产品使用合集的详细介绍。
14 2
|
4天前
|
SQL 弹性计算 数据管理
数据管理DMS产品使用合集之sql server实例,已经创建了数据库,登录时提示实例已存在,该怎么处理
阿里云数据管理DMS提供了全面的数据管理、数据库运维、数据安全、数据迁移与同步等功能,助力企业高效、安全地进行数据库管理和运维工作。以下是DMS产品使用合集的详细介绍。
19 1
|
6天前
|
关系型数据库 MySQL 分布式数据库
PolarDB产品使用问题之要验证MySQL迁移后的数据库数据与迁移前的数据一致性,该怎么办
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
PolarDB产品使用问题之要验证MySQL迁移后的数据库数据与迁移前的数据一致性,该怎么办
|
8天前
|
Java 数据库连接 数据库
深入探索:Java连接池在数据库性能优化中的角色
【6月更文挑战第24天】Java应用中,数据库连接池如HikariCP提升性能,减少资源消耗。连接池预创建并管理连接,避免频繁创建/关闭。工作流程:申请连接→池中取或新建→使用后归还给池。示例展示了如何配置及使用HikariCP连接池,强调了其在高并发环境中的重要性。选择合适连接池并优化配置对系统性能至关重要。
|
8天前
|
SQL 数据库 数据库管理
逆向学习数据库篇:多表查询技术详解
逆向学习数据库篇:多表查询技术详解
9 0
|
8天前
|
存储 数据库连接 数据库
逆向学习数据库篇:表设计和数据库操作的核心概念与流程
逆向学习数据库篇:表设计和数据库操作的核心概念与流程
11 0
|
1天前
|
SQL 存储 关系型数据库
MySQL数据库—初识数据库 | DDL语句 | DML语句
MySQL数据库—初识数据库 | DDL语句 | DML语句
|
1天前
|
Java 关系型数据库 MySQL
使用MySQL JDBC连接数据库
使用MySQL JDBC连接数据库