百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

Spring Security权限控制系列(二)

suiw9 2025-03-14 20:31 15 浏览 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") ;
}

测试

总结

  1. Spring Security如何配置拦截请求
  2. 资源访问必须具备权限的配置
  3. 自定义登录页面

到此本篇内容结束。下一篇将介绍:

  1. 自定义异常处理

一文带你彻底理解Spring WebFlux的工作原理
Spring MVC高级知识点自定义请求匹配路径
Spring WebFlux请求处理流程
Spring AOP实现原理源码详细分析
Spring Cloud Gateway应用详解1之谓词
Spring AOP切入点类型及系统提供的非常常用的切入点
Spring中自定义数据类型转换详解
Spring 引介增强IntroductionAdvisor使用

相关推荐

照片选择器,使用简单,几行代码就可以完成集成

照片选择器,使用简单,几行代码就可以完成集成来源:极客头条用于发表图片时候选择相册图片和拍照这样的需求,虽然网上也有很多类似的控件,写的挺不错的,但是深入使用就有些问题,还是自己写算了;网上的一些轮...

探索iOS 9适配(iphone适配)

CSDN移动将持续为您优选移动开发的精华内容,共同探讨移动开发的技术热点话题,涵盖移动应用、开发工具、移动游戏及引擎、智能硬件、物联网等方方面面。如果您想投稿,或寻求《近匠》报道,请发送邮件至tang...

“旅行者”回望30载 一点淡蓝“焕新颜”

据美国国家航空航天局(NASA)网站12日报道,为纪念著名的“暗淡蓝点”(PaleBlueDot)照片问世30周年,NASA重新制作了这张照片,使其“焕新颜”,NASA喷气推进实验室于近日发布了新...

「底层技术原理体系」深入探索Java服务器性能监控Metrics框架

承接上文承接上文中的【深度挖掘Java性能调优】「底层技术原理体系」深入探索Java服务器性能监控Metrics框架的实现原理分析(Counter篇),我们知道和了解了对应的Counter计数器的作用...

由浅入深,66条JavaScript面试知识点(七)

作者:JakeZhang转发链接:https://juejin.im/post/5ef8377f6fb9a07e693a6061...

6款可替代dreamweaver的工具(替代director的软件)

dreamweaver对一个web前端工作者来说,再熟悉不过了,像我07年接触web前端开发就是用的dreamweaver,一直用到现在,身边的朋友有跟我推荐过各种更好用的可替代dreamweaver...

宇宙厂:Vue3.0 为何用 Proxy 替代 defineProperty?

大家好,很高兴又见面了,我是"...

专为Vue打造的开源表单验证框架,Github star7k+——VeeValidate

介绍vee-validate是Vue.js的基于模板的验证框架,可以验证输入并显示错误。基于模板,只需为每个输入值更改时指定应使用哪种验证器。系统会在支持40多种语言环境的情况下自动生成错误。现成的规...

自定义 Redis Starter 实现与扩展全解析

一、引言在SpringBoot开发中,Redis凭借其高性能和丰富的数据结构,成为缓存、分布式锁、消息队列等场景的首选解决方案。为了提升开发效率,避免重复配置和代码编写,我们可以创建一个自定义...

OpenAI Operator 的开源替代方案:Nanobrowser

Nanobrowser:OpenAIOperator的开源替代方案Nanobrowser[1]是一款开源的AI网页自动化工具,官方号称是OpenAIOperator的开源替代品。...

微软开始测试Edge AI历史搜索 为Windows 11提供更好的安全性

微软Edge浏览器正在获得更多与AI相关的功能。此外,Edge似乎正在试验WebPushAPI,这可以改善通过浏览器处理Windows11通知的方式。另一个值得注意的变化是与下载...

「Postman」测试(Tests)脚本编写和断言详解

测试确认您的API按预期工作,服务之间的集成运行可靠,并且新开发没有破坏任何现有功能。您可以使用JavaScript为PostmanAPI请求编写测试脚本。当您的API项目出现问题时...

NestJs 详细介绍及使用示例(nestjs视频教程)

NestJS详细介绍及使用示例如果觉得不错欢迎点赞、关注、转发、收藏,您的支持是我最大的动力,谢谢!...

angularjs应用prerender.io 搜索引擎优化实践

上一篇博文(http://www.cnblogs.com/ideal-lx/p/5625428.html)介绍了单页面搜索引擎优化的原理,以及介绍了两个开源框架的优劣。prerender框架的工作原理...

微软Edge浏览器测试“AI历史搜索”,口语化寻找历史标签页

IT之家3月4日消息,科技媒体WindowsLatest昨日(3月3日)发布博文,报道称微软正邀请Canary频道用户,在MicrosoftEdge浏览器中,测试AI...

取消回复欢迎 发表评论: