一、鸣谢

首先要声明一些感谢:

  1. 感谢官方文档的缺失、反复造成我下面这条感谢
  2. 感谢那些胡说八道、顾彼失此的某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 样式文件,鉴于一些总所周知的原因,这个样式文件访问不了,所以登录页加载会很慢。

此外,每个产品也会相应的设计具有自己产品风格特性的登录页,这让自定义登录页成为了一个硬性需求。

如下为 只修改登录页 的处理过程,一些项目配置如下

四、修改 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();
}

现在来说一下注意事项:

  1. 登录页请求由SpringSecurity的过滤器链处理,因为授权服务过滤器链没有设置 formLogin,它只处理相关接口
  2. 在配置 formLogin 的时候,loginPageloginProcessingUrl 都需要配置,如果不配置 loginProcessingUrl,它则会用 loginPage 的 url来处理登录请求
  3. 除了登录页请求放开,登录请求也要放开,交由授权服务过滤器链处理,在代码中就是 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")

  1. domain 变量仅在有需要的情况下使用,也可以不用
  2. 构造函数中的地址,一定一定要与上一章节中的 loginPage 地址相同,不要被 xxxEntryPoint 迷惑,这里就是指登录页地址!

六、其他

自定义授权确认页面不在此篇幅范围之内,这个版本当客户端请求的 role 是一个值的时候不会出现授权确认页面。

我解决这种自定义问题的思路:

研究 Spring Security 的配置方式,如:SecurityBuilder,SecurityConfiger,从而找到自己出现问题所在的步骤,针对性的去调整

看到这里,希望对你有所帮助。

自定义Spring Authorization Server登录页的更多相关文章

  1. Spring Authorization Server的使用

    Spring Authorization Server的使用 一.背景 二.前置知识 三.需求 四.核心代码编写 1.引入授权服务器依赖 2.创建授权服务器用户 3.创建授权服务器和客户端 五.测试 ...

  2. Spring Authorization Server 全新授权服务器整合使用

    前言 Spring Authorization Server 是 Spring 团队最新开发适配 OAuth 协议的授权服务器项目,旨在替代原有的 Spring Security OAuth 经过半年 ...

  3. Spring Authorization Server 0.2.3发布,放出联合身份DEMO

    很快啊Spring Authorization Server又发新版本了,现在的版本是0.2.3.本次都有什么改动呢?我们来了解一下. 0.2.3版本特性 本次更新的新特性不少. 为公开客户端提供默认 ...

  4. Spring Authorization Server授权服务器入门

    11月8日Spring官方已经强烈建议使用Spring Authorization Server替换已经过时的Spring Security OAuth2.0,距离Spring Security OA ...

  5. Spring Authorization Server 0.3.0 发布,官方文档正式上线

    基于OAuth2.1的授权服务器Spring Authorization Server 0.3.0今天正式发布,在本次更新中有几大亮点. 文档正式上线 Spring Authorization Ser ...

  6. Spring Authorization Server 实现授权中心

    Spring Authorization Server 实现授权中心 源码地址 当前,Spring Security 对 OAuth 2.0 框架提供了全面的支持.Spring Authorizati ...

  7. Spring Authorization Server(AS)从 Mysql 中读取客户端、用户

    Spring AS 持久化 jdk version: 17 spring boot version: 2.7.0 spring authorization server:0.3.0 mysql ver ...

  8. 【SSO单点系列】(4):CAS4.0 SERVER登录后用户信息的返回

    接着上一篇,在上一篇中我们描述了怎么在CAS SERVER登录页上添加验证码,并进行登录.一旦CAS SERVER验证成功后,我们就会跳转到客户端中去.跳转到客户端去后,大家想一想,客户端总要获取用户 ...

  9. Spring Security笔记:自定义登录页

    以下内容参考了 http://www.mkyong.com/spring-security/spring-security-form-login-example/ 接上回,在前面的Hello Worl ...

  10. spring security采用自定义登录页和退出功能

    更新... 首先采用的是XML配置方式,请先查看  初识Spring security-添加security 在之前的示例中进行代码修改 项目结构如下: 一.修改spring-security.xml ...

随机推荐

  1. NetCore.Encrypt —— 整合加密

    前言 最近呢又接触到加密了,回顾之前用到的加密经历,使用过DES.RSA.MD5.BASE64,前面也更新过两篇加密的文章,MD5加密和DES加密.之前的使用都是在.Net Framework平台,这 ...

  2. CTFHub技能树-密码口令wp

    引言 仅开放如下关卡 弱口令 通常认为容易被别人(他们有可能对你很了解)猜测到或被破解工具破解的口令均为弱口令. 打开环境,是如下界面,尝试一些弱口令密码无果 利用burpsuite抓包,然后爆破,发 ...

  3. 刷入Magisk错误:1教程

    面具是目前使用最多的授权APP了,兼容主流安卓版本,基本上已彻底的替代的之前的supersu授权,面具magisk不仅支持给APP进行授权ROOT,还支持隐藏root功能magiskhide,使得手机 ...

  4. JUC相关知识点总结

    Java JUC(java.util.concurrent)是Java并发编程的核心工具包,提供了丰富的并发工具类和框架.以下是JUC的主要知识点,按难易程度分类,供你参考: 1. 基础概念与工具类 ...

  5. 基于RAG的MaxKB知识库问答系统如何选择向量模型

    在MaxKB中替换向量模型前,我们需要先了解向量相关的原理和技术,此处不做赘述,大家可以自行学习.可以了解下Embedding.Embedding核心,向量库等内容. 一.MaxKB 默认向量模型 M ...

  6. Dify 的核心技术栈

    Dify 的技术栈涵盖多个层次,结合了前沿的 AI 框架.成熟的开发工具及高效的部署方案. 以下是其核心组成: 一.基础架构与后端技术 编程语言与框架 Python + Flask:后端服务主要基于 ...

  7. ant design pro git提交error; Angular 团队git提交规范

    前言 在使用 ant design pro 时,git 提交报错 > running commit-msg hook: fabric verify-commit ERROR 提交日志不符合规范 ...

  8. python web服务器--WSGI/ASGI协议--web框架,三者之间的关系

    在 Python Web 开发中,Web 服务器.WSGI/ASGI 协议 和 Web 框架 是三个核心组成部分,它们共同协作以实现完整的 Web 应用程序.以下是三者之间的关系和作用的详细讲解: 1 ...

  9. .NET Core & ConsoleApp & appsettings.json

    准备 Visual Studio 2017 .NET Core 2.1 新建控制台应用(.NET Core) 默认的 Program.cs // Program.cs using System; na ...

  10. python的typer写cli脚本如此简单

    # typer_demo.py import typer from pathlib import Path from typing import Optional from typing_extens ...