Springboot+Shiro实现权限控制

Springboot+Shiro+Jwt实现权限控制 因为需要实现一个设备管理系统的权限管理模块,在查阅很多博客以及其他网上资料之后,发现重复、无用的博客很多,因此写一篇文章来记录,以便后面复习。书写顺序。 阅读详情

在一个系统中,不同的用户会对应着不同的角色,不同的角色会被赋予不同的权限。不同角色的用户登陆会看到不同的界面,也就是意味着可以使用不同的功能。可以使用Spring security或者Shiro,但是Shiro相对于Spring security来说更轻量一些,更容易上手,因此选择了后者。

首先,在Springboot工程的pom文件里添加shiro依赖,如下:

    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-core</artifactId>
        <version>1.2.5</version>
    </dependency>
    
    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-spring</artifactId>
        <version>1.2.5</version>
    </dependency>

接下来,对Shiro进行配置,使用注解@Configuration,主要代码如下:

@Configuration
public class ShiroConfiguration {
    
    @Bean
    public ShiroFilterFactoryBean shiroFilter(org.apache.shiro.mgt.SecurityManager securityManager){
        
        System.out.println("ShiroConfiguration.shirFilter()");
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        
        //设置SecurityManager
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        
        
        //拦截器
        Map<String,String> filterChainDefinitionMap = new LinkedHashMap<String,String>();
        
        //所有匿名用户均可访问到Controller层的该方法下
        filterChainDefinitionMap.put("/login","anon");
        filterChainDefinitionMap.put("/static/**","anon");
        filterChainDefinitionMap.put("/loginInfo", "anon");
        //filterChainDefinitionMap.put("/Welcome", "anon");
        //配置退出过滤器
        filterChainDefinitionMap.put("/login/logout", "logout");
        //<!-- authc:所有url都必须认证通过才可以访问; anon:所有url都都可以匿名访问-->
        filterChainDefinitionMap.put("/**", "authc");//经过认证才可以访问
        

        
        //如果不设置默认会自动寻找web工程根目录下的/login.jsp  当前就不配置了  直接去找login.jsp
        shiroFilterFactoryBean.setLoginUrl("/login");//配置后  输入/index会去访问login界面
        
        //登陆后要跳转的链接
        //shiroFilterFactoryBean.setSuccessUrl("/Welcome");//如果在jsp中实现了成功登陆后的跳转  是不是这块也可以不进行配置
        
        //未授权页面
        shiroFilterFactoryBean.setUnauthorizedUrl("/login");
        //自定义拦截器
        Map<String,Filter> filterMap = new LinkedHashMap<String,Filter>();
        
        //
        shiroFilterFactoryBean.setFilters(filterMap);
        
        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
        return shiroFilterFactoryBean;
    }
    
    @Bean
    public DefaultWebSecurityManager securityManager(){
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(myShiroRealm());
        
        securityManager.setRememberMeManager(rememberMeManager());
        //一开始被我注掉了 导致rememberMe设置的时候cookie有效时长一致不生效
        return securityManager;
    }
    
    @Bean
    public MyShiroRealm myShiroRealm(){
        return new MyShiroRealm();
    }
    
    //cookie对象
    @Bean
    public SimpleCookie rememberMeCookie(){
        
        System.out.println("rememberMeCookie");
        //这个参数是cookie的名称,对应前端的checkbox的name=rememberMe
        SimpleCookie simpleCookie = new SimpleCookie("rememberMe");
        //记住我cookie生效时间1天 s
        simpleCookie.setMaxAge(10800);//有效时长当前设置为3个小时 和Session有效时长一致
        return simpleCookie;
    }
    
    @Bean
    //cookie管理对象 记住我功能
    public CookieRememberMeManager  rememberMeManager(){
        CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();
        cookieRememberMeManager.setCookie(rememberMeCookie());
        //String key = "3AvVhmFLUs0KTA3Kprsdag==";
        return cookieRememberMeManager;
    }

}

