SpringBoot之整合Shiro(最详细)

2023-10-26

1.SpringBoot整合Shiro思路

在这里插入图片描述

2. 环境搭建

2.1 创建项目

在这里插入图片描述

2.2 引入依赖

pom.xml

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <!--引入Jsp依赖-->
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-jasper</artifactId>
    </dependency>
    <!--jstl-->
    <dependency>
        <groupId>jstl</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <excludes>
                    <exclude>
                        <groupId>org.projectlombok</groupId>
                        <artifactId>lombok</artifactId>
                    </exclude>
                </excludes>
            </configuration>
        </plugin>
    </plugins>
</build>

2.3 创建前端页面

在webapp文件夹中创建index.jsp和login.jsp
index.jsp

<%@page contentType="text/html;UTF-8" pageEncoding="UTF-8" isErrorPage="false" %>
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<%--受限资源--%>
<h1>系统主页</h1>
<ul>
    <li><a href="#">用户管理</a></li>
    <li><a href="#">商品管理</a></li>
    <li><a href="#">订单管理</a></li>
    <li><a href="#">物流管理</a></li>
</ul>
</body>
</html>

login.jsp

<%@page contentType="text/html;UTF-8" pageEncoding="UTF-8" isErrorPage="false" %>
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<h1>登录界面</h1>
<form action="${pageContext.request.contextPath}/user/login" method="post">
    用户名:<input type="text" name="username" > <br/>
    密码  : <input type="text" name="password"> <br>
    <input type="submit" value="登录">
</form>
</html>

2.4 配置视图信息

application.properties

server.port=8080
server.servlet.context-path=/shiro
spring.application.name=shiro

spring.mvc.view.prefix=/
spring.mvc.view.suffix=.jsp

2.5 解决IDEA冲突问题

JSP 与IDEA 与SpringBoot存在一定的不兼容,修改此配置即可解决
在这里插入图片描述

2.6 测试搭建的环境

在这里插入图片描述

3. 整合Shiro

3.1 引入依赖

pom.xml

<!--引入shrio-->
<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-spring-boot-starter</artifactId>
    <version>1.5.3</version>
</dependency>

3.2 自定义Realm

在shiro文件夹下创建realm文件夹

package com.test.shiro.realm;

import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;

/**
 * 自定义Realm
 */
public class CustomerRealm extends AuthorizingRealm {
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        return null;
    }

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        return null;
    }
}

3.3 Shiro配置

在config文件夹中创建ShiroConfig.java

@Configuration
public class ShiroConfig {
    //ShiroFilter过滤所有请求
    @Bean
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(DefaultWebSecurityManager securityManager) {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        //给ShiroFilter配置安全管理器
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        //配置系统受限资源
        //配置系统公共资源
        Map<String, String> map = new HashMap<String, String>();
        map.put("/index.jsp","authc");//表示这个资源需要认证和授权
        // 设置认证界面路径
        shiroFilterFactoryBean.setLoginUrl("/login.jsp");
        shiroFilterFactoryBean.setFilterChainDefinitionMap(map);

        return shiroFilterFactoryBean;
    }
    //创建安全管理器
    @Bean
    public DefaultWebSecurityManager getDefaultWebSecurityManager(Realm realm) {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(realm);
        return securityManager;
    }
    //创建自定义Realm
    @Bean
    public Realm getRealm() {
        CustomerRealm realm = new CustomerRealm();
        return realm;
    }
}

3.4 启动测试

输入http://localhost:8080/shiro/index.jsp,发现需要跳转到login.jsp
在这里插入图片描述

4. 常见过滤器

  • 注意: shiro提供和多个默认的过滤器,我们可以用这些过滤器来配置控制指定url的权限:

5. 认证和退出

5.1 在index.jsp添加a标签

index.jsp

<a href="${pageContext.request.contextPath}/user/logout">退出登录</a>

5.2 编写controller

UserController.java

