自定义Spring Authorization Server登录页
一、鸣谢
首先要声明一些感谢:
- 感谢官方文档的缺失、反复造成我下面这条感谢
- 感谢那些胡说八道、顾彼失此的某DN文章,让我在冲向坑里的道路上一往无前
废话不多说,看剑!
本文来自:博客园-去哪里吃鱼-自定义Spring Authorization Server登录页
二、版本信息
本文基于如下以来版本信息,官方代码如有变动,请自行阅读源码解决问题。
友情提示:不要照抄某DN、AI内容,避免浪费生命。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-authorization-server</artifactId>
<version>3.3.10</version>
</dependency>
<!-- 上面的依赖引用的 spring-security-oauth2-authorization-server 版本,这里只做提示,不用引入 -->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-oauth2-authorization-server</artifactId>
<version>1.3.5</version>
</dependency>
三、过滤器链介绍
使用 Spring Authorization Server 开发授权服务器,必然不可少要配置两个 SecurityFilterChain过滤器链:
SpringSecurity的过滤器链- 授权服务的过滤器链
这两条过滤器链不会冲突,但是要确保授权服务器的过滤器链在SpringSecurity链之前加载,在代码当中可以使用@Order(0)注解来调整,注解中的整数参数越小,加载顺序就越靠前
调整的目的是:
SpringSecurity的过滤器链默认所有请求都需要认证,把授权服务的过滤器链提前,可以避免如下默认授权相关请求不受SpringSecurity的过滤器链影响
- /oauth2/authorize
- /oauth2/token
- /oauth2/jwks
- /userinfo
- /login
- ...
如下基于 授权码 模式进行开发,默认的,以 GET 方式请求的 /login 是跳转到登录页,以 POST 方式请求的 /login 则是处理登录请求,Spring 官方以硬编码的形式提供了一个默认登录页,其中引用了bootstrap 样式文件,鉴于一些总所周知的原因,这个样式文件访问不了,所以登录页加载会很慢。
此外,每个产品也会相应的设计具有自己产品风格特性的登录页,这让自定义登录页成为了一个硬性需求。
如下为 只修改登录页 的处理过程,一些项目配置如下
- 应用 context-path 自定义为 'auth'
- 自定义登录页请求地址为: http://domain/auth/i/login
四、修改 SpringSecurity 配置
贴一段基于官方demo的修改后的配置代码:
@Bean
@Order(2)
public SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http)
throws Exception {
http
.authorizeHttpRequests((authorize) -> authorize
.requestMatchers("/i/**","/login**").permitAll()
.anyRequest().authenticated()
)
.cors(AbstractHttpConfigurer::disable)
.csrf(AbstractHttpConfigurer::disable)
.formLogin(form -> form.loginPage("/i/login").loginProcessingUrl("/login"));
return http.build();
}
现在来说一下注意事项:
- 登录页请求由
SpringSecurity的过滤器链处理,因为授权服务过滤器链没有设置formLogin,它只处理相关接口 - 在配置
formLogin的时候,loginPage和loginProcessingUrl都需要配置,如果不配置loginProcessingUrl,它则会用loginPage的 url来处理登录请求 - 除了登录页请求放开,登录请求也要放开,交由授权服务过滤器链处理,在代码中就是
requestMatchers("/i/**","/login**").permitAll()
五、修改 Spring Authorization Server 配置
同样基于官方demo的修改后的配置:
@Bean
@Order(1)
public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception {
OAuth2AuthorizationServerConfiguration.applyDefaultSecurity(http);
http.getConfigurer(OAuth2AuthorizationServerConfigurer.class).oidc(withDefaults());
http.exceptionHandling((exceptions) -> exceptions
.defaultAuthenticationEntryPointFor(
new LoginUrlAuthenticationEntryPoint(domain + "/auth/i/login"),
new MediaTypeRequestMatcher(MediaType.TEXT_HTML)
)
)
.oauth2ResourceServer((resourceServer) -> resourceServer.jwt(Customizer.withDefaults()));
return http.build();
}
注意事项之在代码 new LoginUrlAuthenticationEntryPoint(domain + "/auth/i/login") 中
domain变量仅在有需要的情况下使用,也可以不用- 构造函数中的地址,一定一定要与上一章节中的
loginPage地址相同,不要被xxxEntryPoint迷惑,这里就是指登录页地址!
六、其他
自定义授权确认页面不在此篇幅范围之内,这个版本当客户端请求的 role 是一个值的时候不会出现授权确认页面。
我解决这种自定义问题的思路:
研究 Spring Security 的配置方式,如:
SecurityBuilder,SecurityConfiger,从而找到自己出现问题所在的步骤,针对性的去调整
看到这里,希望对你有所帮助。
自定义Spring Authorization Server登录页的更多相关文章
- Spring Authorization Server的使用
Spring Authorization Server的使用 一.背景 二.前置知识 三.需求 四.核心代码编写 1.引入授权服务器依赖 2.创建授权服务器用户 3.创建授权服务器和客户端 五.测试 ...
- Spring Authorization Server 全新授权服务器整合使用
前言 Spring Authorization Server 是 Spring 团队最新开发适配 OAuth 协议的授权服务器项目,旨在替代原有的 Spring Security OAuth 经过半年 ...
- Spring Authorization Server 0.2.3发布,放出联合身份DEMO
很快啊Spring Authorization Server又发新版本了,现在的版本是0.2.3.本次都有什么改动呢?我们来了解一下. 0.2.3版本特性 本次更新的新特性不少. 为公开客户端提供默认 ...
- Spring Authorization Server授权服务器入门
11月8日Spring官方已经强烈建议使用Spring Authorization Server替换已经过时的Spring Security OAuth2.0,距离Spring Security OA ...
- Spring Authorization Server 0.3.0 发布,官方文档正式上线
基于OAuth2.1的授权服务器Spring Authorization Server 0.3.0今天正式发布,在本次更新中有几大亮点. 文档正式上线 Spring Authorization Ser ...
- Spring Authorization Server 实现授权中心
Spring Authorization Server 实现授权中心 源码地址 当前,Spring Security 对 OAuth 2.0 框架提供了全面的支持.Spring Authorizati ...
- Spring Authorization Server(AS)从 Mysql 中读取客户端、用户
Spring AS 持久化 jdk version: 17 spring boot version: 2.7.0 spring authorization server:0.3.0 mysql ver ...
- 【SSO单点系列】(4):CAS4.0 SERVER登录后用户信息的返回
接着上一篇,在上一篇中我们描述了怎么在CAS SERVER登录页上添加验证码,并进行登录.一旦CAS SERVER验证成功后,我们就会跳转到客户端中去.跳转到客户端去后,大家想一想,客户端总要获取用户 ...
- Spring Security笔记:自定义登录页
以下内容参考了 http://www.mkyong.com/spring-security/spring-security-form-login-example/ 接上回,在前面的Hello Worl ...
- spring security采用自定义登录页和退出功能
更新... 首先采用的是XML配置方式,请先查看 初识Spring security-添加security 在之前的示例中进行代码修改 项目结构如下: 一.修改spring-security.xml ...
随机推荐
- NetCore.Encrypt —— 整合加密
前言 最近呢又接触到加密了,回顾之前用到的加密经历,使用过DES.RSA.MD5.BASE64,前面也更新过两篇加密的文章,MD5加密和DES加密.之前的使用都是在.Net Framework平台,这 ...
- CTFHub技能树-密码口令wp
引言 仅开放如下关卡 弱口令 通常认为容易被别人(他们有可能对你很了解)猜测到或被破解工具破解的口令均为弱口令. 打开环境,是如下界面,尝试一些弱口令密码无果 利用burpsuite抓包,然后爆破,发 ...
- 刷入Magisk错误:1教程
面具是目前使用最多的授权APP了,兼容主流安卓版本,基本上已彻底的替代的之前的supersu授权,面具magisk不仅支持给APP进行授权ROOT,还支持隐藏root功能magiskhide,使得手机 ...
- JUC相关知识点总结
Java JUC(java.util.concurrent)是Java并发编程的核心工具包,提供了丰富的并发工具类和框架.以下是JUC的主要知识点,按难易程度分类,供你参考: 1. 基础概念与工具类 ...
- 基于RAG的MaxKB知识库问答系统如何选择向量模型
在MaxKB中替换向量模型前,我们需要先了解向量相关的原理和技术,此处不做赘述,大家可以自行学习.可以了解下Embedding.Embedding核心,向量库等内容. 一.MaxKB 默认向量模型 M ...
- Dify 的核心技术栈
Dify 的技术栈涵盖多个层次,结合了前沿的 AI 框架.成熟的开发工具及高效的部署方案. 以下是其核心组成: 一.基础架构与后端技术 编程语言与框架 Python + Flask:后端服务主要基于 ...
- ant design pro git提交error; Angular 团队git提交规范
前言 在使用 ant design pro 时,git 提交报错 > running commit-msg hook: fabric verify-commit ERROR 提交日志不符合规范 ...
- python web服务器--WSGI/ASGI协议--web框架,三者之间的关系
在 Python Web 开发中,Web 服务器.WSGI/ASGI 协议 和 Web 框架 是三个核心组成部分,它们共同协作以实现完整的 Web 应用程序.以下是三者之间的关系和作用的详细讲解: 1 ...
- .NET Core & ConsoleApp & appsettings.json
准备 Visual Studio 2017 .NET Core 2.1 新建控制台应用(.NET Core) 默认的 Program.cs // Program.cs using System; na ...
- python的typer写cli脚本如此简单
# typer_demo.py import typer from pathlib import Path from typing import Optional from typing_extens ...