权限控制_SpringSecurity
认证-授权
认证:系统提供的用于识别用户身份的功能,通常提供用户名和密码进行登录其实就是在进行认证,认证的目的是让系统知道你是谁。
授权:用户认证成功后,需要为用户授权,其实就是指定当前用户可以操作哪些功能。
实现最终的权限控制,需要以下的表结构来支持
用户表t_user、权限表t_permission、角色表t_role、菜单表t_menu、用户角色关系表t_user_role、角色权限关系表t_role_permission、角色菜单关系表t_role_menu。

认证过程:只需要用户表就可以了,在用户登录时可以查询用户表t_user进行校验,判断用户输入的用户名和密码是否正确。
授权过程:用户必须完成认证之后才可以进行授权,首先可以根据用户查询其角色,再根据角色查询对应的菜单,这样就确定了用户能够看到哪些菜单。然后再根据用户的角色查询对应的权限,这样就确定了用户拥有哪些权限。所以授权过程会用到上面7张表。
Spring Security简介
Spring Security是 Spring提供的安全认证服务的框架。 使用Spring Security可以帮助我们来简化认证和授权的过程。官网:Spring Security
Spring Security入门案例
1.创建maven工程,打包方式为war,对应的maven坐标
<dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-web</artifactId><version>5.0.5.RELEASE</version>
</dependency>
<dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-config</artifactId><version>5.0.5.RELEASE</version>
</dependency>
2.配置web.xml
3.配置spring-security.xml
4.新建一个index.xml文件
运行tomcat,在地址栏访问index.htm,发现自动跳转到spring_security.xml提供的登陆界面,说明
Spring Security将项目中的所有资源都保护了起来,要访问这些资源必须要完成认证而且需要具有ROLE_ADMIN角色
<security:intercept-url pattern="/**" access="hasRole('ROLE_ADMIN')" />
改进案例
允许匿名访问的资源
1、项目中将所有的资源(所有请求URL)都保护起来,实际环境下往往有一些资源不需要认证也可以访问(例如登录界面),也就是可以匿名访问。
<!--http:用于定义相关权限控制指定哪些资源不需要进行权限校验,可以使用通配符
--><security:http security="none" pattern="/pages/a.html" /><security:http security="none" pattern="/paegs/b.html" /><security:http security="none" pattern="/pages/**"></security:http>
自定义登录界面
2、登录页面是由框架生成的,而项目往往会使用自己的登录页面。
使用指定的登录页面,自己设置一个登录界面放到指定路径下
修改spring-security.xml文件,指定login.html页面可以匿名访问
<security:http security="none" pattern="/login.html" />
修改spring-security.xml文件,加入表单登录信息的配置
<!--如果要使用自己指定的页面作为登陆界面,必须配置登录表单form-login:定义表单登录信息login-processing-url:框架提供的方法,页面提交的登录表单请求是由框架负责处理,不用再书写controllerdefault-target-url:认证成功后跳转目标authentication-failure-url:认证失败后跳转目标--><security:form-login login-page="/login.html"username-parameter="username"password-parameter="password"login-processing-url="/login.do"default-target-url="/index.html"authentication-failure-url="/login.html"></security:form-login>
修改spring-security.xml文件,关闭CsrfFilter过滤器
!--csrf:对应CsrfFilter过滤器disabled:是否启用CsrfFilter过滤器,如果使用自定义登录页面需要关闭此项,否则登录操作会被禁用(403)--><security:csrf disabled="true"></security:csrf>
csrf是默认登录界面的校验码,如果不关闭,则判断校验码是否合法,而自己设置的登录界面没有此校验码,比较则会产生403错误
在数据库中查询数据
3、直接将用户名和密码配置在了配置文件中,而真实生产环境下的用户名和密码往往保存在数据库中。
UserService实现类,按照框架的要求实现了UserDetailsService接口。在spring配置文件中注册UserService,指定其作为认证过程中根据用户名查询用户信息的处理类。当进行登录操作时,spring security框架会调用UserService的loadUserByUsername方法查询用户信息,并根据此方法中提供的密码和用户页面输入的密码进行比对来实现认证操作。
UserDetials接口的实现方法User中包含参数用户名和密码
角色登录成功,但是权限不够
密码加密
4、在配置文件中配置的密码使用明文,这非常不安全,而真实生产环境下密码需要进行加密
常见的密码加密方式有:
3DES、AES、DES:使用对称加密算法,可以通过解密来还原出原始密码
MD5、SHA1:使用单向HASH算法,无法通过计算还原出原始密码,但是可以建立彩虹表进行查表破解
bcrypt:将salt随机并混入最终加密后的密码,验证时也无需单独提供之前的salt,从而无需单独处理salt问题
加密后的格式一般为:
$2a$10$/bTVvqqlH9UiE0ZJZ7N2Me3RIgUCdgMheyTgV0B4cMCSokPa.6oCa
第一步:在spring-security.xml文件中指定密码加密对象
<!--配置密码加密对象-->
<bean id="passwordEncoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" /><!--认证管理器,用于处理认证操作-->
<security:authentication-manager><!--认证提供者,执行具体的认证逻辑--><security:authentication-provider user-service-ref="userService"><!--指定密码加密策略--><security:password-encoder ref="passwordEncoder" /></security:authentication-provider>
</security:authentication-manager>
<!--开启spring注解使用-->
<context:annotation-config></context:annotation-config>
第二步:修改UserService实现类