其中,MyShiroRealm类中实现登录的认证和用户授权。使MyShiroRealm类继承AuthorizingRealm类,需要实现protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals)和protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken)两个方法,其中doGetAuthorizationInfo方法主要实现授权用户权限(用户角色和权限控制),doGetAuthenticationInfo方法获取用户身份,进行身份验证。(以上两个方法暂时没有详细阐述),在doGetAuthenticationInfo()方法中UnknownAccountException()对应着账户不存在,AuthenticationException()可以对应着密码错误。<简单判定>

上面的配置信息中,rememberMeCookie可实现在用户登录过程中,选择“记住我”等相关功能时(且已设置cookie有效时长,表示不再是会话cookie),在浏览器端,也就是本地将cookie缓存下来。下次用户登录时,会携带cookie请求服务器,若cookie和session均在有效时长内(即判断用户为已登录状态),会直接访问欢迎页。

用户输入用户名和密码等相关信息后,访问的接口代码如下:

	@CrossOrigin
	@RequestMapping("/loginInfo")
	@ResponseBody
	public JSONObject Login(@RequestParam("username")String username,
			@RequestParam("password")String password
			,HttpServletRequest request,HttpServletResponse response) throws AuthenticationException{
		response.setHeader("Access-Control-Allow-Origin","*");
		response.setHeader("Cache-Control","no-cache");
		response.setHeader("Content-Type", "text/html; charset=UTF-8");  
		response.setContentType("text/html; charset=UTF-8");
		boolean rememberMeFlag = false;
		String rememberMe = request.getParameter("rememberMe");
		//如果用户没有选择"记住我"返回的是null,如果选择了返回的是"on"
		if(null == rememberMe){
			rememberMeFlag = false;
		}else{
			rememberMeFlag = true;
		}
		System.out.println("登录");
		
				
		Map<String,Object> resultMap = new HashMap<String,Object>();
		//Shiro认证
		Subject subject = SecurityUtils.getSubject();
		//收集用户的用户名和密码
		UsernamePasswordToken token = new UsernamePasswordToken(username,password);
			try{
				token.setRememberMe(rememberMeFlag);
				subject.login(token);//进行验证
			}catch(UnknownAccountException e){
				resultMap.put("code", "code1");
				resultMap.put("msg", "账户不存在");
				return new JSONObject(resultMap);
			}catch(DisabledAccountException e){
				resultMap.put("code", "code2");
				resultMap.put("msg", "账户存在问题");
				return new JSONObject(resultMap);
			}catch(Exception e){
				resultMap.put("code", "code3");
				resultMap.put("msg", "登陆异常");
				return new JSONObject(resultMap);
			}
			
			resultMap.put("code", "code4");
			resultMap.put("msg", "登陆成功");
			
			Session session = SecurityUtils.getSubject().getSession();
			
			//验证成功后将用户名存放到session中
			session.setAttribute("****", username);

			
			session.setTimeout(10800000);//当前设置session为三个小时  和cookie有效时长一致
		
		return new JSONObject(resultMap);

	}

上述代码中的code1、code2...等几个code码主要用于页面不同状态下的弹框提示,可协商修改(也和MyShiroRealm类中doGetAuthenticationInfo方法进行身份验证时出现的Exception对应)。当然,如果要实现用户有效时长内自动登录,还需要将做用户是否已登录的判断,选择直接判断,映射到不同的页面。

	@RequestMapping("/login")
	public String Login(){
		Subject subject = SecurityUtils.getSubject();
		if(subject.isAuthenticated()){//用户已经登录
			return "欢迎页";//对应着欢迎页的页面名称
		}else{
			return "登录页";//对应着登录页面的页面名称
		}	
	}

记录下来,作为笔记,还有很多地方理解的不透彻,不深入,后续有时间有更多的理解会添加上来。

Springboot+Shiro+Jwt实现简单的权限控制 因为需要实现一个设备管理系统的权限管理模块,在查阅很多博客以及其他网上资料之后,发现重复、无用的博客很多,因此写一篇文章来记录,以便后面复习。书写顺序。 阅读详情

相关推荐

Springboot + Vue + shiro 实现前后端分离、权限控制

