Shiro--集成SpringBoot(一)

SpringBoot3 集成 Shiro 是一个强大且易用的Java安全框架,提供了身份验证、授权、密码学和会话管理等功能。它被广泛用于保护各种类型的应用程序,包括Web应用、桌面应用、RESTful服务、移动应用和大型企业级应用。没有Spring Security 那么多晦涩的概念和术语,其原理非常清晰易懂,也非常容易集成到自己的项目中。SpringBoot 2.x 已于去年底End of life,升级到 SpringBoot 3 成了一件必须要做的事情,而SpringBoot 3 在集成 Shiro 时,有一些坑,也有一些与之前不同之处。 阅读详情
创建项目,引入依赖
		<dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring-boot-web-starter</artifactId>
            <version>1.4.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>com.github.theborakompanioni</groupId>
            <artifactId>thymeleaf-extras-shiro</artifactId>
            <version>2.0.0</version>
        </dependency>

注意:这里需要添加spring-boot-starter-web依赖,因为shiro-spring-boot-web-starter已经依赖了web。为了在Thymeleaf中使用shiro标签,引入了thymeleaf-extras-shiro依赖。

Shiro基本配置

在appliaction.properties中配置Shiro的基本信息:

# 开启Shiro配置,默认为true
shiro.enabled=true

# 开启Shiro Web配置,默认为true
shiro.web.enabled=true

# 登录地址
shiro.loginUrl=/login

# 登录成功的地址,默认为"/"
shiro.successUrl=/index

# 未授权的默认跳转地址
shiro.unauthorizedUrl=/unauthorized

# 是否允许通过URL参数实现会挂跟踪,默认为true
shiro.sessionManager.sessionIdCookieEnabled=true

# 是否允许通过Cookie实现会话跟踪,默认为true
shiro.sessionManager.sessionIdUrlRewritingEnabled=true

配置类:

package pers.zhang.demo.config;

import at.pollux.thymeleaf.shiro.dialect.ShiroDialect;
import org.apache.shiro.realm.Realm;
import org.apache.shiro.realm.text.TextConfigurationRealm;
import org.apache.shiro.spring.web.config.DefaultShiroFilterChainDefinition;
import org.apache.shiro.spring.web.config.ShiroFilterChainDefinition;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @Author: acton_zhang
 * @Date: 2020/2/10 9:22 下午
 * @Version 1.0
 */
@Configuration
public class ShiroConfig {

    @Bean
    public Realm realm(){
        TextConfigurationRealm realm = new TextConfigurationRealm();
        //配置两个用户:sang/123 角色为user;  admin/123 角色为admin
        realm.setUserDefinitions("sang=123,user\n admin=123,admin");
        //user具有read权限;        admin具有read和write权限;
        realm.setRoleDefinitions("admin=read,write\n user=read");
        return realm;
    }


    //定义基本过滤规则
    /*
        "/login"和"/doLogin"可以匿名访问
        "/logout"是注销登录请求
        其余请求都需要认证后访问
     */
    @Bean
    public ShiroFilterChainDefinition shiroFilterChainDefinition(){
        DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition();
        chainDefinition.addPathDefinition("/login", "anon");
        chainDefinition.addPathDefinition("/doLogin", "anon");
        chainDefinition.addPathDefinition("/logout", "logout");
        chainDefinition.addPathDefinition("/**", "authc");
        return chainDefinition;
    }


    //为了支持在Thymeleaf中使用Shiro标签
    @Bean
    public ShiroDialect shiroDialect(){
        return new ShiroDialect();
    }
}
Controller

配置登录接口以及页面访问接口:

package pers.zhang.demo.controller;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.authz.annotation.Logical;
import org.apache.shiro.authz.annotation.RequiresRoles;
import org.apache.shiro.subject.Subject;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;

/**
 * @Author: acton_zhang
 * @Date: 2020/2/10 9:32 下午
 * @Version 1.0
 */
@Controller
public class UserController {

    @PostMapping("/doLogin")
    public String doLogin(String username, String password, Model model){
        //构建一个UsernamePasswordToken实例
        UsernamePasswordToken token = new UsernamePasswordToken(username,password);
        //获取Subject对象
        Subject subject = SecurityUtils.getSubject();
        try{
            //认证
            subject.login(token);
        }catch (AuthenticationException e){
            model.addAttribute("error", "用户名或密码输入错误!");
            return "login";
        }
        return "redirect:index";

    }