在实现类中使用自动注入后,记得在配置中开启自动注解
<!--开启spring注解使用-->
<context:annotation-config></context:annotation-config>
配置多种校验规则
用户登录后,根据不同的角色和权限允许访问不同的页面
<!--只要认证通过就可以访问-->
<security:intercept-url pattern="/index.jsp" access="isAuthenticated()" />
<security:intercept-url pattern="/a.html" access="isAuthenticated()" /><!--拥有add权限就可以访问b.html页面-->
<security:intercept-url pattern="/b.html" access="hasAuthority('add')" /><!--拥有ROLE_ADMIN角色就可以访问c.html页面-->
<security:intercept-url pattern="/c.html" access="hasRole('ROLE_ADMIN')" /><!--拥有ROLE_ADMIN角色就可以访问d.html页面,注意:此处虽然写的是ADMIN角色,框架会自动加上前缀ROLE_-->
<security:intercept-url pattern="/d.html" access="hasRole('ADMIN')" />
注解方式权限控制
Spring Security除了可以在配置文件中配置权限校验规则,还可以使用注解方式控制类中方法的调用。例如Controller中的某个方法要求必须具有某个权限才可以访问,此时就可以使用Spring Security框架提供的注解方式进行控制
第一步:在spring-security.xml文件中配置组件扫描,用于扫描Controller
<mvc:annotation-driven></mvc:annotation-driven>
<context:component-scan base-package="com.itheima.controller"></context:component-scan>
第二步:在spring-security.xml文件中开启权限注解支持
第三步:创建Controller类并在Controller的方法上加入注解进行权限控制

