Spring boot:3.X + Security OAuth2 自定义登录页面、登出后跳转到登录页

news2024/11/25 16:35:27

本文描述了基于 Spring Oauth2 的 code 模式,实现登陆同时授权、自定义登录界面、登出页面的功能。

1.Maven依赖:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.1.6</version>
    <relativePath/>
</parent>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-oauth2-authorization-server</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>
<!-- thymeleaf 模板引擎-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

 2.thymeleaf配置

在spring boot工程的application.yml配置文件中

 

spring:
  thymeleaf:
    prefix: classpath:/singleSign/
    suffix: .html
    cache: false

3.登陆界面HTML

登录页面需要符合thymeleaf格式,不符合格式的不支持,在resources 目录下新建singleSign目录,在此目录下新建login.html(文件名不能乱命名,要跟下面的Controller、WebSecurity 相对应) 文件如下:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<head>
	<meta charset="UTF-8">
	<title>欢迎来到单点登录平台</title>
</head>

<style>
	.login-container {
        margin: 50px;
        width: 100%;
    }

    .form-container {
        margin: 0px auto;
        width: 50%;
        text-align: center;
        box-shadow: 1px 1px 10px #888888;
        height: 300px;
        padding: 5px;
    }

    input {
        margin-top: 10px;
        width: 350px;
        height: 30px;
        border-radius: 3px;
        border: 1px #E9686B solid;
        padding-left: 2px;

    }


    .btn {
        width: 350px;
        height: 35px;
        line-height: 35px;
        cursor: pointer;
        margin-top: 20px;
        border-radius: 3px;
        background-color: #E9686B;
        color: white;
        border: none;
        font-size: 15px;
    }

    .title{
        margin-top: 5px;
        font-size: 18px;
        color: #E9686B;
    }
</style>
<body>
<div class="login-container">
	<div class="form-container">
		<p class="title">欢迎来到单点登录平台</p>
		<form name="loginForm" method="post" th:action="${login}">
			<input type="text" name="username" placeholder="用户名"/>
			<br>
			<input type="password" name="password" placeholder="密码"/>
			<br>
			<button type="submit" class="btn">登 &nbsp;&nbsp; 录</button>
		</form>
		<p style="color: red" th:if="${param.error}">用户名或密码错误</p>
	</div>
</div>
</body>
</html>

4.登陆界面Controller

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.oauth2.provider.AuthorizationRequest;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
 
@Controller
public class BaseMainController {  

    @GetMapping("/login") // 设置登录页面的路由
    public String loginPage() {
        return "login"; // 返回视图名称,这里假设有一个名为"login"的模板文件(与login.html相对应)
    }
}

5.WebSecurity 配置


配置自定义登录、登出需要的参数

@Bean
    @Order(2)
    public SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http)
            throws Exception {
        http
                .authorizeHttpRequests((authorize) -> authorize
                        .requestMatchers("/oauth/**","/login/**","/logout/**")
                        .permitAll()
                        .anyRequest().authenticated()
                )
                //自定义登录页
                .formLogin(formLogin->
                        formLogin.loginPage("/login") //登录页面
                                .loginProcessingUrl("/login").permitAll() //登录接口可以匿名访问
                                .defaultSuccessUrl("/our/page"))//登录成功访问的页面
                .csrf().disable()
                //自定义登出页
                .logout(logout->
                                logout.
                                        logoutUrl("/logout")
                                        .addLogoutHandler(new MyLogoutHandler())//登出后的跳转页
                                        .logoutSuccessUrl("/login")
                                        .permitAll()
                );
        return http.build();
    }

配置登出跳转LogoutHandler ,为防止要跳转的页面网址有问题,需要对网址进行base64Encode后,以参数(名称:redirect_uris)的形式传进来


import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.authorization.util.EncryptUtils;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.logout.LogoutHandler;
import org.springframework.stereotype.Component;

import java.io.IOException;

@Component
public class MyLogoutHandler implements LogoutHandler {

