当前位置: 首页 > news >正文

如何实现一个简单的基于Spring Boot的用户权限管理系统?

全文目录:

    • 开篇语
    • 前言
    • 系统设计概述
    • 步骤一:创建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.dtcms.com/a/316389.html

相关文章:

  • layernorm backward CUDA优化分析
  • Spring Boot 集成 ShardingSphere 实现读写分离实践
  • MySQL数据类型介绍
  • langchain入门笔记01
  • 【nvidia-B200】Ubuntu 22.04 中安装指定版本的 NVIDIA 驱动时出现依赖冲突
  • 亚马逊否定投放全攻略:精准过滤无效流量的底层逻辑与实战体系
  • 【教育教学】人才培养方案制定
  • Erlang notes[1]
  • 贝叶斯统计从理论到实践
  • G1垃圾回收堆内存分配问题
  • 8位mcu控制器的架构特征是什么?有哪些应用设计?
  • 单片机充电的时候电池电压会被拉高,如何检测电压?
  • 深入解析数据结构之顺序表
  • DAO治理合约开发指南:原理与Solidity实现
  • RocketMq如何保证消息的顺序性
  • 图像处理中的锚点含义
  • 【unity实战】使用unity程序化随机生成3D迷宫
  • 大学生入门:抽象 及 接口
  • 零基础人工智能学习规划之路
  • Python基础框架
  • MyBatis基础入门:Java持久层框架的技术深度解析
  • 脚手架开发-准备配置-配置文件的准备项目的一些中间件
  • Vue3 defineAsyncComponent() 函数
  • 客流人数统计准确率↑32%:陌讯多模态时序融合算法实战解析
  • 10.Linux 系统启动原理
  • 12306旅游产品数据抓取:Python+API逆向分析
  • 如何让 RAG 检索更高效?——大模型召回策略全解
  • 跨越系统孤岛:4A架构如何实现企业级一体化协同
  • 从RNN为什么长依赖遗忘到注意力机制的解决方案以及并行
  • chromedp 笔记