實現基于Spring Security的權限管理系統

實現基于Spring Security的權限管理系統

大家好,我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編,也是冬天不穿秋褲,天冷也要風度的程序猿!

在現代Web應用中,權限管理系統是至關重要的組成部分。通過有效的權限管理,可以確保應用程序的安全性,防止未經授權的用戶訪問敏感數據。Spring Security是一個強大且靈活的安全框架,能夠幫助我們輕松實現復雜的權限管理系統。本文將詳細介紹如何使用Spring Security實現一個基于角色和權限的權限管理系統。

1. Spring Security概述

Spring Security是Spring框架的一個子項目,提供了全面的安全服務,包括身份驗證和授權。其核心概念包括用戶、角色和權限。用戶可以擁有多個角色,每個角色可以擁有多種權限。通過Spring Security,我們可以對Web應用的訪問進行細粒度控制。

2. 項目依賴

首先,我們需要在pom.xml中添加Spring Security相關的依賴:

<dependencies><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-data-jpa</artifactId></dependency><dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><scope>runtime</scope></dependency>
</dependencies>

3. 數據庫設計

我們設計一個簡單的數據庫模型,包括用戶、角色和權限三個實體。

package cn.juwatech.model;import javax.persistence.*;
import java.util.Set;@Entity
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String username;private String password;@ManyToMany(fetch = FetchType.EAGER)@JoinTable(name = "user_roles",joinColumns = @JoinColumn(name = "user_id"),inverseJoinColumns = @JoinColumn(name = "role_id"))private Set<Role> roles;// getters and setters
}
package cn.juwatech.model;import javax.persistence.*;
import java.util.Set;@Entity
public class Role {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;@ManyToMany(fetch = FetchType.EAGER)@JoinTable(name = "role_permissions",joinColumns = @JoinColumn(name = "role_id"),inverseJoinColumns = @JoinColumn(name = "permission_id"))private Set<Permission> permissions;// getters and setters
}
package cn.juwatech.model;import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;@Entity
public class Permission {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;// getters and setters
}

4. 用戶認證與授權

我們需要實現UserDetailsService接口來加載用戶信息。

package cn.juwatech.service;import cn.juwatech.model.User;
import cn.juwatech.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;@Service
public class CustomUserDetailsService implements UserDetailsService {@Autowiredprivate UserRepository userRepository;@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {User user = userRepository.findByUsername(username);if (user == null) {throw new UsernameNotFoundException("User not found");}return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), user.getAuthorities());}
}

5. 安全配置

配置Spring Security來處理請求的認證與授權。