本文总结自实习中对项目的重构。原先项目采用Springboot+freemarker模版,开发过程中觉得前端逻辑写的实在恶心,后端Controller层还必须返回Freemarker模版的ModelAndView,逐渐有了前后端分离的想法,由于之前,没有接触过,主要参考的还是网上的一些博客教程等,初步完成了前后端分离,在此记录以备查阅。 一、前后端分离思想 前端从后端剥离,形成一个前端工程,前...

KHOST的博客 5404

springboot整合shiro实现权限控制

Apache Shiro是一个强大且易用的Java安全框架,执行身份验证、授权、密码学和会话管理。使用Shiro的易于理解的API,您可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。上个月写了一个在线教育的项目用到了shiro权限控制,这几天又复盘了一下,对其进行了深入探究,来总结一下。 下面所总结的有关shiro的代码已经传到我的github上,可以访问下面的......

jiankang66的博客 4万+

springboot+权限管理系统 shiro + ssm实现 实现菜单,自用

权限管理系统 shiro + ssm实现,实现菜单,有学习的可以下载哦!项目基于jdk1.8整合了springboot+mvc+mybatis(通用mapper)+druid+jsp+bootstrap等技术,springboot+Listener(监听器),Filter(过滤器),Interceptor(拦截器),Servlet,springmvc静态资源,文件上传下载,多数据源切换,缓存,quartz定时任务(没有具体业务实现)等技术点都在项目中实现了,可谓是麻雀虽小五脏俱全!项目也整合了redis做缓存,把pom.xml中spring-boot-starter-data-redis和com.xe.demo.common.support.redis包下的注释去掉,

springboot整合shiro实现简单权限控制

springboot整合shiro实现简单权限控制

听钱塘信来的博客 7297

基于 Springboot、Shiro、Mybatis、Thymeleaf 做的后台管理系统(也有传统MVC版本,都在ZIP里)

基于 Springboot、Shiro、Mybatis、Thymeleaf 做的后台管理系统,简单粗暴

Springboot和bootstrap实现shiro权限控制配置过程

主要介绍了Springboot和bootstrap实现shiro权限控制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

SpringBoot学习小结之权限控制Shiro

Shiro是 Apache下一个功能强大、灵活的轻量级java开源安全框架,可用来实现用户身份验证、权限授权、session管理和密码加密等功能。下图是Shiro的重点主要概念支持功能身份验证和授权功能具有可插拔性和灵活性,方便开发人员自定义自己的角色权限规则shiro和Spring Security对比 1.2 实体类 2.3 Dao 2.4 Controller 2.5 配置 web配置 Shiro配置 全局异常处理 2.6 Realm 2.7 自定义注解LoginUse

十十办文武的博客 1440

SFM(structure from motion 从运动恢复结构)和MVS(multi-view stereo 多视图立体视觉)

主要目的:SFM是重建稀疏点云的,MVS重建的是稠密点云。 输入的数据:SFM是没有标定的数据,而MVS输入的是标定的数据。 为什么SFM无法重建出稠密的点云,但是MVS可以? SFM中我们用来做重建的点是由特征匹配提供的!这些匹配点天生不密集!MVS则几乎对照片中的每个像素点都进行匹配,几乎重建每一个像素点的三维坐标,这样得到的点的密集程度可以较接近图像为我们展示出的清晰度。 SFM和MVS关系 SFM给MVS算好了输入视角的位姿,内参,稀疏点云以及它们的共视关系,MVS再利用这些信息以及彩色图

Vpn_zc的博客 1万+

【shiro】一、基础概念

来源:http://blog.youkuaiyun.com/swingpyzf/article/details/46342023/ &amp;&amp;&amp;&amp; http://jinnianshilongnian.iteye.com/blog/2018936 什么是Apache Shiro 1、什么是 apache shiro :   Apache Shiro是一个功能强大且易于使用的Ja...

weixin_34212762的博客 249

基于Isaac Gym与PPO算法的机械臂抓取任务仿真与强化学习实战(附完整代码与训练策略)

