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

本文涉及的产品
数据传输服务 DTS,数据迁移 small 3个月
推荐场景:
MySQL数据库上云
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: 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");
    }
}
具体的数据库文件:
AI 代码解读

/ *
 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;

执行流程和前两篇一样。

 

相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
Sqoop 企业级大数据迁移方案实战
Sqoop是一个用于在Hadoop和关系数据库服务器之间传输数据的工具。它用于从关系数据库(如MySQL,Oracle)导入数据到Hadoop HDFS,并从Hadoop文件系统导出到关系数据库。 本课程主要讲解了Sqoop的设计思想及原理、部署安装及配置、详细具体的使用方法技巧与实操案例、企业级任务管理等。结合日常工作实践,培养解决实际问题的能力。本课程由黑马程序员提供。
目录
打赏
0
相关文章
有哪些方法可以验证用户输入数据的格式是否符合数据库的要求?
有哪些方法可以验证用户输入数据的格式是否符合数据库的要求?
119 75
|
1月前
|
学习 MongoDB:打开强大的数据库技术大门
MongoDB 是一个基于分布式文件存储的文档数据库,由 C++ 编写,旨在为 Web 应用提供可扩展的高性能数据存储解决方案。它与 MySQL 类似,但使用文档结构而非表结构。核心概念包括:数据库(Database)、集合(Collection)、文档(Document)和字段(Field)。MongoDB 使用 BSON 格式存储数据,支持多种数据类型,如字符串、整数、数组等,并通过二进制编码实现高效存储和传输。BSON 文档结构类似 JSON,但更紧凑,适合网络传输。
71 15
springboot整合springsecurity,从数据库中认证
本文介绍了如何在SpringBoot应用中整合Spring Security,并从数据库中进行用户认证的完整步骤,包括依赖配置、数据库表创建、用户实体和仓库接口、用户详情服务类、安全配置类、控制器类以及数据库初始化器的实现。
289 3
springboot整合springsecurity,从数据库中认证
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。同时,文章还对比了编译源码安装与使用 RPM 包安装的优缺点,帮助读者根据需求选择最合适的方法。通过具体案例,展示了编译源码安装的灵活性和定制性。
248 2
数据库学习
【10月更文挑战第8天】
37 1
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
这篇文章是关于如何使用Django框架配置MySQL数据库,创建模型实例,并自动或手动创建数据库表,以及对这些表进行操作的详细教程。
126 0
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
springboot学习五:springboot整合Mybatis 连接 mysql数据库
这篇文章是关于如何使用Spring Boot整合MyBatis来连接MySQL数据库,并进行基本的增删改查操作的教程。
498 0
springboot学习五:springboot整合Mybatis 连接 mysql数据库
springboot学习四:springboot链接mysql数据库,使用JdbcTemplate 操作mysql
这篇文章是关于如何使用Spring Boot框架通过JdbcTemplate操作MySQL数据库的教程。
176 0
springboot学习四:springboot链接mysql数据库,使用JdbcTemplate 操作mysql
"Nacos 2.1.0版本数据库配置写入难题破解攻略:一步步教你排查连接、权限和配置问题,重启服务轻松解决!"
【10月更文挑战第23天】在使用Nacos 2.1.0版本时,可能会遇到无法将配置信息写入数据库的问题。本文将引导你逐步解决这一问题,包括检查数据库连接、用户权限、Nacos配置文件,并提供示例代码和详细步骤。通过这些方法,你可以有效解决配置写入失败的问题。
153 0

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等