最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

最新Spring?Security實戰(zhàn)教程之表單登錄定制到處理邏輯的深度改造(最新推薦)

 更新時間:2025年03月19日 14:45:36   作者:Micro麥可樂  
本章節(jié)介紹了如何通過Spring Security實現(xiàn)從配置自定義登錄頁面、表單登錄處理邏輯的配置,并簡單模擬了前后分離的適配方案,本章節(jié)我們將Spring?Security?默認表單進行登錄定制到處理邏輯的深度改造,感興趣的朋友一起看看吧

前言

通過上一章節(jié)《最新Spring Security實戰(zhàn)教程(一)初識Spring Security安全框架》的講解介紹相信大家已經(jīng)認識 Spring Security 安全框架,在我們創(chuàng)建第一個項目演示中,相信大家發(fā)現(xiàn)了默認表單登錄的局限性
Spring Security 默認提供的登錄頁雖然快速可用,但存在三大問題:

  • 界面風(fēng)格與業(yè)務(wù)系統(tǒng)不匹配
  • 登錄成功/失敗處理邏輯固定
  • 缺乏擴展能力(如驗證碼、多因子認證)

本章節(jié)我們將Spring Security 默認表單進行登錄定制到處理邏輯的深度改造

改造準備

現(xiàn)在在之前的Maven項目中創(chuàng)建第二個子模塊,命名 login-spring-secutity ,由于我們需要自定義登陸頁,還需要追加引入 thymeleaf 模版框架

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

完整的maven項目結(jié)構(gòu)如下:

開始登錄頁改造

我們第一步需要自定義自己的帶驗證碼的登陸頁,在 resources/templates 目錄下創(chuàng)建login.html

<!-- src/main/resources/templates/login.html -->
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>企業(yè)級登錄系統(tǒng)</title>
    <link rel="stylesheet"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >
</head>
<body>
<div class="container d-flex justify-content-center align-items-center vh-100">
    <div class="w-100" style="max-width: 400px;">
        <div class="card">
            <div class="card-body">
                <h2 class="card-title text-center mb-4">登錄</h2>
                <form th:action="@{/login}" method="post">
                    <div class="mb-3">
                        <label for="username" class="form-label">用戶名</label>
                        <input type="text" class="form-control" name="username" id="username" placeholder="請輸入用戶名">
                    </div>
                    <div class="mb-3">
                        <label for="password" class="form-label">密碼</label>
                        <input type="password" class="form-control" name="password" id="password" placeholder="請輸入密碼">
                    </div>
                    <div class="d-grid gap-2">
                        <button type="submit" class="btn btn-primary">登錄</button>
                    </div>
                    <p class="mt-3 text-center"><a href="#" rel="external nofollow"  rel="external nofollow" >忘記密碼?</a></p>
                </form>
            </div>
        </div>
    </div>
</div>
</body>
</html>

添加一個默認首頁index.html,顯示登出按鈕

<!-- src/main/resources/templates/index.html -->
<html xmlns:th="https://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>企業(yè)級登錄系統(tǒng)</title>
    <link rel="stylesheet"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >
</head>
<body>
<h1>Hello Security</h1>
<!-- 測試過程不需要關(guān)閉csrf防護 -->
<form th:action="@{/login}" method="post">
    <button type="submit" class="btn btn-primary">Log Out</button>
</form>
<!-- 測試過程需要關(guān)閉csrf防護 否則404 -->
<a th:href="@{/logout}" rel="external nofollow" >Log Out</a>
</body>
</html>

添加 contrller 配置首頁以及登陸頁

@Controller
public class DemoTowController {
    @GetMapping("/login")
    public String login() {
        return "login";
    }
    @GetMapping("/")
    public String index() {
        return "index";
    }
}

最后對 Spring Security 進行配置

@Configuration
public class BasicSecurityConfig {
    // 配置安全策略
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.
                authorizeHttpRequests(authorize -> authorize
                        .anyRequest().authenticated()
                )
                .formLogin(form -> form
                        .loginPage("/login") // 自定義登錄頁路徑
                        .permitAll() //不需要對login認證
                )
                .logout(withDefaults())
                .csrf(csrf -> csrf.disable()) //關(guān)閉csrf防護
        ;
        return http.build();
    }
}

