主頁 > 後端開發 > SpringBoot SpringSecurity 介紹(基于記憶體的驗證)

SpringBoot SpringSecurity 介紹(基于記憶體的驗證)

2023-04-27 10:09:09 後端開發

SpringBoot 集成 SpringSecurity + MySQL + JWT 附原始碼,廢話不多直接盤
SpringBoot已經為用戶采用默認配置,只需要引入pom依賴就能快速啟動Spring Security,
目的:驗證請求用戶的身份,提供安全訪問
優勢:基于Spring,配置方便,減少大量代碼

image

內置訪問控制方法

  • permitAll() 表示所匹配的 URL 任何人都允許訪問,
  • authenticated() 表示所匹配的 URL 都需要被認證才能訪問,
  • anonymous() 表示可以匿名訪問匹配的 URL ,和 permitAll() 效果類似,只是設定為 anonymous() 的 url 會執行 filter 鏈中
  • denyAll() 表示所匹配的 URL 都不允許被訪問,
  • rememberMe() 被“remember me”的用戶允許訪問 這個有點類似于很多網站的十天內免登錄,登陸一次即可記住你,然后未來一段時間不用登錄,
  • fullyAuthenticated() 如果用戶不是被 remember me 的,才可以訪問,也就是必須一步一步按部就班的登錄才行,

角色權限判斷

  • hasAuthority(String) 判斷用戶是否具有特定的權限,用戶的權限是在自定義登錄邏輯
  • hasAnyAuthority(String ...) 如果用戶具備給定權限中某一個,就允許訪問
  • hasRole(String) 如果用戶具備給定角色就允許訪問,否則出現 403
  • hasAnyRole(String ...) 如果用戶具備給定角色的任意一個,就允許被訪問
  • hasIpAddress(String) 如果請求是指定的 IP 就運行訪問,可以通過 request.getRemoteAddr() 獲取 ip 地址

參考 Spring Security

Pom 檔案中添加

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-security</artifactId>
</dependency>
點擊查看POM代碼
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>vipsoft-parent</artifactId>
        <groupId>com.vipsoft.boot</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>vipsoft-security</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
  
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.3.7</version>
        </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-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

運行后會自動生成 password 默認用戶名為: user
image

默認配置每次都啟動專案都會重新生成密碼,同時用戶名和攔截請求也不能自定義,在實際應用中往往需要自定義配置,因此接下來對Spring Security進行自定義配置,

配置 Spring Security (入門)