package cn.juwatech.config;import cn.juwatech.service.CustomUserDetailsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
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
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Autowiredprivate CustomUserDetailsService userDetailsService;@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/admin/**").hasRole("ADMIN").antMatchers("/user/**").hasRole("USER").anyRequest().authenticated().and().formLogin().loginPage("/login").permitAll().and().logout().permitAll();}@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());}@Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}
}

6. 控制器

實現簡單的控制器來處理請求。

package cn.juwatech.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;@Controller
public class HomeController {@GetMapping("/")public String home() {return "home";}@GetMapping("/admin")public String admin() {return "admin";}@GetMapping("/user")public String user() {return "user";}@GetMapping("/login")public String login() {return "login";}
}

7. 前端頁面

創建簡單的HTML頁面來展示不同的視圖。

home.html

<!DOCTYPE html>
<html>
<head><title>Home</title>
</head>
<body><h1>Welcome to the Home Page</h1><a href="/user">User Page</a><a href="/admin">Admin Page</a><a href="/logout">Logout</a>
</body>
</html>

admin.html

<!DOCTYPE html>
<html>
<head><title>Admin</title>
</head>
<body><h1>Welcome to the Admin Page</h1><a href="/">Home</a><a href="/logout">Logout</a>
</body>
</html>

user.html

<!DOCTYPE html>
<html>
<head><title>User</title>
</head>
<body><h1>Welcome to the User Page</h1><a href="/">Home</a><a href="/logout">Logout</a>
</body>
</html>

login.html

<!DOCTYPE html>
<html>
<head><title>Login</title>
</head>
<body><h1>Login Page</h1><form method="post" action="/login"><label for="username">Username:</label><input type="text" id="username" name="username"><br><label for="password">Password:</label><input type="password" id="password" name="password"><br><button type="submit">Login</button></form>
</body>
</html>

8. 數據初始化

使用data.sql文件初始化數據庫。

INSERT INTO user (username, password) VALUES ('admin', '$2a$10$WzAqEJdKzHQ9E.o/qT41f.J.oPjDNCRK0AejsbTiKCN.p6qMjr8ru'); -- 密碼: password
INSERT INTO user (username, password) VALUES ('user', '$2a$10$WzAqEJdKzHQ9E.o/qT41f.J.oPjDNCRK0AejsbTiKCN.p6qMjr8ru'); -- 密碼: passwordINSERT INTO role (name) VALUES ('ROLE_ADMIN');
INSERT INTO role (name) VALUES ('ROLE_USER');INSERT INTO user_roles (user_id, role_id) VALUES (1, 1); -- admin -> ROLE_ADMIN
INSERT INTO user_roles (user_id, role_id) VALUES (2, 2); -- user -> ROLE_USER

總結

本文詳細介紹了如何使用Spring Security實現一個基于角色和權限的權限管理系統。從依賴配置、數據庫設計、用戶認證與授權,到安全配置和前端頁面展示,全面覆蓋了一個完整權限管理系統的實現步驟。

微賺淘客系統3.0小編出品,必屬精品!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/41718.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/41718.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/41718.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[數據集][目標檢測]護目鏡檢測數據集VOC+YOLO格式888張1類別

數據集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路徑的txt文件&#xff0c;僅僅包含jpg圖片以及對應的VOC格式xml文件和yolo格式txt文件) 圖片數量(jpg文件個數)&#xff1a;888 標注數量(xml文件個數)&#xff1a;888 標注數量(txt文件個數)&#xff1a;888 標注類別…

ORB 特征點提取

FAST關鍵點 選取像素p&#xff0c;假設它的亮度為Ip&#xff1b; . 設置一個閾值T&#xff08;比如Ip的20%&#xff09;&#xff1b; 以像素p為中心&#xff0c;選取半徑為3的圓上的16個像素點&#xff1b; 假如選取的圓上&#xff0c;有連續的N個點的亮度大于IpT或小于…

Redis 八股文

標題 1. Redis主從同步原理&#xff1a;判斷下線的條件:故障轉移如何保證Sentinel高可用 1. Redis主從同步原理&#xff1a; 1、slave執行命令向master建立連接 2、master執行bgsave&#xff08;后臺存儲&#xff09;&#xff0c;生成rdb快照&#xff08;redis備份方式&#x…

FreeRTOS中vTaskDelay 和 xTaskDelayUntil 的區別?

vTaskDelay 和 xTaskDelayUntil 是 FreeRTOS 提供的兩種不同任務延遲函數&#xff0c;各自有其適用的場景和優缺點。vTaskDelay 適用于簡單的延遲操作&#xff0c;而 xTaskDelayUntil 提供了精確的周期控制能力。在設計 FreeRTOS 應用程序時&#xff0c;根據任務的時間要求選擇…

日志自動分析-Web---360星圖GoaccessALBAnolog

目錄 1、Web-360星圖(IIS/Apache/Nginx) 2、Web-GoAccess &#xff08;任何自定義日志格式字符串&#xff09; 源碼及使用手冊 安裝goaccess 使用 輸出 3-Web-自寫腳本&#xff08;任何自定義日志格式字符串&#xff09; 4、Web-機器語言analog&#xff08;任何自定義日…

游戲AI的創造思路-技術基礎-強化學習(1)

我們“強化”一下機器的“學習”&#xff0c;讓機器變得更強~~~~ 目錄 1. 強化學習的定義 2. 發展歷史 3. 強化學習的基本概念和函數 3.1. 基本概念和函數 3.1.1. 基本概念和函數 3.1.2. Q函數 3.1.2.1. 定義與作用 3.1.2.2. 數學表示 3.1.2.3. 更新規則 3.1.2.4. 算…

AI時代算法面試:揭秘高頻算法問題與解答策略

三種決策樹算法的特點和區別 ID3算法&#xff1a;基本的決策樹算法&#xff0c;適用于簡單的分類問題C4.5算法&#xff1a;改進了ID3算法&#xff0c;適用于更復雜的分類問題&#xff0c;可以處理連續型數據和缺失值CART算法&#xff1a;更加通用的決策樹算法&#xff0c;適用于…

云服務器在 Web 應用程序中作用

云服務器在Web應用程序中扮演著至關重要的角色&#xff0c;它不僅是現代Web應用程序的基石&#xff0c;還是推動業務發展和提升用戶體驗的關鍵技術之一。下面將詳細探討云服務器在Web應用程序中的重要作用及其優勢。 首先&#xff0c;云服務器為Web應用程序提供了高度可擴展的…

【postgresql】索引

見的索引類型&#xff1a; B-tree 索引&#xff1a;這是最常用的索引類型&#xff0c;適用于大多數查詢。B-tree索引可以高效地處理范圍查詢。 Hash 索引&#xff1a;適用于等值查詢&#xff0c;但不支持范圍查詢。 GiST 索引&#xff1a;通用搜索樹&#xff08;GiST&#xf…

Flask自定義命令

Flask自定義命令 一、老版Flask自定義命令 Flask 1.x 和 2.x 版本 在Flask的老版本中&#xff0c;可以通過 flask-script 擴展來添加自定義命令。 安裝所需庫&#xff1a; pip3 install Flask-Script2.0.3 pip3 install flask1.1.4 pip3 install markupsafe1.1.1在 Flask 應…

懷念舊的Windows聲音?以下是如何在Windows 11中恢復它們

如果你渴望舊的Windows聲音,希望能在Windows 11上再次聽到,那你就很幸運了。我們將向你展示如何下載必要的聲音包并創建復古的聲音方案。 如何獲取舊Windows聲音的聲音包 你需要做的第一件事是下載一個包含舊Windows版本聲音的聲音包。此外,請確保它包含的每個聲音都是WAV…

在 Vue 項目中使用 FullCalendar

1、先安裝依賴包&#xff0c;根據自己的需求安裝&#xff0c;建議使用cnpm安裝&#xff0c;不然會很慢有時候會出現安裝不上的情況。 npm i fullcalendar/vue --save npm i fullcalendar/core --save // 在月視圖或日視圖中操作事件 npm i fullcalendar/daygrid --save // 在…

記錄discuz修改用戶的主題出售價格

大家好&#xff0c;我是網創有方的站長&#xff0c;今天遇到了需要修改discuz的主題出售價格。特此記錄下 方法很簡單&#xff1a; 進入用于組-》選擇論壇-》批量修改

【shell編程小項目】

目錄 一、項目拓撲二、要求三、shell編程 一、項目拓撲 二、要求 環境準備&#xff1a; 準備兩個虛擬機&#xff0c;按照環境配置好對應的 IP 地址和對應的主機名和 SSH 密鑰登錄在 workstation.exam.com 節點實現如下需求&#xff1a; 1、編寫 Shell 腳本&#xff0c;要求代碼…

0803實操-Windows Server系統管理

Windows Server系統管理 系統管理與基礎配置 查看系統信息、更改計算機名稱 網絡配置 啟用網絡發現 Windows啟用網絡發現是指在網絡設置中啟用一個功能&#xff0c;該功能允許您的計算機在網絡上識別和訪問其他設備和計算機。具體來說&#xff0c;啟用網絡發現后&#xff…

Qt5.9.9 關于界面拖動導致QModbusRTU(QModbusTCP沒有測試過)離線的問題

問題鎖定 參考網友的思路&#xff1a; Qt5.9 Modbus request timeout 0x5異常解決 網友認為是Qt的bug&#xff0c; 我也認同&#xff1b;網友認為可以更新模塊&#xff0c; 我也認同&#xff0c; 我也編譯了Qt5.15.0的code并成功安裝到Qt5.9.9中進行使用&#xff0c;界面拖…

Laravel文件存儲:云端數據管理的藝術

標題&#xff1a;Laravel文件存儲&#xff1a;云端數據管理的藝術 Laravel框架提供了一個強大的文件存儲抽象層&#xff0c;允許開發者以一致的方式與本地磁盤或云存儲服務&#xff08;如Amazon S3&#xff09;進行交互。文件存儲系統簡化了文件上傳、下載、移動和刪除等操作&…

Java面試之Java多線程常見面試題

1、什么是線程&#xff1f; 定義&#xff1a;線程是程序中的執行路徑&#xff0c;是操作系統進行調度的基本單位。它允許程序并發執行多個任務&#xff0c;提高程序的響應速度和資源利用率。 2、為什么需要線程&#xff1f; 1、提高并發性&#xff1a;線程允許程序同時執行多…

Mybatis原生使用

一、MyBatis初次使用 2.1 環境搭建步驟 MyBatis 的 API &#xff1a; https://mybatis.org/mybatis-3/zh/getting-started.html 1.引入依賴包 2.準備核心配置件 db.properties drivercom.mysql.cj.jdbc.Driver urljdbc:mysql://123.57.206.19:3306/demo?useUnicodetrue&am…

如何選擇最佳的照片和視頻恢復軟件

您是否意外從硬盤或 USB 卡中刪除了照片或視頻&#xff1f;最好的視頻和照片恢復軟件可以幫到您&#xff01;如果您一直在尋找最好的照片恢復軟件&#xff0c;那么您來對地方了。本文將分享一些幫助您找到最佳視頻恢復軟件的提示。 重要提示&#xff1a;事實&#xff1a;媒體文…