自定义Spring Authorization Server登录页

打印 上一主题 下一主题

主题 1796|帖子 1796|积分 5388

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一、鸣谢

起首要声明一些感谢:

  • 感谢官方文档的缺失、反复造成我下面这条感谢
  • 感谢那些胡说八道、顾彼失此的某DN文章,让我在冲向坑里的道路上勇往直前
废话不多说,看剑!
本文来自:博客园-去哪里吃鱼-自定义Spring Authorization Server登录页
二、版本信息

本文基于如下以来版本信息,官方代码如有变更,请自行阅读源码解决题目。
友谊提示:不要照抄某DN、AI内容,避免浪费生命。
  1. <dependency>
  2.         <groupId>org.springframework.boot</groupId>
  3.         <artifactId>spring-boot-starter-oauth2-authorization-server</artifactId>
  4.         <version>3.3.10</version>
  5. </dependency>
  6. <dependency>
  7.         <groupId>org.springframework.security</groupId>
  8.         <artifactId>spring-security-oauth2-authorization-server</artifactId>
  9.         <version>1.3.5</version>
  10. </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的修改后的设置代码:
  1. @Bean
  2. @Order(2)
  3. public SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http)
  4.         throws Exception {
  5.         http
  6.                 .authorizeHttpRequests((authorize) -> authorize
  7.                         .requestMatchers("/i/**","/login**").permitAll()
  8.                         .anyRequest().authenticated()
  9.                 )
  10.                 .cors(AbstractHttpConfigurer::disable)
  11.                 .csrf(AbstractHttpConfigurer::disable)
  12.                 .formLogin(form -> form.loginPage("/i/login").loginProcessingUrl("/login"));
  13.         return http.build();
  14. }
复制代码
现在来说一下注意事项:

  • 登录页哀求由SpringSecurity的过滤器链处理处罚,因为授权服务过滤器链没有设置 formLogin,它只处理处罚相干接口
  • 在设置 formLogin 的时间,loginPage 和 loginProcessingUrl 都必要设置,假如不设置 loginProcessingUrl,它则会用 loginPage 的 url来处理处罚登录哀求
  • 除了登录页哀求放开,登录哀求也要放开,交由授权服务过滤器链处理处罚,在代码中就是 requestMatchers("/i/**","/login**").permitAll()
五、修改 Spring Authorization Server 设置

同样基于官方demo的修改后的设置:
  1. @Bean
  2. @Order(1)
  3. public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception {
  4.         OAuth2AuthorizationServerConfiguration.applyDefaultSecurity(http);
  5.         http.getConfigurer(OAuth2AuthorizationServerConfigurer.class).oidc(withDefaults());
  6.         http.exceptionHandling((exceptions) -> exceptions
  7.                 .defaultAuthenticationEntryPointFor(
  8.                         new LoginUrlAuthenticationEntryPoint(domain + "/auth/i/login"),
  9.                         new MediaTypeRequestMatcher(MediaType.TEXT_HTML)
  10.                 )
  11.         )
  12.         .oauth2ResourceServer((resourceServer) -> resourceServer.jwt(Customizer.withDefaults()));
  13.         return http.build();
  14. }
复制代码
注意事项之在代码 new LoginUrlAuthenticationEntryPoint(domain + "/auth/i/login") 中

  • domain 变量仅在有必要的情况下使用,也可以不消
  • 构造函数中的地址,一定一定要与上一章节中的 loginPage 地址雷同,不要被 xxxEntryPoint 迷惑,这里就是指登录页地址!
六、其他

自定义授权确认页面不在此篇幅范围之内,这个版本当客户端哀求的 role 是一个值的时间不会出现授权确认页面。
我解决这种自定义题目的思路:
研究 Spring Security 的设置方式,如:SecurityBuilder,SecurityConfiger,从而找到自己出现题目所在的步骤,针对性的去调整
看到这里,盼望对你有所帮助。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

耶耶耶耶耶

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表