測試訪問默認訪問主頁,由于主頁被攔截會自動跳轉(zhuǎn)自login登陸頁

輸入正確用戶名密碼后,自動返回主頁,點擊登出按鈕自動回到登錄頁

特別說明:

注意登錄頁以及主頁登出,action 采用 @{} 生成URL,Spring Security會自動幫我們生成name為_csrf 的隱藏表單,作用于 csrf 防護

如果你登出頁是 a 連接形式,為了保證登出不會404的問題
1、我們先關(guān)閉 csrf 防護 http.csrf(csrf -> csrf.disable())
2、登出按鈕使用表單方式 th:action="@{/logout}"

自定義用戶名密碼

到這里有小伙伴又要說了,每次密碼都是Spring Security自動生成的UUID,能自定義用戶名密碼,答案是肯定的。Spring Security提供了在Spring Boot配置文件設(shè)置用戶密碼功能

# 默認安全配置(可通過application.yml覆蓋)
spring:
  security:
    user:
      name: admin
      password: admin

登陸成功失敗跳轉(zhuǎn)問題

通過上述代碼,小伙伴們看到登陸成功后,默認返回系統(tǒng)主頁 即:index.html頁面,因為業(yè)務(wù)需求需要跳轉(zhuǎn)到別的頁面,如何配置?

Spring Security 配置類中 formLogin 提供了兩個參數(shù) defaultSuccessUrlfailureUrl 方便我們進行配置

http.formLogin(form -> form
    .loginPage("/login") // 自定義登錄頁路徑
    .defaultSuccessUrl("/home", true) // 登錄成功后跳轉(zhuǎn)路徑
    .failureUrl("/login?error=true")  // 登錄失敗后跳轉(zhuǎn)路徑
    .permitAll() //不需要對login認證
)

自定義登出

登出和登錄基本相同,由于篇幅問題這里博主就不配置登出的頁面以及登出成功頁面了,主要看以下配置,相信大家都能理解了

http.logout(logout -> logout
    .logoutUrl("/logout") //自定義登出頁
    .logoutSuccessUrl("/login?logout") //登出成功跳轉(zhuǎn)
)

前后端分離適配方案

上述的案例中針對的是前后端都在一個整體中的情況,針對現(xiàn)在前后端分離的項目我們?nèi)绾蝸磉M行改造?我們處理以下問題:

  • 用戶登陸成功返回登陸成功 / 失敗 返回對應(yīng)JSON
  • 用戶登出成功返回登出成功 / 失敗 返回對應(yīng)JSON

這里博主首先引入官方的一個介紹圖,如下:
我們發(fā)現(xiàn)在身份認證管理器 AuthenticationManager中, 有兩個結(jié)果 Success 以及 Failure ,最終交給 AuthenticationSuccessHandler 以及 AuthenticationFailureHandler 處理器處理。

簡單總結(jié):

  • 登錄成功調(diào)用:AuthenticationSuccessHandler
  • 登錄失敗調(diào)用:AuthenticationFailureHandler

通過上面的講解,我們只需要自定義這兩個處理器即可,我們在配置文件中增加這兩個處理器,完整代碼如下:

 // 自定義登錄成功處理器