    @Override
    public void logout(HttpServletRequest request, HttpServletResponse response, Authentication authentication) {
        try {
            String url = request.getParameter("redirect_uris");
            response.sendRedirect(EncryptUtils.base64Decode(url));//实现自定义重定向
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

6.自定义登录效果

访问登录URL:

http://127.0.0.1:80/auth/oauth2/authorize?client_id=XXXX&response_type=code&scope=openid&redirect_uri=https://www.baidu.com

7.自定义登出效果

对第6步中的登录URL进行base64Encode加密后,作为redirect_uris参数传入,访问:

http://127.0.0.1:80/auth/logout?redirect_uris=aHR0cDov....

后,系统会自动跳转到 第6步中的登录页。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1343098.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

文件打包上传linux服务器,通过http协议url下载

背景&#xff1a;服务器部署tomcat&#xff0c;已经运行项目 直接在编译后的class文件新建文件&#xff0c;把想要下载的文件放入&#xff0c; 编译后新建文件存放 访问时&#xff0c;加zl/xxx.zip

Springboot拦截器及统一异常处理

文章目录 一、Java中异常相关概念1、异常类2、异常处理方法3、注意事项4、自定义异常 二、配置全局异常处理1、统一返回体定义2、定义异常处理实现类3、全局异常处理类 三、Springboot拦截器1、定义拦截器2、注册拦截器 四、验证效果 一、Java中异常相关概念 1、异常类 Throw…

微信小程序开发系列-07组件

在开发小程序的过程中会遇到一个常见的问题&#xff0c;怎样将其他同事提供的样式或者第三方的样式载入自己的工程&#xff0c;本文基于这个问题为索引&#xff0c;探索下小程序的组件。 什么是组件 组件是视图层的基本组成单元。组件自带一些功能与微信风格一致的样式。一个…

C++标准模板库(STL)

标准模板库&#xff08;STL&#xff09;是一组C模板类&#xff0c;提供常见的编程数据结构和函数&#xff0c;如列表、堆栈、数组等。它是一个容器类、算法和迭代器的库。它是一个通用库&#xff0c;因此&#xff0c;它的组件是参数化的。模板类的相关知识是使用STL的先决条件。…

vivado set_max_delay案例分析

案例分析 在一些设计中&#xff0c;某些信号在特定模式下具有恒定值。例如&#xff0c;在功能模式下&#xff0c;测试信号不切换&#xff0c;因此与VDD或VSS相连这取决于它们的活动水平。这也适用于在设计完成后不切换的信号已通电。同样&#xff0c;今天的设计有多种功能模式…

优秀数据库开发工具Navicat Premium 16 Mac/win中文版

Navicat Premium 16作为一款综合性的数据库开发工具&#xff0c;可以支持主流的数据库管理系统&#xff0c;如MySQL、MariaDB、Oracle、SQL Server等。无论是进行数据库建模、数据导入导出、SQL脚本编辑&#xff0c;还是数据同步、备份恢复等操作&#xff0c;Navicat Premium 1…

Linux安装常用的软件(jdk,MySQL,nginx)并完成对前后端项目的部署发布

linux软件安装&#xff1a; 安装方式介绍&#xff1a; 二进制发布包安装&#xff1a; 软件已经针对具体平台编译打包发布&#xff0c;只要解压&#xff0c;修改配置即可 rpm安装&#xff1a; 软件已经按照redhat的包管理规范进行打包&#xff0c;使用rpm命令进行安装&#xff0…

Java 类加载与字节码技术

3 类加载与字节码技术 3.1 类文件结构 类文件结构字节码指令编译期处理类加载阶段类加载器运行期优化 根据 JVM 规范&#xff0c;类文件结构如下 ClassFile {u4 magic;u2 minor_version; // 小版本号u2 major_version; // 主版本号u2 constant_pool_count; // 常量池cp_info…

《我与地坛》当时只道是寻常;只是当时已惘然

《我与地坛》当时只道是寻常&#xff1b;只是当时已惘然 史铁生&#xff08;1951/1/4-2010/12/31&#xff09;&#xff0c;作家&#xff0c;散文家&#xff0c;代表作有《我与地坛》《命若琴弦》《奶奶的星星》等。 文章目录 《我与地坛》当时只道是寻常&#xff1b;只是当时已…

Thinkphp+vue+mysql学生作业管理系统21j0r

运行环境:phpstudy/wamp/xammp等 开发语言&#xff1a;php 后端框架&#xff1a;Thinkphp5 前端框架&#xff1a;vue.js 服务器&#xff1a;apache 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat/phpmyadmin 为设计一个安全便捷&#xff0c;并且使用户更好获取本学院…

c基础学习(一)

学习网站&#xff1a; C语言的过去与未来 - C语言教程 - C语言网 (dotcpp.com)https://www.dotcpp.com/course/c-intros/ C 语言简介 - C 语言教程 - 网道 (wangdoc.com)https://wangdoc.com/clang/intro 变量&#xff1a; #include<stdio.h> /*引入头文件-- 标准…

深入浅出理解转置卷积Conv2DTranspose

温故而知新&#xff0c;可以为师矣&#xff01; 一、参考资料 论文&#xff1a;A guide to convolution arithmetic for deep learning github源码&#xff1a;Convolution arithmetic bilibili视频&#xff1a;转置卷积&#xff08;transposed convolution&#xff09; 转置…

【Linux】深度解剖环境变量

> 作者简介&#xff1a;დ旧言~&#xff0c;目前大二&#xff0c;现在学习Java&#xff0c;c&#xff0c;c&#xff0c;Python等 > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;熟悉并掌握Linux的环境变量。 > 毒鸡汤&#x…

【2023 CCF 大数据与计算智能大赛】基于TPU平台实现超分辨率重建模型部署 基于FSRCNN的TPU平台超分辨率模型部署方案

2023 CCF 大数据与计算智能大赛 基于TPU平台实现超分辨率重建模型部署 基于FSRCNN的TPU平台超分辨率模型部署方案 WELL 刘渝 人工智能 研一 西安交通大学 中国-西安 1461003622qq.com 史政立 网络空间安全 研一 西安交通大学 中国-西安 1170774291qq.com 崔琳、张…

vue项目hdr格式文件放在assets下rgbeloader.load获取不到问题解决

如下图 我再App.vue组件中这样写 艾特符号定位 告诉系统 要src下的assets下的xhdr下的xidis.hdr 但是运行项目 他会告诉你找不到这个资源 我们改一下 我们组件时 App.vue 与assets同在 src目录下 用 ./去找 这样也是找不到的 我们需要将它放在静态资源包public下 public路…

Vite+Vue3学习笔记(2)——语法、渲染、事件、数据传递、生命周期、第三方库、前端部署

官网链接&#xff1a;https://cn.vuejs.org/ 如果出现普通用户无法新建项目&#xff0c;必须要管理员身份新建&#xff0c;那么可以在nodejs的安装路径设置安全选项&#xff0c;提高普通用户的权限。 具体方法参考&#xff1a; https://blog.csdn.net/weixin_43174650/article/…

毫米波雷达:从 3D 走向 4D

1 毫米波雷达已广泛应用于汽车 ADAS 系统 汽车智能驾驶需要感知层、决策层、执行层三大核心系统的高效配合&#xff0c;其中感知层通过传感器探知周围的环境。汽车智能驾驶感知层将真实世界的视觉、物理、事件等信息转变成数字信号&#xff0c;为车辆了解周边环境、制定驾驶操…

2023 年有什么流行的开源项目?

背景介绍 作为一个资深开源参与者&#xff0c;我盘点下2023年有意思的开源项目&#xff0c;从GitHub热榜角度盘点下。 作为工程师我对技术理解顺势而为&#xff0c;当风口袭来拥抱研究使用&#xff0c;理解其中精髓为风口添砖加瓦。 2023年很特殊&#xff0c;AI生成开始火热…

挑战Python100题(7)

100+ Python challenging programming exercises 7 Question 61 Print a unicode string "hello world". Hints: Use ustrings format to define unicode string. 打印一个unicode字符串“helloworld”。 提示:使用u“字符串”格式定义unicode字符串。 Solution…

【全网最细】爆肝3天,2023年年度音乐+图片+热词终于出来了,来看看你知道几个?

目录 前言 2023年度音乐 1.《阳光开朗大男孩》 2.《早安隆回》 3.《一路生花》 4.《爱如火》 5.《向云端》 6.《孤勇者》 7.《起风了》 8.《只因你太美》 2023年度图片 1.R星 2.小飞棍来喽 3.一键三连 4.只因你太美 5.原神&#xff0c;启动&#xff01; 2023年…