@Controller
@RequestMapping("/user")
public class UserController {
    @RequestMapping("logout")
    public String logout() {
        Subject subject = SecurityUtils.getSubject();
        subject.logout();
        return "redirect:/login.jsp";
    }
    @RequestMapping("/login")
    public String login(String username, String password) {
        //获取主题对象
        Subject subject = SecurityUtils.getSubject();
        try {
            subject.login(new UsernamePasswordToken(username,password));
            System.out.println("登录成功!!!");
            return "redirect:/index.jsp";
        } catch (UnknownAccountException e) {
            e.printStackTrace();
            System.out.println("用户错误!!!");
        } catch (IncorrectCredentialsException e) {
            System.out.println("密码错误!!!");
        }
        return "redirect:/login.jsp";
    }
}

5.3 修改自定义Realm

CustomerRealm.java

/**
 * 自定义Realm
 */
public class CustomerRealm extends AuthorizingRealm {
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        return null;
    }

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        String principal = (String) authenticationToken.getPrincipal();
        if ("zhangsan".equals(principal)) {
            return new SimpleAuthenticationInfo(principal,"123456",this.getName());
        }
        return null;
    }
}

5.4 修改ShiroConfig配置

ShiroConfig.java
公共资源一定是在受限资源上面,不然会造成死循环。

@Configuration
public class ShiroConfig {
    //ShiroFilter过滤所有请求
    @Bean
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(DefaultWebSecurityManager securityManager) {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        //给ShiroFilter配置安全管理器
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        //配置系统受限资源
        //配置系统公共资源
        Map<String, String> map = new HashMap<String, String>();
        map.put("/user/login","anon");//表示这个为公共资源 一定是在受限资源上面
        map.put("/**","authc");//表示这个受限资源需要认证和授权
        // 设置认证界面路径
        shiroFilterFactoryBean.setLoginUrl("/login.jsp");
        shiroFilterFactoryBean.setFilterChainDefinitionMap(map);

        return shiroFilterFactoryBean;
    }
    //创建安全管理器
    @Bean
    public DefaultWebSecurityManager getDefaultWebSecurityManager(Realm realm) {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(realm);
        return securityManager;
    }
    //创建自定义Realm
    @Bean
    public Realm getRealm() {
        CustomerRealm realm = new CustomerRealm();
        return realm;
    }
}

5.5 测试

登录正常,登出正常,未登录和登出后不能访问index.jsp
在这里插入图片描述
在这里插入图片描述

6. MD5、Salt的认证实现

6.1 创建数据库

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for t_user
-- ----------------------------
DROP TA
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot之整合Shiro(最详细) 的相关文章