@Configuration
public class BasicSecurityConfig {
    // 配置安全策略
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.
                authorizeHttpRequests(authorize -> authorize
                        .requestMatchers("/ajaxLogin").permitAll() //ajax登陸頁不需要認證
                        .anyRequest().authenticated()
                )
                .formLogin(form -> form
                        .loginPage("/login") // 自定義登錄頁路徑
//                        .defaultSuccessUrl("/", true)        // 登錄成功后跳轉(zhuǎn)路徑
//                        .failureUrl("/login?error=true")         // 登錄失敗后跳轉(zhuǎn)路徑
                        .successHandler(loginSuccessHandler())
                        .failureHandler(loginFailureHandler())
                        .permitAll() //不需要對login認證
                )
                .logout(withDefaults())
                .csrf(csrf -> csrf.disable()) //關(guān)閉csrf防護
        ;
        return http.build();
    }
    // 自定義登錄成功處理器
    @Bean
    public AuthenticationSuccessHandler loginSuccessHandler() {
        return (request, response, authentication) -> {
            if (isAjaxRequest(request)) {
                response.setContentType("application/json");
                response.setCharacterEncoding("UTF-8");
                response.getWriter().write("{\"code\":200, \"message\":\"/認證成功\"}");
            } else {
                response.sendRedirect("/");
            }
        };
    }
    // 自定義登錄失敗處理器
    @Bean
    public AuthenticationFailureHandler loginFailureHandler() {
        return (request, response, exception) -> {
            if (isAjaxRequest(request)) {
                response.setCharacterEncoding("UTF-8");
                response.getWriter().write("{\"code\":401, \"message\":\"認證失敗\"}");
            } else {
                response.sendRedirect("/login?error=true");
            }
        };
    }
    //判斷是否ajax請求
    public boolean isAjaxRequest(HttpServletRequest request) {
        String xRequestedWith = request.getHeader("X-Requested-With");
        return "XMLHttpRequest".equals(xRequestedWith);
    }