在記憶體中(簡化環節,了解邏輯)配置兩個用戶角色(admin和user),設定不同密碼;
同時設定角色訪問權限,其中admin可以訪問所有路徑(即/*),user只能訪問/user下的所有路徑,

自定義配置類,實作WebSecurityConfigurerAdapter介面,WebSecurityConfigurerAdapter介面中有兩個用到的 configure()方法,其中一個配置用戶身份,另一個配置用戶權限:

配置用戶身份的configure()方法:

SecurityConfig

package com.vipsoft.web.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    /**
     * 配置用戶身份的configure()方法
     *
     * @param auth
     * @throws Exception
     */
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
        //簡化操作,將用戶名和密碼存在記憶體中,后期會存放在資料庫、Redis中
        auth.inMemoryAuthentication()
                .passwordEncoder(passwordEncoder)
                .withUser("admin")
                .password(passwordEncoder.encode("888"))
                .roles("ADMIN")
                .and()
                .withUser("user")
                .password(passwordEncoder.encode("666"))
                .roles("USER");
    }

    /**
     * 配置用戶權限的configure()方法
     * @param http
     * @throws Exception
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                //配置攔截的路徑、配置哪類角色可以訪問該路徑
                .antMatchers("/user").hasAnyRole("USER")
                .antMatchers("/*").hasAnyRole("ADMIN")
                //配置登錄界面,可以添加自定義界面, 沒添加則用系統默認的界面
                .and().formLogin();

    }
}

添加介面測驗用


package com.vipsoft.web.controller;

import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class DefaultController {

    @GetMapping("/")
    @PreAuthorize("hasRole('ADMIN')")
    public String demo() {
        return "Welcome";
    }

    @GetMapping("/user/list")
    @PreAuthorize("hasAnyRole('ADMIN','USER')")
    public String getUserList() {
        return "User List";
    }

    @GetMapping("/article/list")
    @PreAuthorize("hasRole('ADMIN')")
    public String getArticleList() {
        return "Article List";
    }
} 

image

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/551370.html

標籤:其他

上一篇:從原理聊JVM(三):詳解現代垃圾回收器Shenandoah和ZGC

下一篇:返回列表

標籤雲
其他(158234) Python(38107) JavaScript(25395) Java(18003) C(15217) 區塊鏈(8260) C#(7972) AI(7469) 爪哇(7425) MySQL(7151) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5870) 数组(5741) R(5409) Linux(5332) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4564) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2431) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1961) Web開發(1951) HtmlCss(1928) python-3.x(1918) 弹簧靴(1913) C++(1912) xml(1889) PostgreSQL(1874) .NETCore(1855) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • SpringBoot SpringSecurity 介紹(基于記憶體的驗證)

    SpringBoot 集成 SpringSecurity + MySQL + JWT 附原始碼,廢話不多直接盤 SpringBoot已經為用戶采用默認配置,只需要引入pom依賴就能快速啟動Spring Security。 目的:驗證請求用戶的身份,提供安全訪問 優勢:基于Spring,配置方便,減少大 ......

    uj5u.com 2023-04-27 10:09:09 more
  • 從原理聊JVM(三):詳解現代垃圾回收器Shenandoah和ZGC

    現代的垃圾回收器為了低停頓的目標可謂將“并發”二字玩到極致,Shenandoah在G1基礎上做了非常多的優化來使回收階段并行,而ZGC直接采用了染色指標、NUMA等黑科技,目的都是為了讓Java開發者可以更多的將精力放在如何使用物件讓程式更好的運行,剩下的一切交給GC,我們所做的只需享受現代化GC技... ......

    uj5u.com 2023-04-27 10:05:14 more
  • SpringBoot SpringSecurity 介紹(基于記憶體的驗證)

    SpringBoot 集成 SpringSecurity + MySQL + JWT 附原始碼,廢話不多直接盤 SpringBoot已經為用戶采用默認配置,只需要引入pom依賴就能快速啟動Spring Security。 目的:驗證請求用戶的身份,提供安全訪問 優勢:基于Spring,配置方便,減少大 ......

    uj5u.com 2023-04-27 10:05:02 more
  • 淺談errgroup的使用以及原始碼分析

    本文講解的是golang.org/x/sync這個包中的errgroup 1、errgroup 的基礎介紹 學習過 Go 的朋友都知道 Go 實作并發編程是比較容易的事情,只需要使用go關鍵字就可以開啟一個 goroutine。那對于并發場景中,如何實作goroutine的協調控制呢?常見的一種方式 ......

    uj5u.com 2023-04-27 07:29:54 more
  • boot-admin整合Quartz實作動態管理定時任務

    淄博燒烤爆紅出了圈,當你坐在八大局的燒烤攤,面前是火爐、烤串、小餅和蘸料,音樂響起,啤酒倒滿,燒烤靈魂的party即將開場的時候,你系統中的Scheduler(除錯器),也自動根據設定的Trigger(觸發器),從容優雅的啟動了一系列的Job(后臺定時任務)。作業一切早有安排,又何須費心勞神呢?因為 ......

    uj5u.com 2023-04-27 07:29:47 more
  • Android監聽事件

    監聽事件 ? 監聽事件機制由事件源,事件和事件監聽器三類物件組成,事件源一般就是activity中的UI控制元件。 下面參考別人整理的圖來更加形象的表達這些關系。 ? 事件監聽機制的意義就是讓事件源的行為委托給事件監聽器,讓監聽器控制事件的發生。 ? 1.實作監聽事件的方法 [ ] 通過內部類實作 [ ......

    uj5u.com 2023-04-27 07:29:38 more
  • Django筆記三十一之全域例外處理

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記三十一之全域例外處理 這一篇筆記介紹 Django 的全域例外處理。 當我們在處理一個 request 請求時,會盡可能的對介面資料的格式,內部呼叫的函式做一些例外處理,但可能還是會有一些意想不到的漏網之魚,造成程式的例外導致不能正常運行 ......

    uj5u.com 2023-04-27 07:29:30 more
  • elastic-job原始碼(1)- job自動裝配

    版本:3.1.0-SNAPSHOT git地址:https://github.com/apache/shardingsphere-elasticjob Maven 坐標 <dependency> <groupId>org.apache.shardingsphere.elasticjob</group ......

    uj5u.com 2023-04-27 07:29:24 more
  • java 多執行緒的start()和run()的理解

    run()方法中是各個執行緒要執行的具體內容。所以當一個執行緒直接呼叫run()時那么直接開始執行方法體,這是在main執行緒中的多個執行緒只能時按照順序的等待前面的執行緒結束run()方法的執行。 而呼叫start方法只是執行緒進入準備階段(Ready),并沒有真正執行,這需要JVM進行分配時間片進行輪轉執行緒 ......

    uj5u.com 2023-04-27 07:29:20 more
  • 面向物件可視化工具:UML類圖

    1. UML類圖 UML(Unified Modeling Language,統一建模語言),用來描述軟體模型和架構的圖形化語言。 常用的UML工具軟體有PowerDesinger、Rose和Enterprise Architect。 UML工具軟體不僅可以繪制軟體開發中所需的各種圖表,還可以生成對 ......

    uj5u.com 2023-04-27 07:29:14 more