SpringBoot权限认证
SpringBoot的安全
常用框架:Shrio,SpringSecurity
两个功能:
- Authentication 认证
- Authorization 授权
权限:
- 功能权限
- 访问权限
- 菜单权限
原来用拦截器、过滤器来做,代码较多。现在用框架。
SpringSecurity
只要引入就可以使用
可以在官网看教程
几个重要的类:
- WebSecurityConfigurerAdapter 自定义Security策略
- AuthenticationManagerBuilder 自定义认证策略
- @EnableWebSercurity
基本操作
springboot 2.7.0前
继承WebSecurityConfigurerAdapter
重写configure(HttpSecurity http)方法——授权
使用链式编程
第一个小例子:
http.authorizeRequests() //自定义权限控制.antMatchers("/").permitAll() //所有人可以访问首页.addMatchers("/vip1").hasRole("vip1"); //vip1可以访问
//登录,也可以使用and()拼接
http.fromLogin(); //没有权限会自动跳转到登录页面,即使没有写过/login
源码:默认的login和login?error
重写Configure(AuthenticationManagerBuilder auth)方法——认证
2.7.0版本后,WebSecurityConfigurerAdapter被弃用
上面配置好了什么权限可以做什么事情,这里则用来做登录控制和权限查询操作
protected void configure(AuthenticationManagerBuilder auth){//因为反编译,新版要求所有密码必须加密BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();//JDBC认证 例子为blog_systemauth.jdbcAuthentication().passwordEncoder(encoder).dataSource(dataSource).usersByUsernameQuery(userSQL) //通过username、password、enabled登录控制.authoritiesByUsernameQuery(authoritySQL); //通过用户名、权限(在查询的第二列)获取role//内存认证 例子来自狂神说课堂笔记,没用数据库的例子auth.inMemoryAuthentication().passwordEncoder(encoder) .withUSer("name").password( new BCryptPasswordEncoder("123456")).roles("vip2","vip3").and() //通过and拼接其他用户.withUSer("name2").password(new BCryptPasswordEncoder("123456")).roles("vip2","vip3");//自定义认证规则,接受Service参数 例子来自VBlogauth.userDetailsService(userService);
}
上面的最后一种方式:UserService继承UserDetailService,并重写方法
@Overridepublic UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {User user = userMapper.loadUserByUsername(s);if (user == null) {//避免返回null,这里返回一个不含有任何值的User对象,在后期的密码比对过程中一样会验证失败return new User();}//查询用户的角色信息,并返回存入user中List<Role> roles = rolesMapper.getRolesByUid(user.getId());user.setRoles(roles); return user;}
登录之后若没权限,就是跳转到没权限界面了
基于方法的动态权限
将用户的权限保存在数据库中,并实现动态权限控制。
在配置类上使用@EnableGlobalMethodSecurity
来开启它;
然后在方法中使用@PreAuthorize
配置访问接口需要的权限;
@PreAuthorize("hasAuthority('pms:product:create')")
权限字符串自定。
再从数据库中查询出用户所拥有的权限值设置到UserDetails对象中去。
ruoyi项目使用了这种方法
缺点:方法权限写死在代买里了,不好维护。也可以通过过滤器、拦截器实现,
@Since 2.7.0 新用法
新用法非常简单,无需再继承WebSecurityConfigurerAdapter
,只需直接声明配置类,再配置一个生成SecurityFilterChain
Bean的方法,把原来的HttpSecurity配置移动到该方法中即可。
/*** SpringSecurity 5.4.x以上新用法配置* 为避免循环依赖,仅用于配置HttpSecurity* Created by macro on 2022/5/19.*/
@Configuration
public class SecurityConfig {@BeanSecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception {//省略HttpSecurity的配置return httpSecurity.build();}}
Security上下文
UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(authentication);
注销
前端请求/logout
http.logout();
//会请求/logout,可以自定义url。默认回到/login?logout
//看源码,可以清空cookies和session
http.logout().logoutUrl("/") //注销成功回首页.csrf().disable() //关闭防止csrf攻击 csrf:跨站请求攻击,可能屏蔽get。
模板引擎相关功能
页面定制
登录:loginPage(“”),改完之后默认的login就没有了
点进去看源码
/*
.formLogin(formLogin ->* formLogin* .usernameParameter( username ) //默认* .passwordParameter( password )* .loginPage( /authentication/login ) 登录路由* .failureUrl(/authentication/login?failed)* .loginProcessingUrl( /authentication/login/process ) 登陆验证页面* );
*/
“记住我”功能
http.rememberMe(); //登录页会有“记住我” 保存cookie 默认14天
Shiro
Apache 开源框架
三大对象:
- Subject 用户
- SecurityManager 管理用户
- Realm 连接数据
Subject:主体,代表了当前 “用户”,与当前应用交互的任何东西都是 Subject,如网络爬虫,人等;即一个抽象概念;所有 Subject 都绑定到 SecurityManager,与 Subject 的所有交互都会委托给 SecurityManager;可以把 Subject 认为是一个门面;SecurityManager 才是实际的执行者;
SecurityManager:安全管理器;即所有与安全有关的操作都会与 SecurityManager 交互;且它管理着所有 Subject;可以看出它是 Shiro 的核心,它负责与后边介绍的其他组件进行交互,如果学习过 SpringMVC,你可以把它看成 DispatcherServlet 前端控制器;
Realm:域,Shiro 从 Realm 获取安全数据(如用户、角色、权限),就是说 SecurityManager 要验证用户身份,那么它需要从 Realm 获取相应的用户进行比较以确定用户身份是否合法;也需要从 Realm 得到用户相应的角色 / 权限进行验证用户是否能进行操作;可以把 Realm 看成 DataSource,即安全数据源。
也就是说对于我们而言,最简单的一个 Shiro 应用:
- 应用代码通过 Subject 来进行认证和授权,而 Subject 又委托给 SecurityManager;
- 我们需要给 Shiro 的 SecurityManager 注入 Realm,从而让 SecurityManager 能得到合法的用户及其权限进行判断。
<!--shiro依赖- SSM--><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-core</artifactId><version>1.2.4</version></dependency><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-web</artifactId><version>1.2.4</version></dependency><dependency><groupId>org.apache.shiro</groupId><artifactId>shiro-spring</artifactId><version>1.2.4</version></dependency>
shiro-web提供了Web集成的支持,其通过一个 ShiroFilter 入口来拦截需要安全控制的 URL,然后进行相应的控制
1.编写配置类
@Configuration
public class ShiroConfig{//ShiroFilterFactoryBean@Beanpublic ShiroFilterFactoryBean hetShiroFilterFactoryBean(@Qualifier DefaultWebSercurityManager defaultWebSercurityManager){ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();//设置安全管理器bean.setSecurityManager(defau+ltWebSercurityManager);Map<String,String> filterMap = new LinkedHashMap<>();filterMap.put("","authc")return bean;}//DefaultWebSercurityManager@Beanpublic DefaultWebSercurityManager getDefaultWebSercurityManager(@Qualifier("userRealm") UserRealm userRealm){DefaultWebSercurityManager sercurityManager new DefaultWebSercurityManager();securityManager.setRealm(userRealm);return sercurityManager;}//Realm 自定义@Beanpublic Realm userRealm(){return new UserRealm();}
}
public UserRealm extends AuthorizingRealm{@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {// 用户名String username = (String) token.getPrincipal();// 密码String password = new String((char[]) token.getCredentials());Userlogin userlogin = null;try {userlogin = userloginService.findByName(username);} catch (Exception e) {e.printStackTrace();}if (userlogin == null) {// 没有该用户名throw new UnknownAccountException();} else if (!password.equals(userlogin.getPassword())) {// 密码错误throw new IncorrectCredentialsException();}// 身份验证通过,返回一个身份信息AuthenticationInfo aInfo = new SimpleAuthenticationInfo(username, password, getName());return aInfo;}
}
2.登录控制
//登录表单处理@RequestMapping(value = "/login", method = {RequestMethod.POST})public String login(Userlogin userlogin) throws Exception {//Shiro实现登录UsernamePasswordToken token = new UsernamePasswordToken(userlogin.getUsername(),userlogin.getPassword());Subject subject = SecurityUtils.getSubject();//如果获取不到用户名就是登录失败,但登录失败的话,会直接抛出异常//登录subject.login(token);if (subject.hasRole("admin")) {return "redirect:/admin/showStudent";} else if (subject.hasRole("teacher")) {return "redirect:/teacher/showCourse";} else if (subject.hasRole("student")) {return "redirect:/student/showCourse";}return "/login";}
相关文章:
SpringBoot权限认证
SpringBoot的安全 常用框架:Shrio,SpringSecurity 两个功能: Authentication 认证Authorization 授权 权限: 功能权限访问权限菜单权限 原来用拦截器、过滤器来做,代码较多。现在用框架。 SpringSecurity 只要引入就可以使…...
OpenGL-入门-BMP像素图glReadPixels
glReadPixels函数用于从帧缓冲区中读取像素数据。它可以用来获取屏幕上特定位置的像素颜色值或者获取一块区域内的像素数据。下面是该函数的基本语法: void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *da…...
同源策略以及SpringBoot的常见跨域配置
先说明一个坑。在跨域的情况下,浏览器针对复杂请求,会发起预检OPTIONS请求。如果服务端对OPTIONS进行拦截,并返回非200的http状态码。浏览器一律提示为cors error。 一、了解跨域 1.1 同源策略 浏览器的同源策略(Same-Origin Po…...
基于jeecg-boot的flowable流程跳转功能实现
更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码: https://gitee.com/nbacheng/nbcio-boot 前端代码:https://gitee.com/nbacheng/nbcio-vue.git 在线演示(包括H5) : http://122.227.135.243:9888 今天我…...
react图片预加载
道阻且长,行而不辍,未来可期 图片预加载的原理:new一个image对象,用这个对象加载图片,等这个对象将这个图片请求完后,再将这个图片放入原本应该放置的位置 代码如下: import React, { useEffe…...
数据库管理
SQL语言分类: DDL:数据定义语言,用于创建数据库对象,如库、表、索引等 DML:数据操纵语言,用于对表中的数据进行管理 DQL:数据查询语言,用于从数据表中查找符合条件的数据记录 DCL&am…...
【2023年11月第四版教材】《第8章-整合管理》(第3部分)
《第8章-整合管理》(第3部分) 9 监控项目工作9.1 监控项目工作★★★9.2 数据分析9.4 决策9.5 工作绩效报告 10 实施整体变更控制10.1 实施整体变更控制★★★ (18上36)10.2 变更请求★★★10.3变更控制工具★★★10.4 数据分析10…...
初阶数据结构(三)链表
💓博主csdn个人主页:小小unicorn💓 ⏩专栏分类:c 🚚代码仓库:小小unicorn的学习足迹🚚 🌹🌹🌹关注我带你学习编程知识 前面我们讲的线性表的顺序存储结构。它…...
Python小知识 - 八大排序算法
八大排序算法 排序算法是计算机科学中非常重要的一个研究领域。排序算法可以分为内部排序和外部排序,内部排序是数据记录在计算机内部,而外部排序是数据记录在计算机外部,这里我们主要讨论内部排序。 内部排序中的算法大致可以归纳为四类&…...
安卓动态申请权限
我们在使用一些官方app时,刚下载进去之后经常会弹出各种各样的权限获取请求,今天简单学习了下,希望不会误人子弟哈哈哈哈。 一、将需要用到的权限添加到Manifest清单里 <uses-permission android:name"android.permission.WRITE_EXT…...
关于亚马逊云科技云技能孵化营学习心得
1、活动介绍 本活动主要是面向想要全面了解亚马逊云科技 (Amazon Web Services) 云的个人,而不受特定技术角色的限制。内容包括亚马逊云科技云概念、亚马逊云科技服务、安全性、架构、定价和支持等等,此外还可以参加亚马逊的认证考试。 2、学习过程 该…...
计算机安全学习笔记(III):强制访问控制 - MAC
基本概念 强制访问控制是一种高级访问控制机制,旨在通过强制执行事先定义的安全策略,实现资源和信息的严格保护。与自主访问控制(Discretionary Access Control,DAC)不同,MAC 的控制权不由用户自身决定&am…...
java判断ip是否为指定网段
具体网络知识原理请看这个博文 /**** param address servletRequest.getRemoteAddr();* param host servletRequest.getRemoteHost();* return* Description 检验IP是否符合安全限定*/private boolean ipIsInNet(String address, String host){Set<String> iPset allow…...
如何通过人工智能和自动化提高供应链弹性?
全球供应链中的数字化转型已经引起了广泛关注,尽管在过去的十年中,这一话题被广泛讨论,但许多公司仍然对如何实现这一不明确的目标感到困惑。人们普遍认识到这种转变的重要性,而新冠疫情及其带来的巨大影响也为行业向数字化转型方…...
【Apollo学习笔记】——规划模块TASK之PATH_REUSE_DECIDER
文章目录 前言PATH_REUSE_DECIDER功能简介PATH_REUSE_DECIDER相关配置PATH_REUSE_DECIDER总体流程PATH_REUSE_DECIDER相关子函数IsCollisionFreeTrimHistoryPathIsIgnoredBlockingObstacle和GetBlockingObstacleS Else参考 前言 在Apollo星火计划学习笔记——Apollo路径规划算…...
框架分析(6)-Ruby on Rails
框架分析(6)-Ruby on Rails 专栏介绍Ruby on Rails核心概念以及组件讲解MVC架构模式约定优于配置强大的ORM支持自动化测试丰富的插件生态系统RESTful路由安全性总结 优缺点优点快速开发简单易学MVC架构强大的ORM支持大量的插件和Gem支持 缺点性能问题学习…...
LLMs NLP模型评估Model evaluation ROUGE and BLEU SCORE
在整个课程中,你看到过类似模型在这个任务上表现良好,或者这个微调模型在性能上相对于基础模型有显著提升等陈述。 这些陈述是什么意思?如何形式化你的微调模型在你起初的预训练模型上的性能改进?让我们探讨一些由大型语言模型开…...
BlazorServer中C#与JavaScript的相互调用
BlazorServer中C#与JavaScript的相互调用 前言: 虽然BlazorServer中推荐使用C#在razor页面中的替代JavaScript来完成逻辑的编写,但当需要使用第三方的javascript文件/组件里的内容时,则难免要在C#中调用其方法或对象。反之当你的(用到第…...
深入理解 MD5 消息摘要算法和在密码存储中的应用及安全隐患
MD5 算法相信很多开发人员都听说过, 一个最常见的使用到它的地方就是密码的存储. 当然, 很多人会说, 这个算法已经不太安全了, 确实如果你想更安全的保存密码, 则应该考虑其它更安全的算法, 不过这不属于此次讨论的主题. 什么是 MD5 MD5 是一种算法, MD5 中的 MD 代表 Message…...
python网络爬虫指南二:多线程网络爬虫、动态内容爬取(待续)
文章目录 一、多线程网络爬虫1.1 线程的基础内容、GIL1.2 创建线程的两种方式1.3 threading.Thread类1.4 线程常用方法和锁机制1.5 生产者-消费者模式1.5.1 生产者-消费者模式简介1.5.2 Condition 类协调线程 1.6 线程中的安全队列1.6 多线程爬取王者荣耀壁纸1.6.1 网页分析1.6…...
华为AirEgine9700S AC配置示例
Vlan97为管理Vlan <AirEgine9700S>dis cu Software Version V200R021C00SPC100 #sysname AirEgine9700S #http timeout 60http secure-server ssl-policy default_policyhttp secure-server server-source -i allhttp server enable #set np rss hash-mode 5-tuple # md…...
VUE3基础
一、vue-router v4.x 介绍 | Vue Router 1、安装 yarn add vue-routernext next代表最新的版本 2、路由配置 在src目录下,新建router/index.ts,具体配置如下 import {RouteRecordRaw,createRouter,createWebHashHistory} from vue-router const r…...
Qt应用开发(基础篇)——日历 QCalendarWidget
一、前言 QCalendarWidget类继承于QWidget,是Qt设计用来让用户更直观的选择日期的窗口部件。 时间微调输入框 QCalendarWidget根据年份和月份初始化,程序员也通过提供公共函数去改变他们,默认日期为当前的系统时间,用户通过鼠标和…...
Python学习笔记:正则表达式、逻辑运算符、lamda、二叉树遍历规则、类的判断
1.正则表达式如何写? 序号实例说明1.匹配任何字符(除换行符以外)2\d等效于[0-9],匹配数字3\D等效于[^0-9],匹配非数字4\s等效于[\t\r\n\f],匹配空格字符5\S等效于[^\t\r\n\f],匹配非空格字符6\w等效于[A-Za-z0-9]&…...
【滑动窗口】leetcode1004:最大连续1的个数
一.题目描述 最大连续1的个数 这道题要我们找最大连续1的个数,看到“连续”二字,我们要想到滑动窗口的方法。滑动窗口的研究对象是一个连续的区间,这个区间需要满足某个条件。那么本题要找的是怎样的区间呢?是一个通过翻转0后得到…...
力扣:73. 矩阵置零(Python3)
题目: 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 来源:力扣(LeetCode) 链接:力扣(LeetCode)官网 - 全球极客挚…...
VB|基础语法 变量定义 函数定义 循环语句 IF判断语句等
文章目录 变量定义函数定义控制台输入输出switch case语句IF语句FOR循环语句不等于逻辑运算符 变量定义 int Dim 变量名 As Int32 0 string Dim 变量名 As String "" bool Dim 变量名 As Boolean False 枚举 Dim 变量名 As 枚举名 数组 Dim array(256) As String…...
Github 博客搭建
Github 博客搭建 准备工作 准备一个 github 账号;建立 github 仓库,仓库名为 username.github.io,同时设置仓库为 public;clone 仓库,写入一个 index.html 文件,推送到仓库(许多网上的教程会有…...
模型预测笔记(三):通过交叉验证网格搜索机器学习的最优参数
文章目录 网络搜索介绍步骤参数代码实现 网络搜索 介绍 网格搜索(Grid Search)是一种超参数优化方法,用于选择最佳的模型超参数组合。在机器学习中,超参数是在训练模型之前设置的参数,无法通过模型学习得到。网格搜索…...
创建型模式-建造者模式
使用多个简单的对象一步一步构建成一个复杂的对象 主要解决:主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部…...
哪个网站有手工活做/绍兴seo计费管理
RPC(Reomte Procedure Call Protocol) 远程过程调用协议,一种通过网络从远程计算机上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如 TPC或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RP…...
做b2c网站多少钱/无人区在线观看高清1080
转载于:https://www.cnblogs.com/iamCarson/p/6102719.html...
金钟街网站建设哪家好/武汉seo顾问
图像处理中,有很多算法由于其内在的复杂性是天然的耗时大户,加之图像本身蕴涵的数据量比一般的对象就大,因此,针对这类算法,执行速度的提在很大程度上依赖于硬件的性能,现在流行的CPU都是至少2核的…...
做网站公众号多少钱/上海app开发公司
实验二:缓冲区溢出实验(war-ftp 1.65)一、实验目的1、掌握缓冲区溢出的原理缓冲区是程序运行期间在内存中分配的一个连续的区域,用于保存包括字符数组在内的各种数据类型。溢出就是所填充的数据超过原有的缓冲区边界,使…...
珠海在线网站建设/seo公司培训课程
哈喽大家好,我是无知便是罪,专注于收集和分享互联网上不为人知的好东西!文件传输想必大家经常会用到,但是使用场景不同选择也不同!像平常的小文件通过某些社交软件即可在手机与电脑之间快速传输。不过它们限制了文件大…...
微信公众号电商网站开发/珠海百度seo
在使用left join的过程中,总是遇到一个问题,就是将条件放在on中还是where条件中。 在查过一些资料和实际操作后,总结了一下: 在多张表连接时,都会生成一张中间表,然后再将这张临时表返回给用户。 …...