Spring Security权限控制系列(二)
suiw9 2025-03-14 20:31 19 浏览 0 评论
环境:Springboot2.4.12 + Spring Security 5.4.9
本篇主要内容:请求拦截及自定义登录页面
上一篇:《Spring Security权限控制系列(一)》
自定义拦截请求
默认项目中引入Spring Security后会拦截所有的请求,这其中包括了静态资源,这肯定不是我们希望的,接下来我们看如何进行资源自定义的拦截。
- 新建如下静态资源
- 配置静态资源访问路径
由于静态资源默认访问路径是/**,这里为了区分静态资源与Controller给静态资源加一个前缀。
spring:
mvc:
static-path-pattern: /resources/**
- 访问静态资源
先将Spring Security从项目中移除,然后进行访问。分别访问index.js和index.html
都能正常访问,接下来将Spring Security加到项目中后,再进行访问会发现之前还能访问的现在直接跳转到了登录页面
- 静态资源放行
自定义配置设置路径方向规则
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests() // 获取基于SpEL表达式的基于URL的授权对象
.antMatchers("/resources/**") // 设定URI路径规则以/resoures开头的任意请求
.permitAll() ; // 只要是基于上面/resources开头的请求都进行放行
http.formLogin() ; // 如果请求不是上面配置的访问uri前缀则进行登录
}
}
再次访问静态资源,这时候就能正常访问了,没有跳转到登录页面,在访问Controller接口 GET /demos/home运行结果
发现静态资源能访问,同时我们的Controller也能访问
- 修改配置只放行指定的资源
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/resources/**")
.permitAll() ; // 方向/resource请求的资源 ①
http
.authorizeRequests()
.anyRequest() // 任意请求
.authenticated() ; // 必须进行登录认证授权 ②
http.formLogin() ;
}
以上配置后以/resources前缀的请求都会方向,其它任意的请求都会进行拦截跳转到登录页面。
注意:上面的 ① ② 如果顺序进行颠倒后服务启动会报错。报错信息如下
Caused by: java.lang.IllegalStateException: Can't configure antMatchers after anyRequest
at org.springframework.util.Assert.state(Assert.java:76) ~[spring-core-5.3.12.jar:5.3.12]
不能在anyRequest之后配置antMatchers。
- 为请求配置角色
定义2个Controller
@RestController
@RequestMapping("/demos")
public class DemoController {
@GetMapping("home")
public Object home() {
return "demos home" ;
}
}
@RestController
@RequestMapping("/api")
public class ApiController {
@GetMapping("/{id}")
public Object get(@PathVariable("id") Integer id) {
return "获取 - " + id + " - 数据" ;
}
}
我们期望/demos/**接口访问必须拥有USERS权限,/api/**接口访问必须拥有ADMIN权限, 配置如下:
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
// 配置guest用户,该用户拥有ADMIN角色
auth.inMemoryAuthentication().passwordEncoder(NoOpPasswordEncoder.getInstance()).withUser("guest").password("123456").roles("ADMIN") ;
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable() ;
http.authorizeRequests().antMatchers("/resources/**").permitAll() ;
// 这里无需使用ROLE_前缀,系统会自动插入该前缀
http.authorizeRequests().antMatchers("/demos/**").hasRole("USERS") ; // /demos/**必须具备USERS角色
http.authorizeRequests().antMatchers("/api/**").hasRole("ADMIN") ; // /api/**必须具备ADMIN角色
http.authorizeRequests().anyRequest().authenticated() ;
http.formLogin() ;
}
分别访问/demos/home 和 /api/1接口
通过guest/123456登录后,该接口之间返回了403的状态错误(读取403.html)
/api/**接口访问正常,接下来我们在配置一个用于USERS权限的用户
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.passwordEncoder(NoOpPasswordEncoder.getInstance())
.withUser("guest").password("123456").roles("ADMIN")
.and()
.withUser("test").password("666666").roles("USERS") ;
}
通过test用户访问/demos/home接口登录后能正常访问。
- 配置多权限
在很多情况下我们期望只要用户用于任意其中一个权限就认定可以访问该资源,如何配置?
http.authorizeRequests().antMatchers("/demos/**").hasAnyRole("USERS", "AKKF", "BLLE") ;
http.authorizeRequests().antMatchers("/api/**").hasAnyRole("ADMIN", "MGR", "SYSTEM") ;
通过上面的配置即可满足只要拥有任意一个权限就可以放行。
- 其它配置
多个URI具有相同的权限
http.authorizeRequests().antMatchers("/demos/**", "/api/**").hasAnyAuthority("ROLE_USERS", "ROLE_ADMIN") ;
对请求的Method控制
http.authorizeRequests().antMatchers(HttpMethod.GET).permitAll() ;
自定义登录页面
- 引入依赖
org.thymeleaf
thymeleaf-spring5
org.springframework.boot
spring-boot-starter-thymeleaf
- thymeleaf配置
spring:
thymeleaf:
prefix: classpath:/templates/
- 登录页面
在/resources/templates/下新建login.html页面
这里省去无关紧要的东西
认证登录
安全登录
- Controller定义login页面
@Controller
public class LoginController {
@GetMapping("/custom/login")
public String login() {
return "login" ;
}
}
- 自定义配置登录页
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable() ;
http.authorizeRequests().antMatchers("/resources/**").permitAll() ;
http.authorizeRequests().antMatchers("/demos/**").hasRole("USERS") ;
http.authorizeRequests().antMatchers("/api/**").hasRole("ADMIN") ;
// 登录页面指向上面配置的Controller即可
http.formLogin().loginPage("/custom/login") ;
}
测试
总结:
- Spring Security如何配置拦截请求
- 资源访问必须具备权限的配置
- 自定义登录页面
到此本篇内容结束。下一篇将介绍:
- 自定义异常处理
一文带你彻底理解Spring WebFlux的工作原理
Spring MVC高级知识点自定义请求匹配路径
Spring WebFlux请求处理流程
Spring AOP实现原理源码详细分析
Spring Cloud Gateway应用详解1之谓词
Spring AOP切入点类型及系统提供的非常常用的切入点
Spring中自定义数据类型转换详解
Spring 引介增强IntroductionAdvisor使用
相关推荐
- 谁说 Vim 不好用?送你一个五彩斑斓的编辑器!
-
相信大家在使用各种各样强大的IDE写代码时都会注意到,代码中各种类型的关键字会用独特的颜色标记出来,然后形成一套语法高亮规则。这样不仅美观,而且方便代码的阅读。而在上古神器Vim中,我们通常看...
- Python 基础教程 九之cron定时执行python脚本
-
前言在Linux或Unix系统中,你可以使用cron任务来定时执行Python脚本。cron是一个基于时间的作业调度器,允许你安排命令或脚本在系统上自动执行。...
- RK3588主板Ubuntu 22.04固件刷机后需要进行哪些操作?
-
RK3588主板Ubuntu22.04固件刷机完成后,您需要进行以下操作:1、验证固件版本:确认您刷入的Ubuntu22.04固件版本是否正确,并且系统正常运行。...
- Ubuntu16.04搭建VNC Server远程桌面服务器
-
1.前言本文主要讲解Ubuntu16.04怎么安装VNCServer远程桌面服务器。VNC全称为VirtualNetworkComputing(虚拟网络计算)是一种图形化桌面共享工具,允许...
- 开源&Docker:何必nextcloud,新晋神级私人云盘,在线office编辑
-
本内容来源于@什么值得买APP,观点仅代表作者本人|作者:可爱的小cherry前言大家好,这里是可爱的Cherry。...
- Ubuntu系统,常用命令、IP配置等教程
-
Ubuntu系统常用命令与IP配置教程一、常用命令在Ubuntu系统中,掌握一些常用的命令对于日常操作非常重要,以下是常见的命令及其用法说明:1.ls—列出当前目录内容...
- Zed编辑器:Rust之力,Linux之翼,VS Code劲敌新篇章
-
Zed是一款支持多人协作...
- 如何在Ubuntu系统中进行系统级的代理设置
-
Ubuntu系统级代理设置步骤详解在Ubuntu系统中进行系统级的代理设置是一种常见的网络配置方式,尤其适用于需要通过代理访问互联网的场景。通过配置代理,你可以让系统中的所有应用程序(如浏览器、终端、...
- Linux Vim文本编辑器(linux用vi编辑文本)
-
在使用Linux操作系统的过程中,经常需要对文本文件进行操作,如新建、编辑等,常用的方法有以下几种:...
- 从零入门Linux(五)文本编辑器(linux好用的文本编辑器)
-
Linux系统提供了多种文本编辑器,每种编辑器都有其独特的功能和使用场景。以下按功能和复杂程度分类介绍:1.简单文本编辑器...
- 照片选择器,使用简单,几行代码就可以完成集成
-
照片选择器,使用简单,几行代码就可以完成集成来源:极客头条用于发表图片时候选择相册图片和拍照这样的需求,虽然网上也有很多类似的控件,写的挺不错的,但是深入使用就有些问题,还是自己写算了;网上的一些轮...
- 探索iOS 9适配(iphone适配)
-
CSDN移动将持续为您优选移动开发的精华内容,共同探讨移动开发的技术热点话题,涵盖移动应用、开发工具、移动游戏及引擎、智能硬件、物联网等方方面面。如果您想投稿,或寻求《近匠》报道,请发送邮件至tang...
- “旅行者”回望30载 一点淡蓝“焕新颜”
-
据美国国家航空航天局(NASA)网站12日报道,为纪念著名的“暗淡蓝点”(PaleBlueDot)照片问世30周年,NASA重新制作了这张照片,使其“焕新颜”,NASA喷气推进实验室于近日发布了新...
- 「底层技术原理体系」深入探索Java服务器性能监控Metrics框架
-
承接上文承接上文中的【深度挖掘Java性能调优】「底层技术原理体系」深入探索Java服务器性能监控Metrics框架的实现原理分析(Counter篇),我们知道和了解了对应的Counter计数器的作用...
你 发表评论:
欢迎- 一周热门
-
-
Linux:Ubuntu22.04上安装python3.11,简单易上手
-
宝马阿布达比分公司推出独特M4升级套件,整套升级约在20万
-
MATLAB中图片保存的五种方法(一)(matlab中保存图片命令)
-
别再傻傻搞不清楚Workstation Player和Workstation Pro的区别了
-
Linux上使用tinyproxy快速搭建HTTP/HTTPS代理器
-
如何提取、修改、强刷A卡bios a卡刷bios工具
-
Element Plus 的 Dialog 组件实现点击遮罩层不关闭对话框
-
日本组合“岚”将于2020年12月31日停止团体活动
-
SpringCloud OpenFeign 使用 okhttp 发送 HTTP 请求与 HTTP/2 探索
-
tinymce 号称富文本编辑器世界第一,大家同意么?
-
- 最近发表
-
- 谁说 Vim 不好用?送你一个五彩斑斓的编辑器!
- Python 基础教程 九之cron定时执行python脚本
- RK3588主板Ubuntu 22.04固件刷机后需要进行哪些操作?
- Ubuntu16.04搭建VNC Server远程桌面服务器
- 开源&Docker:何必nextcloud,新晋神级私人云盘,在线office编辑
- Ubuntu系统,常用命令、IP配置等教程
- Ubuntu 24.10安装体验(ubuntu 20.04.1安装教程)
- Zed编辑器:Rust之力,Linux之翼,VS Code劲敌新篇章
- 如何在Ubuntu系统中进行系统级的代理设置
- Linux Vim文本编辑器(linux用vi编辑文本)
- 标签列表
-
- dialog.js (57)
- importnew (44)
- windows93网页版 (44)
- yii2框架的优缺点 (45)
- tinyeditor (45)
- qt5.5 (60)
- windowsserver2016镜像下载 (52)
- okhttputils (51)
- android-gif-drawable (53)
- 时间轴插件 (56)
- docker systemd (65)
- slider.js (47)
- android webview缓存 (46)
- pagination.js (59)
- loadjs (62)
- openssl1.0.2 (48)
- velocity模板引擎 (48)
- pcre library (47)
- zabbix微信报警脚本 (63)
- jnetpcap (49)
- pdfrenderer (43)
- fastutil (48)
- uinavigationcontroller (53)
- bitbucket.org (44)
- python websocket-client (47)