最后新增一個ajaxLogin.html 使用ajax發(fā)送請求(為了測試方便這里就簡單創(chuàng)建一個,不使用VUE等工程了

<!-- src/main/resources/templates/ajaxLogin.html -->
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>企業(yè)級登錄系統(tǒng)</title>
    <link rel="stylesheet"  rel="external nofollow"  rel="external nofollow"  rel="external nofollow" >
    <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
</head>
<body>
<div class="container d-flex justify-content-center align-items-center vh-100">
    <div class="w-100" style="max-width: 400px;">
        <div class="card">
            <div class="card-body">
                <h2 class="card-title text-center mb-4">登錄</h2>
                <form>
                    <div class="mb-3">
                        <label for="username" class="form-label">用戶名</label>
                        <input type="text" class="form-control" name="username" id="username" placeholder="請輸入用戶名">
                    </div>
                    <div class="mb-3">
                        <label for="password" class="form-label">密碼</label>
                        <input type="password" class="form-control" name="password" id="password" placeholder="請輸入密碼">
                    </div>
                    <div class="d-grid gap-2">
                        <button type="submit" class="btn btn-primary">登錄</button>
                    </div>
                    <p class="mt-3 text-center"><a href="#" rel="external nofollow"  rel="external nofollow" >忘記密碼?</a></p>
                </form>
            </div>
        </div>
    </div>
</div>
<script>
    $(document).ready(function () {
        $('form').submit(function (event) {
            event.preventDefault();
            var username = $('#username').val();
            var password = $('#password').val();
            $.ajax({
                type: 'POST',
                url: '/login',
                data: {
                    username: username,
                    password: password
                },
                success: function (response) {
                    console.log(response)
                    if(response.code ==200){
                        window.location.href = '/';
                    }
                }
            })
        })
    })
</script>
</body>
</html>

controller 中追加頁面展示

@GetMapping("/ajaxLogin")
    public String ajaxLogin() {
        return "ajaxLogin";
}

最后啟動Spring Boot項目,訪問 /ajaxLogin 登陸頁,測試輸入正確和不正確的賬號密碼進行測試,并觀察瀏覽器控制臺輸出

結(jié)語

本章節(jié)介紹了如何通過Spring Security實現(xiàn)從配置自定義登錄頁面、表單登錄處理邏輯的配置,并簡單模擬了前后分離的適配方案。小伙伴們可以跟著博主的樣例代碼自己敲一遍進行相關(guān)測試!如果本本章內(nèi)容對您有所幫助,希望 一鍵三連 給博主一點點鼓勵,如果您有任何疑問或建議,請隨時留言討論!

在接下來的章節(jié)中,我們將逐步深入 Spring Security 的各個技術(shù)細節(jié),帶你從入門到精通,全面掌握這一安全技術(shù)的方方面面。歡迎繼續(xù)關(guān)注!

到此這篇關(guān)于最新Spring Security實戰(zhàn)教程之表單登錄定制到處理邏輯的深度改造(最新推薦)的文章就介紹到這了,更多相關(guān)Spring Security表單登錄內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java源碼解析阻塞隊列ArrayBlockingQueue常用方法

    Java源碼解析阻塞隊列ArrayBlockingQueue常用方法

    今天小編就為大家分享一篇關(guān)于Java源碼解析阻塞隊列ArrayBlockingQueue常用方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • SpringBoot集成AOP的代碼示例

    SpringBoot集成AOP的代碼示例

    AOP是一種編程范式,它旨在將橫切關(guān)注點(cross-cutting concerns)從應(yīng)用程序的業(yè)務(wù)邏輯中分離出來,橫切關(guān)注點是那些在多個模塊中重復(fù)出現(xiàn)的功能,如日志記錄、性能監(jiān)控、事務(wù)管理、安全控制等,本文介紹了Spring Boot如何集成AOP,需要的朋友可以參考下
    2024-09-09
  • Java實現(xiàn)拆箱和裝箱的原理解析

    Java實現(xiàn)拆箱和裝箱的原理解析

    Java 是一種強類型語言,然而在 Java中Integer類型和 int類型兩種不同類型的數(shù)字卻能正常地進行數(shù)學(xué)運算,為什么?今天我們就來聊聊其背后的秘密:拆箱和裝箱,感興趣的小伙伴跟著小編一起來看看吧
    2024-05-05
  • Java實現(xiàn)寵物商店管理

    Java實現(xiàn)寵物商店管理

    這篇文章主要為大家詳細介紹了Java實現(xiàn)寵物商店管理,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • Java版本兼容性之JDK 21的SDK在JDK 1.8的使用解讀

    Java版本兼容性之JDK 21的SDK在JDK 1.8的使用解讀

    文章介紹了Java的字節(jié)碼版本機制以及如何處理UnsupportedClassVersionError錯誤,文章首先解釋了JVM如何通過檢查.class文件的字節(jié)碼版本號來確定是否可以運行該文件,然后給出了三個解決方案:統(tǒng)一環(huán)境、交叉編譯和多版本JAR
    2025-11-11
  • Java21之字符串模板的使用小結(jié)

    Java21之字符串模板的使用小結(jié)

    本文主要介紹了Java21之字符串模板的使用小結(jié),通過模板表達式和內(nèi)嵌表達式的設(shè)計,使得字符串的構(gòu)造更加簡潔、直觀和類型安全,核心優(yōu)勢包括簡潔性、靈活的模板處理器、與文本塊的完美配合等
    2025-10-10
  • IDEA無法識別SpringBoot項目的簡單解決辦法

    IDEA無法識別SpringBoot項目的簡單解決辦法

    今天使用idea的時候,遇到idea無法啟動springboot,所以這篇文章主要給大家介紹了關(guān)于IDEA無法識別SpringBoot項目的簡單解決辦法,需要的朋友可以參考下
    2023-08-08
  • myeclipse導(dǎo)出可運行jar包簡介

    myeclipse導(dǎo)出可運行jar包簡介

    這篇文章主要介紹了myeclipse導(dǎo)出可運行jar包簡介,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • Java導(dǎo)出Excel動態(tài)表頭的示例詳解

    Java導(dǎo)出Excel動態(tài)表頭的示例詳解

    這篇文章主要為大家詳細介紹了Java導(dǎo)出Excel動態(tài)表頭的相關(guān)知識,文中的示例代碼簡潔易懂,具有一定的借鑒價值,有需要的小伙伴可以了解下
    2025-02-02
  • java并發(fā)之原子操作類和非阻塞算法

    java并發(fā)之原子操作類和非阻塞算法

    這篇文章主要為大家詳細介紹了java并發(fā)之原子操作類和非阻塞算法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-11-11

最新評論

虎林市| 都兰县| 彭州市| 罗江县| 孟州市| 芷江| 晋宁县| 石门县| 施秉县| 昌宁县| 乌拉特前旗| 奉节县| 嘉禾县| 台东市| 静宁县| 甘肃省| 克拉玛依市| 宝丰县| 皮山县| 清水河县| 江源县| 株洲市| 南漳县| 三明市| 水城县| 泽库县| 稻城县| 惠州市| 滦南县| 建昌县| 黑龙江省| 建昌县| 额尔古纳市| 河北省| 昭苏县| 伊宁市| 伽师县| 晋宁县| 类乌齐县| 紫阳县| 吉水县|