本文详细介绍了基于Isaac Gym与PPO算法的机械臂抓取任务仿真与强化学习实战。通过环境搭建、PPO算法实现、奖励函数设计等核心环节的优化,结合完整代码与训练策略,显著提升机械臂抓取效率与成功率。特别适合开发者快速掌握强化学习在机器人控制领域的应用。

weixin_29256771的博客 598

OpenCode:终端开源AI编程助手,多模型接入与实战指南

AI编程助手正在从IDE侧边栏走向终端环境。其核心原理是让模型直接读取项目文件、执行命令、查看报错,形成从诊断到修复的完整闭环,从而解决传统插件上下文割裂的问题。技术价值在于开源透明、模型无关,既可接入OpenAI等云端服务,也能通过Ollama连接本地模型,兼顾数据安全与离线场景。在工程实践中,它适用于长时间驻留项目、自动修Bug、团队统一AI工具链等需求。OpenCode正是这样一款终端AI助手,支持灵活配置第三方API密钥,提供免费档与Go套餐,并通过Skills技能系统让模型遵循标准操作流程。同时,

weixin_28745821的博客 326

SpringBoot整合Shiro实现权限控制

文章目录1、SpringBoot整合Shiro1.1、shiro简介1.2、代码的具体实现1.2.1、Maven的配置1.2.2、整合需要实现的类1.2.3、项目结构1.2.4、ShiroConfig的实现1.2.5、CustomerRealm的实现1.2.6、shiro缓存配置1.2.7、主页index.html的设置1.3、简单测试1.3.1、admin角色所有权限测试1.3.2、无角色有权限测试1.3.3、无角色无权限测试1.4 项目源码 1、SpringBoot整合Shiro Apache Shi

yuwenS的博客 1038

【实战】ComfyUI-Impact-Subpack插件安装与UltralyticsDetectorProvider节点修复全流程

本文详细解析了ComfyUI中UltralyticsDetectorProvider节点缺失的原因,并提供了完整的ComfyUI-Impact-Subpack插件安装与修复全流程。核心在于Impact Pack插件架构调整导致节点被拆分至子插件包。指南涵盖手动安装、依赖安全配置、模型文件管理及深度排错步骤,帮助用户彻底解决节点缺失问题,恢复工作流正常运行。

weixin_29290947的博客 437

spring boot + shiro 实现角色权限控制

spring boot + shiro 实现角色权限控制 简介 Apache Shiro 是一个强大并且易于使用的java安全框架,可以用与身份验证、授权、加密和会话管理。同样的框架还有spring security,spring security有很好的平台支持,和活跃的社区氛围,并且对spring完美兼容,但是使用难度上,远远超过shiro。 身份认证:用户身份识别。 授权:用户权限控制。知道来的人有没有资格进来。 加密:加密敏感数据,防止偷窥。比如密码md5两次加密。 会话管理:用户的时间敏感的状态

幕峰的博客 3039

Parasoft C++Test软件集成测试(部件测试)_实例讲解

本文以一组功能函数组件作为示例,讲解了如何使用C++Test进行软件集成测试。本文的示例比较简单,但是思路、方法和流程都是通用的,希望对大家有所帮助。

文章主要涉及嵌入式软件开发、测试、项目管理等,欢迎交流,共同进步。 730

使用 MATLAB/Simulink + Simscape Electrical 来构建一个CCHP微电网与新能源协同运行的模型

随着能源需求的增长和对环境保护要求的提高,冷热电联供(Combined Cooling, Heating and Power, CCHP)系统作为一种高效的分布式能源解决方案,越来越受到关注。CCHP系统通过利用一次能源同时产生电力、制冷和供热,实现了能源的梯级利用,提高了能源使用效率。结合太阳能、风能等可再生能源,可以进一步增强系统的灵活性和环保性。本文将详细介绍如何使用来构建一个CCHP微电网与新能源协同运行的模型,并通过仿真分析其性能表现。本文介绍了如何使用构建一个。

xiaoheshang_123的博客 141

Springboot 整合shiro实现权限控制

