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

全文目录:

开篇语

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区: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中配置数据库连接信息:

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中创建数据库:

sql 复制代码
CREATE DATABASE user_permission_system;

步骤三:定义实体类

1. 用户实体类 User

java 复制代码
@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

java 复制代码
@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

java 复制代码
@Entity
public class Permission {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    // Getters and Setters
}

步骤四:创建JPA Repository

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

java 复制代码
@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接口来加载用户的角色和权限。

java 复制代码
@Service
public class CustomUserDetailsService implements UserDetailsService {

    @Autowired
    private UserRepository userRepository;

    @Override
    public 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的相关内容,定义访问权限、登录方式等。

java 复制代码
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private CustomUserDetailsService userDetailsService;

    @Override
    protected 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();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();  // 使用BCrypt加密密码
    }
}

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

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

登录页面 (login.html)

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)

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>

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

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

java 复制代码
@Component
public class DataInitializer implements CommandLineRunner {

    @Autowired
    private UserRepository userRepository;

    @Autowired
    private RoleRepository roleRepository;

    @Autowired
    private PermissionRepository permissionRepository;

    @Override
    public 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 !!!


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

⭐️若对您有用,就请点赞叭。

⭐️若有疑问,就请评论留言告诉我叭。


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

相关推荐
埃泽漫笔2 分钟前
Spring 的 ioc 控制反转
java·spring·ioc
太阳之神aboluo6 分钟前
SpringCloud (4) 分布式事务
java·spring·spring cloud
Cosolar7 分钟前
下一代 Python Web 框架?FastAPI 全面解析与实战对比
后端·python
Noii.27 分钟前
Mybatis的应用及部分特性
java·数据库·mybatis
Warren9831 分钟前
Java异常讲解
java·开发语言·前端·javascript·vue.js·ecmascript·es6
用户4822137167751 小时前
C++——复合数据类型(数组、字符串)
后端
用户903700167151 小时前
分布式阻塞式限流学习及分享
后端
JIngJaneIL1 小时前
家常菜点餐|基于java和小程序的家庭大厨家常菜点餐系统设计与实现(源码+数据库+文档)
java·数据库·小程序·vue·论文·毕设·家常菜点餐系统
熊猫片沃子1 小时前
Mybatis中进行批量修改的方法
java·后端·mybatis
养鱼的程序员1 小时前
零基础搭建个人网站:从 Astro 框架到 GitHub 自动部署完全指南
前端·后端·github