全文目录:

    • 开篇语
    • 前言
    • 系统设计概述
    • 步骤一:创建Spring Boot项目
    • 步骤二:配置数据库
    • 步骤三:定义实体类
      • 1. 用户实体类 `User`
      • 2. 角色实体类 `Role`
      • 3. 权限实体类 `Permission`
    • 步骤四:创建JPA Repository
    • 步骤五:配置Spring Security
      • 1. 自定义`UserDetailsService`
      • 2. 配置`SecurityConfig`
    • 步骤六:创建注册和登录页面
      • 登录页面 (`login.html`)
      • 注册页面 (`register.html`)
    • 步骤七:创建用户和角色数据
    • 步骤八:测试和运行
    • 总结
    • 文末

开篇语

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

前言

  随着互联网应用的发展,如何安全高效地管理用户权限已经成为开发中的一项基本任务。Spring Boot作为一种开发快速且功能强大的框架,为我们提供了大量的工具和框架来帮助实现用户权限管理系统。Spring Security是一个功能强大的框架,它为身份验证和授权提供了广泛的支持,能够帮助开发者轻松实现复杂的权限管理功能。

  本文将介绍如何基于Spring Boot和Spring Security实现一个简单的用户权限管理系统。我们将从用户管理、角色和权限管理、访问控制等方面逐步构建系统。

系统设计概述

本示例系统将实现以下功能:

  1. 用户注册和登录:支持用户通过用户名和密码登录系统。
  2. 角色和权限管理:支持角色和权限的定义和分配。
  3. 基于角色的访问控制:不同角色的用户只能访问授权的资源。

步骤一:创建Spring Boot项目

  1. 使用Spring Initializr创建一个新的Spring Boot项目,选择以下依赖:

    • Spring Web
    • Spring Data JPA
    • Spring Security
    • MySQL Driver
    • Thymeleaf(用于渲染HTML页面)
    • Spring Boot DevTools(用于热部署)
  2. 完成项目创建后,导入到IDE中。

步骤二:配置数据库

我们将使用MySQL数据库来存储用户、角色和权限的信息。在application.properties中配置数据库连接信息:

spring.datasource.url=jdbc:mysql://localhost:3306/user_permission_system?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root_password
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect

然后,在MySQL中创建数据库:

CREATE DATABASE user_permission_system;

步骤三:定义实体类

1. 用户实体类 User

@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_role", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))private Set<Role> roles = new HashSet<>();// Getters and Setters
}

2. 角色实体类 Role

@Entity
public class Role {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;@ManyToMany(fetch = FetchType.EAGER)@JoinTable(name = "role_permission", joinColumns = @JoinColumn(name = "role_id"), inverseJoinColumns = @JoinColumn(name = "permission_id"))private Set<Permission> permissions = new HashSet<>();// Getters and Setters
}

3. 权限实体类 Permission

@Entity
public class Permission {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String name;// Getters and Setters
}

步骤四:创建JPA Repository

为每个实体类创建JPA的Repository接口,用于与数据库进行交互:

@Repository
public interface UserRepository extends JpaRepository<User, Long> {Optional<User> findByUsername(String username);
}@Repository
public interface RoleRepository extends JpaRepository<Role, Long> {Role findByName(String name);
}@Repository
public interface PermissionRepository extends JpaRepository<Permission, Long> {Permission findByName(String name);
}

步骤五:配置Spring Security

Spring Security用于处理认证和授权,我们将自定义一个UserDetailsService来加载用户信息,并在SecurityConfig中配置访问控制。

1. 自定义UserDetailsService

我们需要创建一个自定义的UserDetailsService,通过实现UserDetailsService接口来加载用户的角色和权限。

@Service
public class CustomUserDetailsService implements UserDetailsService {@Autowiredprivate UserRepository userRepository;@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {User user = userRepository.findByUsername(username).orElseThrow(() -> new UsernameNotFoundException("User not found"));List<GrantedAuthority> authorities = user.getRoles().stream().flatMap(role -> role.getPermissions().stream()).map(permission -> new SimpleGrantedAuthority(permission.getName())).collect(Collectors.toList());return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), authorities);}
}

2. 配置SecurityConfig