Springboot 整合shiro实现权限控制 Author:jeffrey Date:2019-04-08 一、开发环境: 1、mysql - 5.7 2、navicat(mysql客户端管理工具) 3、idea 2017.2 4、jdk8 5、tomcat 8.5 6、springboot2.1.3 7、mybatis 3 8、shiro1.4 9、maven3.3.9 二、数据库设计 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CB46ByC1-1604249108

qq_40699540的博客 483

购物车智能检测系统:YOLO26 + PyQt5 毕设实现

YOLO26 + PyQt5 完成购物车商品检测系统:标注数据集(OpenImages 筛选 + 自制 500 张),训练 100 epoch 得到 mAP50 约 0.89,集成商品定价后输出总价。建议先用 OpenImages 预训练权重在自制数据上调优(冻住 backbone 前 50 epoch),等 loss 稳定后再解冻全量训练。

m0_64661770的博客 55

Spring Boot 中整合 Shiro 实现认证、细粒度方法级别权限控制和其他一些 Shiro 的功能

Shiro 是一个功能强大且易于使用的Java安全框架,它提供了认证、授权、加密、会话管理等多种安全功能,可以轻松地与 Spring Boot 集成。本篇博客将介绍如何在 Spring Boot 中整合 Shiro,实现认证、细粒度方法级别权限控制和其他一些 Shiro 的功能。

Java老兵的后端进阶与AI前沿探索之路。 669

YOLOv11涨点改进 | Conv篇/小目标改进 | YOLOv11引入SPDConv卷积特征无损下采样模块,增加YOLOv11小目标P2检测层(助力小目标任务高效涨点)

本文提出了一种创新的SPDConv模块来优化YOLOv11模型,通过空间到深度(SPD)层和非步幅卷积层实现特征无损下采样。该方法有效解决了传统CNN中因跨步卷积和池化层导致的细粒度信息丢失问题,特别提升了小目标检测性能。实验表明,SPDConv在目标检测和图像分类任务中显著优于现有SOTA模型。文章详细介绍了模块原理、核心代码实现,并提供了YOLOv11集成SPDConv的具体方法,包括配置文件修改和P2层增强等优化技巧。该技术为计算机视觉任务提供了一种高效的特征保留方案。

Ai缝合怪、助力小伙伴高效发论文 586

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

使用Spring Boot整合Shiro和JWT实现基于注解的权限控制

在Web应用程序中,权限控制是保护资源和确保用户访问安全的重要组成部分。Shiro是一个强大的安全框架,而JWT(JSON Web Token)是一种用于身份验证和授权的开放标准。本文将介绍如何使用Spring Boot整合Shiro和JWT,并通过注解实现基于角色和权限的权限控制。

果酱 の 博客 2333

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Spring Boot + Shiro实现权限控制DEMO

Spring Boot + Shiro项目搭建一、Spring Boot快速入门1.1 创建Maven Web项目1.2 修改pox.xml1.3 编写测试Controller类1.4 编写Spring Boot启动类1.5 导入thymeleaf模板1.5.1 导入thymeleaf依赖1.5.2 在Controller中添加testThymeleaf()方法1.5.3 在resource中创建...

qq_41513228的博客 898

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

SpringBoot+Shiro+JWT实现登录和权限控制

SpringBoot+Shiro+JWT实现登录和权限控制认证和授权Shiro 和JWT的简单介绍实现认证和授权的整体思路数据库表设计代码实现登录JWT生成token(附带验证的一些工具类)过滤器自定义MyRealmMyRealm的解释Shiro注解代码测试登录未携带token访问资源携带token访问需要guest角色但却是admin的tokenguest权限guest的token权限不足的情况有权限访问 认证和授权 认证(authentication) 在程序中认证要做的事情主要是搞明白访问者是谁,他有

jike11231的博客 1438

Springboot + shiro +jwt 实现登录和权限控制

Springboot + shiro +jwt 项目 Maven依赖 Springboot采用的是2.2.0 下面是jwt 和shiro的依赖 <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version>3.2.0</version>

weixin_43803888的博客 1570
上一篇: Springboot web工程中多数据源配置
下一篇: 日期格式的正则表达式
Rolandcoder
博客等级 码龄10年 19粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值