    //具有admin角色才可以访问"/admin"接口
    @RequiresRoles("admin")
    @GetMapping("/admin")
    public String admin(){
        return "admin";
    }

    //具有admin或user角色任意一个即可访问"/user"接口
    @RequiresRoles(value = {"admin", "user"}, logical = Logical.OR)
    @GetMapping("/user")
    public String user(){
        return "user";
    }
}

对于其它不要角色就能访问的接口,直接在WebMvc中配制即可:

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/login").setViewName("login");
        registry.addViewController("/index").setViewName("index");
        registry.addViewController("/unauthorized").setViewName("unauthorized");
    }
}

创建全局异常处理器进行全局异常处理:

@ControllerAdvice
public class ExceptionController {

    @ExceptionHandler(AuthorizationException.class)
    public ModelAndView error(AuthorizationException e){
        ModelAndView mv = new ModelAndView("unauthorized");
        mv.addObject("error", e.getMessage());
        return mv;
    }
}
页面

在resources/templates目录下创建5个HTML。

index.html:

<!DOCTYPE html>
<html lang="en" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h3>Hello,<shiro:principal/></h3>
    <h3><a href="/logout">注销登录</a> </h3>
    <h3><a shiro:hasRole="admin" href="/admin">管理员页面</a> </h3>
    <h3><a shiro:hasAnyRoles="admin,user" href="/user">普通用户页面</a> </h3>
</body>
</html>

login.html:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div>
        <form action="/doLogin" method="post">
            <input type="text" name="username"/><br/>
            <input type="password" name="password"/><br/>
            <div th:text="${error}"></div>
            <input type="submit" value="登录"/>
        </form>
    </div>
</body>
</html>

user.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>普通用户页面</h1>
</body>
</html>

admin.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>管理员页面</h1>
</body>
</html>

unauthorized.html:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <div>
        <h1>未获授权,非法访问</h1>
        <h3 th:text="${error}"></h3>
    </div>
</body>
</html>

测试

使用sang/123访问:

因为sang用户不具备admin角色,因此登录成功后的页面上没有前往管理员页面的超链接。
在这里插入图片描述
在这里插入图片描述

使用admin/123访问:

admin具有admin角色和user角色,所以登录成功后会显示『管理员页面』和『普通用户页面』:
在这里插入图片描述
在这里插入图片描述

使用sang/123登录后,直接访问"/admin"接口:

因为sang不具备admin角色,所以会跳转到错误页面:
在这里插入图片描述

SpringBoot集成shiro认证,实现Shiro认证的登录操作 其实,扩展阅读:(看一下官方的解释为什么叫Subject而不叫User)翻译如下:我们最初是想把它叫做User的,这样很容易理解,但是大部分的应用程序都已经有了User类,为了不和这些原有的api发生冲突,我们最后决定不这么做。 阅读详情

相关推荐

Oracle19c时区升级实战:从32到42版本的数据泵TSTZ报错解决方案

本文详细介绍了Oracle19c时区版本从32升级到42的实战步骤,重点解决数据泵TSTZ报错问题。通过检查时区版本、下载补丁包、应用补丁及执行升级脚本等关键操作,确保数据库时区数据更新,避免夏令时转换错误和历史时区规则不匹配等问题。文章还提供了常见问题排查和升级后的注意事项,帮助DBA高效完成时区升级任务。

n7o8p的博客 284

Springboot整合Shiro

**/*** 判断token是不是自定义的JwtToken* @return//授权 System . out . println("开始授权");//验证 JwtToken jwtToken =(JwtToken) token;} System . out . println("开始验证");} }/**/*** 判断token是不是自定义的JwtToken* @return。

mo_yan_Q的博客 362

管道机器人手臂机械结构设计cad【8张】+三维图+设计说明书+绛重

履带式管道机器人适用于各种管道环境,包括直管道、弯曲管道、水平管道、垂直管道等,其灵活性和适应性使得它可以应对不同形状和尺寸的管道,完成全面的检测和维护工作。管道机器人研究具有重要的现实意义和深远的社会影响,通过提高工作效率、降低人员风险、提升服务质量、节约成本资源和促进科技创新等方面的作用,为现代工程技术领域的发展和进步做出了积极的贡献。管道机器人是一种能够在管道内部执行各种任务的智能机器人,而管道机器人的机械臂对于管道机器人在管道内执行任务的灵活性、稳定性和效率至关重要。