随机推荐

  • gitlab Undefined method `provider' for nil:nilclass 登陆提示处理

    使用管理员用户 在管理区域 用户管理里面 搜索对应用户 修改用户身份里面的LDAP身份为正确信息
  • 【基础】Unity:Application的常用方法

    Application的常用方法 static void LoadLevel int index static void LoadLevel string name static void CaptureScreenShot string
  • php使用区块链_PHP实现区块链

    作者 列旭松 来源 高可用架构 原文链接 http t cn RgjsJ1i 著作权归作者所有 商业转载请联系作者获得授权 非商业转载请注明出处 来自 Linux内核那些事 微信号 like linux 作者 列旭松 唯品会资深工程师 曾任
  • C++标准演绎(未完)

    作者 略游 q群 512 001 256 一 词汇定义 标准 standard C 语言标准 在代码世界里 我们假设与公理等价 结论 由标准推导出的事实 规定 便于讨论 我们设定的一些规则 类型 type 同一类型 它们在C 内存布局一致
  • 简谈拉电阻

    简谈拉电阻 前言 拉电阻 弱拉和强拉 上拉和下拉 前言 电路设计中经常设计到拉电阻的概念 与常用的GPIO口的配置也息息相关 网上也有很多的总结 不多累述 简单的总结拉电阻相关的一些概念 拉电阻 拉电阻分为上拉电阻 pull up 和下拉电
  • powerdesigner常用配置-修改外键设置

    文章目录 取消自动生成外键列 PowerDesigner给两个表添加reference 中间显示外键信息步骤 取消自动生成外键列 PowerDesigner给两个表添加reference 中间显示外键信息步骤
  • Floyd算法(三)之 Java详解

    前面分别通过C和C 实现了弗洛伊德算法 本文介绍弗洛伊德算法的Java实现 目录 1 弗洛伊德算法介绍 2 弗洛伊德算法图解 3 弗洛伊德算法的代码说明 4 弗洛伊德算法的源码 转载请注明出处 http www cnblogs com sk
  • 记一次XFS文件系统崩溃的处理

    1 问题出现 当使用rpm安装服务时 出现如下问题 当使用yum时也是一样 查了 var log messages发现以下错误 看起来是XFS的问题 可以发现dm 0实际是bel root的问题 查了网上很多解决方法都是说要使用xfs re
  • TCP/IP 报文格式(IP数据包、TCP报头、UDP报头)

    TCP IP 报文格式 IP数据包 TCP报头 UDP报头 一 IP包格式 IP数据包 是一种可以变长的分组 由首部与数据负载组成 首部长度为20 60字节 Byte 后40字节是可选的 但长度不固定 前20字节格式为固定 数据负载部分的长
  • 医疗器械维修工程师好做吗?赚钱吗?

    彩虹医疗器械维修培训第二期长期班安排 学技术 考证书 工作技术支持 彩虹介绍 彩虹医械维修培训中心成立于2003年 至今已有十余年的时间 为满足社会需求 推进医疗器械维修技术发展 开展医疗器械的维修技术培训 在社会上取得了良好的反应和口碑
  • 嵌入式Linux驱动开发(I2C专题)(四)

    编写APP直接访问EEPROM 参考资料 Linux驱动程序 drivers i2c i2c dev c I2C Tools 4 2 https mirrors edge kernel org pub software utils i2c
  • 在 Kubernetes 上体验 EMQX 5.0 的 MQTT over QUIC 特性

    引言 作为全球领先的开源分布式 MQTT Broker EMQX 在 5 0 版本中引入了 MQTT over QUIC 将 MQTT 协议的优势与 QUIC 的特性相结合 通过充分利用 QUIC 协议低连接开销和多路复用的特点 MQTT
  • 入职避坑指南(杭州)

    前言 求职都说金三银四 今天和大家分享一个亲身经历的事情 今天讲的是杭州 群电商公司 规模500人左右 说说我被公司白瞟的亲身经历 希望看到这篇文章的同学能避开这些坑 面试过程 公司比较远 附近没有地铁 大概坐了一个多小时的公交车去面试 到
  • CompletableFuture使用详解

    https blog csdn net admin123404 article details 111168902
  • Centos7.9搭建kafka-3.2.0集群,三台机器组成,并安装安装eagle 监控

    目录 1 准备工作 2 搭建zookeeper集群 3 搭建kafka集群 4 测试kafka集群 4 1 命令测试 4 2 java代码测试 5 安装eagle 监控 1 准备工作 kafka 3 2 0的单机安装教程如下 CentOS7
  • MySQL的全连接

    从这篇博客开始 从高端大气的计算机视觉方向转行做JAVA开发了 接下来的博客就是JavaJavaJava了没有世界上最好用的pythonpythonpython 由于MySQL不支持FULL JOIN 所以 需要使用UNION来实现全连接
  • 一、多路复用

    1 什么是多路复用 数据通信系统或计算机网络系统中 传输媒体的带宽或容量往往会大于传输单一信号的需求 为了有效地利用通信线路 希望一个信道同时传输多路信号 这就是所谓的多路复用技术 Multiplexing 采用多路复用技术能把多个信号组合
  • 第三章 Jinja2模板

    第三章 Jinja2模板 在前面的实例中 视图函数的主要作用是生成请求的响应 这是最简单请求 实际上 视图函数有两个作用 处理业务逻辑 返回响应内容 在大型应用中 把业务逻辑和表现内容放在一起 会增加代码的复杂度和维护成本 模板其实是一个包
  • 因误删文件导致CentOS7开机卡死无法进入图形登录界面

    目录 1 背景 2 解决步骤 1 背景 这几天在清理电脑 需要删除虚拟机 为此写下了Linux系统下卸载VMware Workstation软件 nanke yh的博客 CSDN博客 但是同时怕有残留 自己全局搜索了vm 删除了部分带有vm
  • SpringBoot之整合Shiro(最详细)

    1 SpringBoot整合Shiro思路 2 环境搭建 2 1 创建项目 2 2 引入依赖 pom xml