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,只需直接声明配置类,再配置一个生成SecurityFilterChainBean的方法,把原来的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 应用:

  1. 应用代码通过 Subject 来进行认证和授权,而 Subject 又委托给 SecurityManager;
  2. 我们需要给 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>

image-20210303064855164
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";}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/106963.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ctfshow-web13 文件上传

0x00 前言 CTF 加解密合集CTF Web合集 0x01 题目 0x02 Write Up 首先看到是一个上传页面&#xff0c;测试其他无果&#xff0c;遂进行目录遍历&#xff0c;发现upload.php.bak文件 可以看到这里的限制条件&#xff0c;大小&#xff0c;以及内容&#xff0c;这里可以使用.use…

LeetCode669. 修剪二叉搜索树

669. 修剪二叉搜索树 文章目录 [669. 修剪二叉搜索树](https://leetcode.cn/problems/trim-a-binary-search-tree/)一、题目二、题解方法一&#xff1a;递归法方法二&#xff1a;迭代法 一、题目 给你二叉搜索树的根节点 root &#xff0c;同时给定最小边界low 和最大边界 hig…

使用秘籍|如何实现图数据库 NebulaGraph 的高效建模、快速导入、性能优化

本文整理自 NebulaGraph PD 方扬在「NebulaGraph x KubeBlocks」meetup 上的演讲&#xff0c;主要包括以下内容&#xff1a; NebulaGraph 3.x 发展历程NebulaGraph 最佳实践 建模篇导入篇查询篇 NebulaGraph 3.x 的发展历程 NebulaGraph 自 2019 年 5 月开源发布第一个 alp…

opencv进阶19-基于opencv 决策树cv::ml::DTrees 实现demo示例

opencv 中创建决策树 cv::ml::DTrees类表示单个决策树或决策树集合&#xff0c;它是RTrees和 Boost的基类。 CART是二叉树&#xff0c;可用于分类或回归。对于分类&#xff0c;每个叶子节点都 标有类标签&#xff0c;多个叶子节点可能具有相同的标签。对于回归&#xff0c;每…

【Acwing291】蒙德里安的梦想(状态压缩dp)详细讲解

题目描述 题目分析 显而易见的重要事实 首先&#xff0c;需要明白一个很重要的事实&#xff1a; 所有的摆放方案数所有横着摆放且合理的方案数 这是因为&#xff0c;横着的确定之后&#xff0c;竖着的一定会被唯一确定&#xff0c;举一个例子&#xff1a; ------唯一确定-…

RabbitMQ---订阅模型-Fanout

1、 订阅模型-Fanout Fanout&#xff0c;也称为广播。 流程图&#xff1a; 在广播模式下&#xff0c;消息发送流程是这样的&#xff1a; 1&#xff09; 可以有多个消费者 2&#xff09; 每个消费者有自己的queue&#xff08;队列&#xff09; 3&#xff09; 每个队列都要绑定…

Windows 10【压缩卷】操作报错【无法将卷压缩到超出任何不可移动的文件所在的点】的解决方法

目录 一、背景 二、原因 三、解决方法 3.1 Windows自带的碎片清理工具 3.1.1 操作步骤 3.1.2 操作结果 3.2 MyDefrag工具清理磁盘碎片 3.2.1 操作步骤 3.2.2 操作结果 3.3 Windows自带的事件查看器 3.3.1 操作步骤 3.3.2 操作结果 3.4 关闭虚拟内存并删除虚拟内存…

离谱事件解决方法2 无法定位程序输入点XXX于动态链接库XXX.dll

事情经过&#xff1a; 本人一只acmer&#xff0c;使用sublime编写代码&#xff0c;但是前两天在打开cpp类型的文件的时候显示报错如下&#xff1a; 这里的dll文件就是动态链接库&#xff0c;它并不是一个可执行文件&#xff0c;里面存放的是程序的函数实现过程&#xff08;公用…

django+MySQL计算机毕设之图片推荐系统(报告+源码)

图片推荐系统是在的数据存储主要通过MySQL。用户在使用应用时产生的数据通过Python语言传递给数据库。通过此方式促进图片推荐信息流动和数据传输效率&#xff0c;提供一个内容丰富、功能多样、易于操作的平台。述了数据库的设计&#xff0c;系统的详细设计部分主要论述了几个主…

Ubuntu释放VMware虚拟磁盘未使用空间

By: Ailson Jack Date: 2023.08.26 个人博客&#xff1a;http://www.only2fire.com/ 本文在我博客的地址是&#xff1a;http://www.only2fire.com/archives/152.html&#xff0c;排版更好&#xff0c;便于学习&#xff0c;也可以去我博客逛逛&#xff0c;兴许有你想要的内容呢。…

面试之快速学习计算机网络-http

1. HTTP常见状态码 2. 3开头重定向&#xff0c;4开头客户端错误&#xff0c;5开头服务端错误 2. HTTP 报文 1. start-line&#xff1a;请求行&#xff0c;可以为以下两者之一&#xff1a; 请求行&#xff1a; GET /hello-world2.html HTTP/1.1状态行&#xff1a;HTTP/1.1 200…

YOLOv8教程系列:三、K折交叉验证——让你的每一份标注数据都物尽其用(yolov8目标检测+k折交叉验证法)

YOLOv8教程系列&#xff1a;三、K折交叉验证——让你的每一份标注数据都物尽其用&#xff08;yolov8目标检测k折交叉验证法&#xff09; 0.引言 k折交叉验证&#xff08;K-Fold Cross-Validation&#xff09;是一种在机器学习中常用的模型评估技术&#xff0c;用于估计模型的性…

JavaScript(笔记)

目录 Hello World JavaScript 的变量 JavaScript 动态类型 隐式类型转换 JavaScript 数组 JavaScript 函数 JavaScript 中变量的作用域 对象 DOM 选中页面元素 事件 获取 / 修改元素内容 获取 / 修改元素属性 获取 / 修改 表单元素属性 获取 / 修改样式属性 新…

Java版B/S架构 智慧工地源码,PC、移动、数据可视化智慧大屏端源码

智慧工地是什么&#xff1f;智慧工地主要围绕绿色施工、安全管控、劳务管理、智能管理、集成总控等方面&#xff0c;帮助工地解决运营、管理方面各个难点痛点。在互联网的加持下促进项目现场管理的创新与发展&#xff0c;实现工程管理人员与工程施工现场的整合&#xff0c;构建…

[机缘参悟-102] :IT人 - 管理的本质?管理人与从事技术的本质区别?人性、冰山模型、需求层次模型

感悟&#xff1a; 管理的本质是&#xff1a;学习各种管理理论、方法、技能&#xff0c;克服自身的人性缺点、预防他人人性的恶点、利用他人的人性特点拿到结果&#xff0c;从而完成组织、管理者的上司、管理者自身、管理者下属的目标。管理中的问题&#xff0c;80%以上都人性问…

rtmp直播

技术要求&#xff1a;nginxnginx-rtmpffmpegVLC 跟着大佬走的&#xff1a; 传送门 准备工作&#xff1a; 首先需要一台公网ip的服务器 这是使用天翼云的弹性云主机&#xff1a;免费试用1个月 天翼云官网 点击关机&#xff0c;更多里面选择重置密码&#xff0c; 默认用户名为…

根据案例写PLC程序-红绿灯控制

案例&#xff1a; 1、南北方向红灯点亮30s后熄灭&#xff1b; 2、在点亮南北方向红灯的同时点亮东西方向绿灯&#xff0c;并在点亮25s后&#xff0c;以0.5s熄灭0.5s点亮的时间闪烁3次后熄灭&#xff1b; 3、在东西方向绿灯熄灭后&#xff0c;东西方向黄灯点亮2s后熄灭&#xff…

数据库的增量备份与差异备份

在当今数字时代&#xff0c;数据已经成为公司的主要资产。为了维护这些珍贵的数据&#xff0c;公司通常会采取各种数据保护措施&#xff0c;其中增量备份是一种很有效的方法。本文将详细介绍什么是数据库的增量备份&#xff0c;以及如何帮助企业更有效地维护数据。  我们需要…

HTML+CSS 查漏补缺

目录 1&#xff0c;HTML1&#xff0c;尺寸的百分比1&#xff0c;普通元素2&#xff0c;绝对&#xff08;固定&#xff09;定位元素3&#xff0c;常见百分比 2&#xff0c;form 表单元素1&#xff0c;form2&#xff0c;button3&#xff0c;label4&#xff0c;outline5&#xff0…

Multisim软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 Multisim软件是一款电路仿真和设计软件&#xff0c;由美国国家仪器公司&#xff08;National Instruments&#xff09;开发。它提供了一个交互式的图形界面&#xff0c;使用户能够轻松地构建和仿真电路。以下是Multisim软件的详…