kejigongjiang的博客 943

SpringBoot整合Shiro

实现shiro标签html页面要加入标记属性。

Z_BK9的博客 974

欧姆龙 CJ1W-SCU模块使用通配符+结束码实现非固定长度数据的接收

实验设备:CJ2M-CPU33、CJ1W-SCU21、XW2Z-200T 实验目的:了解 CJ1W-SCU 通配符使用 1.硬件接线: CJ1W-SCU21单元号拨码置于8,使用串口1(232口)。 2.软件设置: ① 新建工程,选择PLC型号CJ2M-CPU33,切换到编程模式,如下图: 、 ② 创建I/O并进行相关配置,如下图: ③ 设置为用户设置,协议宏模式,8位数据位,2位停止位,偶校验9600波特率,如下图: 、 ④ 打开CX-Protocal软件,新建工程: .

weixin_42118352的博客 1984

作为一名爬虫人如何实现千万级数据爬取?

爬虫门槛不高,高就高在往后余生的每一次实操都随时会让你崩溃!Bro

吴秋霖的博客 1万+

深入解析:Spring Boot与Apache Shiro的无缝集成实践

Realm是Shiro的核心接口,用于连接用户数据源(如数据库)。在Shiro中,Realm的作用是提供用户信息、角色和权限数据。为了实现自定义的认证和授权逻辑,我们需要创建一个MyRealm类,继承自。以下是MyRealm/*** 授权逻辑,用于获取用户的角色和权限。// 模拟从数据库中获取用户角色和权限 if("admin" . equals(username)) {} /*** 认证逻辑,用于验证用户身份。

869

智驾车载以太网(18)-switch之报文转发和vlan处理流程

本文详细解析了交换机中报文处理和转发流程:1)通过目标MAC查找转发端口,源MAC创建ARL条目;2)VLAN标签处理包括tagged/untagged帧判断、默认VID标记等5种处理方式;3)完整转发流程包含CRC校验、IQ封装、VLAN和ARL表查询、端口向量计算及优先级队列发送。文中还涉及TCAM修改VLAN、802.1q多种模式处理等细节,省略了流量控制等次要流程。该过程实现了基于MAC和VLAN的高效二层交换。

mitugaoyang1993的博客 43

SpringBoot配置Shiro

SpringBoot配置shiro 1先导入jar包 <!--shiro--> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>1.4.0</version> </dependency> <dependency> &

weixin_49605969的博客 1521

FastAPI 极简教程(偏实战,一篇搞定)

本文是一篇FastAPI实战教程,通过最少的概念讲解快速掌握FastAPI的核心功能。文章首先介绍FastAPI是基于Starlette和Pydantic的高性能Python API框架,具有自动生成文档、类型驱动校验、异步支持和依赖注入等优势。教程从安装环境开始,演示了如何创建最小项目并编写第一个"Hello World"接口。接着详细讲解了路由参数处理(Path/Query/Body)、Pydantic数据模型校验、响应模型控制、状态码设置等核心功能。在高级功能方面,重点介绍了错误处

AI天才研究院 814

uniApp微信小程序:error: 60001 request:fail errcode:-101 cronet error code:-101error_msg:net::ERR CONNECTI

uni-app微信小程序域名访问报error 60001 request:fail errcode:-101,解决Uniapp微信小程序报600001错误,uni.request()接口请求报错,服务器更换SSL证书后,uniapp微信小程序出现`request:fail errcode:-101`问题分析与解决,服务器更换ssl证书后,手机访问微信小程序异常,微信小程序更换SSL证书后出现请求报错,服务器更换SSL证书,微信小程序报600001,小程序反应偶尔出现request:fail errcode:

✅ 精选推荐文章 4583

springboot整合shiro实现登录认证授权以及退出

文章目录springboot整合shiro实现登录认证授权以及退出shrio简介环境准备创建一个springboot的项目导入相关的依赖springboot整合shiro的依赖thymleaf的依赖创建首页创建controllershiro重要概念拦截器拦截请求创建配置类修改首页登录页面登录认证授权退出 springboot整合shiro实现登录认证授权以及退出 shrio简介 shiro是一个权限管理框架,用于实现登录认证以及授权。 环境准备 创建一个springboot的项目 这里我创建的是最简单的we

dream_follower的博客 2827

基于R-CNN深度学习的石头剪刀布手势识别系统:数据集、模型和UI界面的完整实现

本项目的目标是开发一个基于R-CNN深度学习模型的手势识别系统,能够识别石头、剪刀、布三种手势,并通过UI界面让用户能够进行交互。数据集准备与标注:收集包含石头剪刀布手势的图像,并对其进行标注。深度学习模型构建与训练:采用R-CNN模型进行手势的识别和定位。UI界面设计:设计一个简洁的界面,用户可以上传手势图像并进行识别。R-CNN(Region Convolutional Neural Networks)是一个典型的目标检测模型。生成候选区域。

YOLO 877

Spring Boot 中集成 Shiro

Shiro 是一个强大、简单易用的 Java 安全框架,可使认证、授权、加密,会话过程更便捷,并可为应用提供安全保障。本节课重点介绍下 Shiro 的认证和授权功能。 文章目录16.1 Shiro 三大核心组件16.1.1 Subject 为认证主体16.1.2 SecurityManager 为安全管理员16.1.3 Realm 是一个域16.2 Shiro 身份和权限认证16.2.1 Shir...

taojin12的博客 3万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

springboot集成shiro

自定义Realm用于从数据库中获取用户信息并进行身份验证。我们可以通过继承// 授权逻辑 @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {// 在这里配置用户的角色和权限信息 // authorizationInfo.addRole("admin");

Flying_Fish_roe的博客 2153

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

springboot集成shiro_第019课:Spring Boot 集成Shiro

Shiro 是一个强大、简单易用的 Java 安全框架,主要用来更便捷的认证,授权,加密,会话管理等等,可为任何应用提供安全保障。本课程主要来介绍 Shiro 的认证和授权功能。Shiro 三大核心组件Shiro 有三大核心的组件:Subject、SecurityManager 和 Realm。先来看一下它们之间的关系。三大核心组件Subject:认证主体。它包含两个信息:Principals 和...

weixin_39889597的博客 95

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【SpringBoot】Spring Boot 快速集成 Shiro 示例

本文转自:https://github.com/fishpro/spring-boot-study/tree/master/spring-boot-study-jdbc 根据个人实践情况做一些注释 感谢fishpro的教程 ----------------------------------------------------- Apache Shiro 已经大名鼎鼎,搞 Java 的...

我的笔记本 613

SpringBoot 集成 Shiro

SpringBoot 集成 Shiro 1、框架搭建 ​ 创建SpringBoot项目,集成Shiro组件。打开idea工具。进入File-&amp;gt;New-&amp;gt;Project选择Spring Initializr 包命自己命名。项目创建好后,修改`pom.xml`文件,引入Shiro和Thymeleaf。pom.xml文件如下: &amp;lt;?xml version=&quot;1.0&quot; encodin...

July_whj 378

SpringBoot集成Shiro

Apache shiro 是Java的安全(权限)框架。Shiro可以可以非常容易的开发出足够好的应用,其不仅可以用在JavaSE环境,也可以用在JAVAEE环境。Shiro可以完成:认证授权、加密、会话管理,与web集成,缓存等。Authentications:身份证/ 登录,验证用户是不是拥有相应的身份Authorization:授权,即授权验证,验证某个用户是否拥有某个权限;即判断用户是否能进行什么操作,如:验证某个用户是否拥有某个角色。...

凌北辰的博客 1665

SpringBoot之集成Shiro

1、Shiro简介 1.1、Shiro 是什么? Apache Shiro 是 Java 的一个安全(权限)框架。 Shiro 可以非常容易的开发出足够好的应用,其不仅可以用在 JavaSE 环境,也可以用在 JavaEE 环境。 Shiro 可以完成:认证、授权、加密、会话管理、与Web 集成、缓存等。 下载地址 官网:http://shiro.apache.org/ github:https://github.com/apache/shiro 1.2、有哪些功能? Auth

The_Beacon的博客 412

SpringBoot集成Shiro安全框架

SpringBoot集成Shiro安全框架欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入...

qq_33922980的博客 5394
上一篇: Shiro--标签
下一篇: Shiro--集成springboot(二)
吴声子夜歌
博客等级 码龄9年 2688粉丝 2268原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值