@PreAuthorize("hasAuthority('add')")//表示用户必须拥有add权限才能调用当前方法
退出登录状态
用户在登录之后可以如果有角色和权限可以随意访问页面,但是只要访问了退出登录界面,就会需要重新登录才能继续访问页面
相关文章:
权限控制_SpringSecurity
认证-授权 认证:系统提供的用于识别用户身份的功能,通常提供用户名和密码进行登录其实就是在进行认证,认证的目的是让系统知道你是谁。 授权:用户认证成功后,需要为用户授权,其实就是指定当前用户可以操作…...
2023年最系统的自动化测试,测试开发面试题,10k以下不建议看
鉴于现在严峻的就业形势,千万大学生即将出新手村,今天给大家打包好了2023最能避免薪资倒挂的《面试圣经》。不经一番寒彻骨,怎得梅花扑鼻香。这份面试题,与君共勉! 一、开场白 Q:简单自我介绍一下吧 Q:项…...
今年SMETA审核费用即将涨价
【今年SMETA审核费用即将涨价】 SMETA全称( Sedex Members Ethical Trade Audit ),即Sedex会员社会道德贸易审核,它是Sedex发起的一种负责任的供应链审计方法/项目。 Sedex是一个全球性的责任商业平台,SMETA是审核方法…...
基于贝叶斯优化CNN-LSTM混合神经网络预测(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
基于深度学习和生理信号的疾病筛查:个体内和个体间研究的价值与应用
一、引言 随着深度学习技术的飞速发展,基于生理信号的疾病筛查和诊断方法在医学领域得到了广泛应用。这些方法通常利用个体内和个体间的生理信号数据,通过训练深度学习模型实现疾病的自动识别和预测。本文将讨论个体内和个体间研究在这一领域的价值和应…...
现在有t1,t2,t3三个线程,实现t1,t2线程同步执行,然后再执行t3线程,使用Java实现该程序
目录 1、利用CountDownLatch 2、利用Future 最近在面试的时候,经常遇到这个题目,首先从题目上看,就知道考察的是多线程方面知识,我第一次看到这个题目的时候,就想到了使用CountDownLatch这个计数器来实现,…...
83.qt qml-初步学习2D粒子影响器(二)
由于QmlBook in chinese翻译过来的文字有些比较生疏难于理解,所以本章在它的基础上做些个人理解,建议学习的小伙伴最好配合QmlBook in chinese一起学习。 QML粒子所有类型: Qt Quick Particles QML Types | Qt Quick 6.5.0 Affector类型: Attractor QML Type | Qt Quick 6.5.…...
4.17-4.18学习总结
MD5 MD5: 1、压缩性 2、容易计算 3、抗修改性 4、弱抗碰撞 5、强抗碰撞 为什么需要MD5? 存储一些敏感信息的时候,如果不进行加密会出现安全问题。 例如:系统登录的密码,如果数据库中的密码采用明文,一旦数据库泄…...
Spring事务
事务作用: 事务作用:在数据层保障一系列的数据库操作同成功同失败Spring事务作用:在数据层或 业务层 保障一系列的数据库操作同成功同失败 Spring为了管理事务,提供了一个平台事务管理器PlatformTransactionManager commit是用来提…...
Linux新的设备或分区挂载到系统中mount使用方法
如果想将一个新的设备或分区挂载到系统中,可以按照以下步骤进行操作: 确定要挂载的设备或分区的设备名,例如 /dev/sdb1。 创建挂载点,可以在任何目录下创建一个新目录作为挂载点,例如 /mnt/mydevice。 sudo mkdir /mn…...
移动硬盘损坏如何恢复数据
移动硬盘一种小巧便携的存储介质,可用于各电脑之间交换大容量数据,可以随时插拔,进行高速传输数据。但有好也有坏,在我们使用中也会出现一些移动硬盘损坏故障,比如说提示格式化、硬盘分区丢失、误格式化、文件误删除等…...
Material Design:为你的 Android 应用提供精美的 UI 体验
Material Design:为你的 Android 应用提供精美的 UI 体验 介绍 Material Design 概念:介绍 Material Design 是 Google 推出的一种设计语言,用于创建现代、美观、直观且一致的用户界面。解释 Material Design 的基本原则,包括材料…...
springboot+vue学生毕业离校系统(源码+说明文档)
风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的学生毕业离校系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 💕💕作者:风…...
【Android入门到项目实战-- 6.2】—— 如何访问其他应用程序的数据?
目录 一、ContentResolver基本用法 如何查询? 如何向表中添加一条数据? 如何更新这条新添加的数据? 如何删除这条数据? 二、读取系统联系人 要想你的APP访问其他应用程序的数据,需要使用内容提供器,下面使…...
【100个 Unity实用技能】 | InputField输入框组件实现输入限制,只能输入中文或特殊字符等
🎬 博客主页:https://xiaoy.blog.csdn.net 🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN🙉 🎄 学习专栏推荐:Unity系统学习专栏 🌲 游戏制作专栏推荐:游戏制作 &…...
倍数+路径之谜
倍数 :用户登录https://www.lanqiao.cn/problems/583/learning/?page5&first_category_id1&sortstudents_count 题目描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 请问在 1 到 2020 中,有多少个…...
【Unity渲染】URP透明物体自身渲染穿插异常问题
背景: 对于URP中的某个物体,我们如果希望他正反面都可以被渲染。 通常会有两种解决方案: 1.将网格设置为双面网格。(此种情况Mesh.RecalculateNormals计算结果可能会异常,解决可参考网格法线生成异常解决࿰…...
c/c++:指针,指针定义和使用,指针大小4字节,野指针,空指针*p=NULL
c/c:指针,指针定义和使用,指针大小4字节,野指针,空指针*pNULL 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,此时学会c的话, 我所知道的周边的会c的同学…...
CAS实现原⼦操作的三⼤问题,该如何解决?
目录 1、ABA问题 2.循环时间长开销大 3、只能保证一个共享变量的原子操作 总结: CAS(Compare-and-Swap)是一种用于实现原子操作的技术,但是它存在着三个主要的问题:ABA问题、循环时间长开销大、只能保证一个共享变…...
Linux Shell 实现一键部署二进制go+caddy+filebrowser
filebrowser filebrowser 是一个使用go语言编写的软件,功能是可以通过浏览器对服务器上的文件进行管理。可以是修改文件,或者是添加删除文件,甚至可以分享文件,是一个很棒的文件管理器,你甚至可以当成一个网盘来使用。…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