SecurityConfig类中,我们配置Spring Security的相关内容,定义访问权限、登录方式等。

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Autowiredprivate CustomUserDetailsService userDetailsService;@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/login", "/register").permitAll()  // 注册和登录页面可以公开访问.antMatchers("/admin/**").hasRole("ADMIN")   // 只有ADMIN角色才能访问/admin路径.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();  // 使用BCrypt加密密码}
}

步骤六:创建注册和登录页面

为了能够注册和登录,我们需要创建相应的HTML页面。你可以使用Thymeleaf来创建这些页面。

登录页面 (login.html)

<form action="/login" method="post"><input type="text" name="username" placeholder="Username" required><input type="password" name="password" placeholder="Password" required><button type="submit">Login</button>
</form>

注册页面 (register.html)

<form action="/register" method="post"><input type="text" name="username" placeholder="Username" required><input type="password" name="password" placeholder="Password" required><button type="submit">Register</button>
</form>

步骤七:创建用户和角色数据

为了便于开发和测试,我们可以在应用启动时预置一些用户、角色和权限数据。

@Component
public class DataInitializer implements CommandLineRunner {@Autowiredprivate UserRepository userRepository;@Autowiredprivate RoleRepository roleRepository;@Autowiredprivate PermissionRepository permissionRepository;@Overridepublic void run(String... args) throws Exception {Permission readPermission = new Permission();readPermission.setName("READ_PRIVILEGES");permissionRepository.save(readPermission);Role adminRole = new Role();adminRole.setName("ROLE_ADMIN");adminRole.getPermissions().add(readPermission);roleRepository.save(adminRole);User admin = new User();admin.setUsername("admin");admin.setPassword(new BCryptPasswordEncoder().encode("admin123"));admin.getRoles().add(adminRole);userRepository.save(admin);}
}

步骤八:测试和运行

完成上述步骤后,启动Spring Boot应用,访问http://localhost:8080/login进行登录测试。

  • 访问/admin路径时,只有具有ROLE_ADMIN角色的用户可以访问。
  • 其他路径都需要用户认证。

总结

通过Spring Boot和Spring Security,我们可以快速搭建一个简单的用户权限管理系统。系统实现了用户的注册和登录、角色和权限的管理,并通过基于角色的访问控制(RBAC)对资源进行授权。这个基础的系统框架为更复杂的权限管理提供了一个良好的起点,可以根据实际需求进一步扩展和优化。

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

… …

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。


版权声明:本文由作者原创,转载请注明出处,谢谢支持!

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习及其KNN算法

一、机器学习概述机器学习&#xff08;Machine Learning, ML&#xff09;是人工智能的核心分支&#xff0c;旨在通过算法让计算机从数据中自动学习规律并优化性能&#xff0c;而无需显式编程。这一技术领域起源于20世纪50年代&#xff0c;随着计算能力的提升和大数据时代的到来…

Kaggle 经典竞赛泰坦尼克号:超级无敌爆炸详细基础逐行讲解Pytorch实现代码,看完保证你也会!!!

讲解代码分为3个步骤&#xff1a;有什么用&#xff0c;为什么需要他&#xff0c;如何使用保证大家耐心看完一定大有裨益&#xff01;如果有懂的可以跳过&#xff0c;不过建议可以看完&#xff0c;查漏补缺嘛。现在开始吧&#xff01;项目目标我们的目标是根据泰坦尼克号乘客的个…

双目标定中旋转矩阵参数应用及旋转角度计算(聚焦坐标系平行)

一、引言 在双目视觉系统开发中&#xff0c;若需实现右相机坐标系与左相机坐标系平行&#xff0c;核心在于通过双目标定获取的旋转矩阵RRR&#xff0c;消除两相机间的相对旋转。本报告聚焦旋转矩阵的物理意义与工程应用&#xff0c;详细说明如何通过旋转矩阵计算相对旋转角度&a…

GraphRAG 入门教程:从原理到实战

GraphRAG 入门教程&#xff1a;从原理到实战 1. 什么是 GraphRAG&#xff1f; GraphRAG 是一种结构化的、分层的检索增强生成&#xff08;Retrieval-Augmented Generation&#xff0c;简称 RAG&#xff09;方法 和传统的 RAG 不同&#xff0c;GraphRAG 不仅仅依赖文本相似度搜索…

系统集成项目管理工程师【第十一章 规划过程组】规划成本管理、成本估算、制定预算和规划质量管理篇

系统集成项目管理工程师【第十一章 规划过程组】规划成本管理、成本估算、制定预算和规划质量管理篇 一、规划成本管理&#xff1a;为成本管控定方向 规划成本管理是项目成本管理的起点&#xff0c;其核心是明确“如何管”的规则&#xff0c;为整个项目的成本管理提供统一框架。…

Xiphos Q8 SDR DOCK子板 AD9361 宽带收发器的 SDR 模块。

Q8 混合处理器卡的子板&#xff0c;包含基于 ADI 公司流行的 AD9361 宽带收发器的 SDR 模块。与基于 AD9361 的 SDR 模块接口PPS、CAN总线、串行、UART&#xff08;LVDS&#xff09;、USB接口电源接口&#xff08;5V、12V&#xff09; Q8 处理器卡的子板&#xff0c;集成了基于…

DPU(数据处理单元)架构中,SoC(系统级芯片)与FPGA(现场可编程门阵列)之间的数据交互

在DPU&#xff08;数据处理单元&#xff09;架构中&#xff0c;SoC&#xff08;系统级芯片&#xff09;与FPGA&#xff08;现场可编程门阵列&#xff09;之间的数据交互是实现高效异构计算的关键。根据通信目标和硬件特性&#xff0c;其交互数据类型可分为以下四类&#xff1a;…

图论(邻接表)DFS

竞赛中心 - 蓝桥云课 #include<bits/stdc.h> using namespace std; #define int long long const int A1e51; typedef pair<int,int>p; map<p,int>st; vector<p>edge[A]; int a[A]; int result0; bool dfs(int s,int u,int father,int v,int sum) {i…

深入理解VideoToolbox:iOS/macOS视频硬编解码实战指南

引言&#xff1a;VideoToolbox框架概述 VideoToolbox是Apple提供的底层框架&#xff0c;首次在WWDC2014上推出&#xff0c;为iOS和macOS开发者提供直接访问硬件编码器和解码器的能力。作为Core Media框架的重要组成部分&#xff0c;VideoToolbox专注于视频压缩、解压缩以及Cor…

Python基础语法练习

本文涵盖了 Python 基础编程中的多个重要概念&#xff0c;从简单的输出语句到运算符、字符串操作、变量赋值等都有涉及。这些例子非常适合初学者学习和理解 Python 的基本语法。1. Hello World# 输出Hello Worldprint("Hello, World!")2. 变量赋值# 创建变量并赋值na…

关于“致命错误:‘https://github.com/....git/‘ 鉴权失败”

问题分析 错误信息&#xff1a; remote: Invalid username or token. Password authentication is not supported for Git operations. 致命错误&#xff1a;https://github.com/yarajia/LittleTestToolsProject.git/ 鉴权失败原因&#xff1a;GitHub从2021年8月13日起不再支持…

基于Flask + Vue3 的新闻数据分析平台源代码+数据库+使用说明,爬取今日头条新闻数据,采集与清洗、数据分析、建立数据模型、数据可视化

介绍 本项目为新闻数据分析平台&#xff0c;目的是爬取新闻(目前仅含爬取今日头条)数据&#xff0c;然后对数据进行展示、采集与清洗、数据分析、建立数据模型、数据可视化。本项目采用前后端分离模式&#xff0c;前端使用 Vue3 ArcoDesign 搭建&#xff0c;后端使用 Python …

LabVIEW数字抽取滤波

​基于 LabVIEW 平台设计数字抽取滤波器&#xff0c;用于动态测试领域&#xff0c;解决高采样率数据的大动态范围需求与频带划分问题。方案替换硬件为可靠性优异的品牌&#xff0c;通过虚拟仪器架构实现信号处理功能&#xff0c;为动态信号分析提供高效、可复用的设计参考。应用…

云原生时代的 Linux:容器、虚拟化与分布式的基石

&#x1f4dd;个人主页&#x1f339;&#xff1a;慌ZHANG-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 在云计算与容器化快速发展的今天&#xff0c;Linux 已经不再只是服务器上的操作系统&#xff0c;而是整个云原生生态的底层基石。无论是运…

多场景两阶段分布式鲁棒优化模型、数据驱动的综合能源系统

基于数据驱动的综合能源系统多场景两阶段分布式鲁棒优化模型 鲁棒优化是应对数据不确定性的一种优化方法&#xff0c;但单阶段鲁棒优化过于保守。为了解决这一问题&#xff0c;引入了两阶段鲁棒优化(Two-stage Robust Optimization)以及更一般的多阶段鲁棒优化&#xff0c;其核…

Python实现点云PCA配准——粗配准

本节我们来介绍PCA&#xff08;主成分分析&#xff09;算法进行点云配准&#xff0c;这是一种经典的统计降维与特征提取工具&#xff0c;在三维点云处理中常被用来完成“粗配准”。其核心思想是&#xff1a;先把两个待对齐的点云各自进行主成分分解&#xff0c;获得各自的“主轴…

零基础深度学习规划路线:从数学公式到AI大模型的系统进阶指南

引言在人工智能革命席卷全球的2025年&#xff0c;深度学习已成为改变行业格局的核心技术。本规划路线整合最新教育资源与实践方法&#xff0c;为完全零基础的学习者构建一条从数学基础到AI大模型的系统学习路径。通过清华大佬的实战课程、吴恩达的经典理论、Kaggle竞赛的实战锤…

基于Vue.js和Golang构建高效在线客服系统:前端实现与后端交互详解

在当今互联网时代&#xff0c;在线客服系统已成为企业与用户沟通的重要桥梁。本文将详细介绍如何使用Vue.js作为前端框架&#xff0c;Gin作为后端框架&#xff0c;构建一个高效的在线客服系统。一、项目背景与技术选型项目背景随着电子商务的迅猛发展&#xff0c;用户对即时咨询…

虚幻GAS底层原理解剖九 (内存管理)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、整体内存管理思路概览二、核心对象的生命周期与托管逻辑UGameplayAbility 的管理GameplayEffect 的内存管理ActiveGameplayEffect 生命周期三、属性&#xf…

Rust 通用库新增 WebAssembly

1 先判断&#xff1a;也许你的 crate 已经能跑 Wasm&#xff01;排查阻碍因素 直接文件/网络 I/O块式&#xff08;同步&#xff09;I/Ostd::thread 线程创建并不受支持的 C 系统库绑定快速验证rustup target add wasm32-unknown-unknown cargo build --target wasm32-unknown-…