SpringBoot 与Shiro 整合系列(四)多realm延伸之实现多realm不同数据表用户登录认证和鉴权

本文介绍了如何在SpringBoot项目中结合Shiro实现多Realm登录认证和鉴权,针对不同数据表的普通用户和系统管理员进行区分处理。通过自定义UserToken类、创建自定义Realm以及配置ShiroConfig,实现了多Realm的登录验证流程,并展示了实现效果。
摘要由CSDN通过智能技术生成

一、前言

shiro是一个很好的登陆以及权限管理框架,但是默认是单realm单数据表,如果业务中用户分布在不同的数据表,单realm就很难实现登陆以及权限管理的功能,本章简单的介绍一个普通用户和系统管理员账号分布在不同的数据表情况下,即需要两个Realm——MemberRealm和UserRealm,分别处理普通用户和系统管理员的验证功能。

shiro的多realm登陆验证,使用springboot,mybatis mysql等相关技术。

在这里插入图片描述

正常情况下,当定义了多个Realm,无论是普通用户登录,还是系统管理员登录,都会由这2个Realm共同处理。这是因为,当配置了多个Realm时,我们通常使用的认证器是shiro自带的org.apache.shiro.authc.pam.ModularRealmAuthenticator其中决定使用的Realm的是doAuthenticate()方法,源代码如下:

    protected AuthenticationInfo doAuthenticate(AuthenticationToken authenticationToken) throws AuthenticationException {
   
        assertRealmsConfigured();
        Collection<Realm> realms = getRealms();
        if (realms.size() == 1) {
   
            return doSingleRealmAuthentication(realms.iterator().next(), authenticationToken);
        } else {
   
            return doMultiRealmAuthentication(realms, authenticationToken);
        }
    }

上述代码的意思就是如果有多个Realm就会使用所有配置的Realm。 只有一个的时候,就直接使用当前的Realm。

二、Shiro 多Realm配置的流程

1.添加依赖 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>
  
  <!-- 一、继承 SpringBoot 默认的父工程 -->
  <!--  SpringBoot 父工程 -->
  <parent>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-parent</artifactId>
     <version>2.0.4.RELEASE</version>
  </parent>
  
  <groupId>com.koncord</groupId>
  <artifactId>springboot-shiro</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  
  <!-- 二、导入依赖 -->
  <dependencies>
    <!-- 导入web支持:SpringMVC开发支持,Servlet相关的程序 -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
  
    <!--thymeleaf依赖 -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    <!-- thymeleaf对shiro的扩展坐标 -->
    <!-- thymeleaf整合shiro标签 -->
    <dependency>
      <groupId>com.github.theborakompanioni</groupId>
      <artifactId>thymeleaf-extras-shiro</artifactId>
      <version>2.0.0</version>
    </dependency>
    
    
    
    <!-- shiro 与 spring 整合依赖 -->
    <dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-spring</artifactId>
      <version>1.4.0</version>
    </dependency>
    
    <!-- 导入mybatis相关的依赖 -->
    <!-- SpringBoot的mybatis启动器 -->
    <dependency>
      <groupId>org.mybatis.spring.boot</groupId>
      <artifactId>mybatis-spring-boot-starter</artifactId>
      <version>1.3.0</version>
    </dependency>
    <!--Mysql 驱动  -->
	<dependency>
		<groupId>mysql</groupId>
		<artifactId>mysql-connector-java</artifactId>
		<scope>runtime</scope>
		<version>8.0.21</version>
	</dependency>
	<!--druid数据源(连接池)  -->
	<dependency>
		<groupId>com.alibaba</groupId>
		<artifactId>druid</artifactId>
		<version>1.1.9</version>
	</dependency>    
    
  </dependencies>
  
  <!-- 三、修改参数 -->
  <properties>
     <!-- 修改JDK的编译版本为1.8 -->
     <java.version>1.8</java.version>
  </properties>
  <build/>
</project>

2.用户数据表

CREATE TABLE `sys_user` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL COMMENT '用户名',
  `password` varchar(50) DEFAULT NULL COMMENT '登录密码',
  `perms` varchar(50) DEFAULT NULL COMMENT '权限字符串',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='系统管理员';

CREATE TABLE `t_member` (
  `member_id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL COMMENT '用户名',
  `password` varchar(50) DEFAULT NULL COMMENT '登录密码',
  `perms` varchar(50) DEFAULT NULL COMMENT '权限字符串',
  PRIMARY KEY (`member_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='普通用户';


系统管理员 添加两条数据:
在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值