全文目录:
-
- 开篇语
- 前言
- 系统设计概述
- [步骤一:创建Spring Boot项目](#步骤一:创建Spring Boot项目)
- 步骤二:配置数据库
- 步骤三:定义实体类
-
- [1. 用户实体类 `User`](#1. 用户实体类
User
) - [2. 角色实体类 `Role`](#2. 角色实体类
Role
) - [3. 权限实体类 `Permission`](#3. 权限实体类
Permission
)
- [1. 用户实体类 `User`](#1. 用户实体类
- [步骤四:创建JPA Repository](#步骤四:创建JPA Repository)
- [步骤五:配置Spring Security](#步骤五:配置Spring Security)
-
- [1. 自定义`UserDetailsService`](#1. 自定义
UserDetailsService
) - [2. 配置`SecurityConfig`](#2. 配置
SecurityConfig
)
- [1. 自定义`UserDetailsService`](#1. 自定义
- 步骤六:创建注册和登录页面
- 步骤七:创建用户和角色数据
- 步骤八:测试和运行
- 总结
- 文末
开篇语
今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。
我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。
小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!
前言
随着互联网应用的发展,如何安全高效地管理用户权限已经成为开发中的一项基本任务。Spring Boot作为一种开发快速且功能强大的框架,为我们提供了大量的工具和框架来帮助实现用户权限管理系统。Spring Security是一个功能强大的框架,它为身份验证和授权提供了广泛的支持,能够帮助开发者轻松实现复杂的权限管理功能。
本文将介绍如何基于Spring Boot和Spring Security实现一个简单的用户权限管理系统。我们将从用户管理、角色和权限管理、访问控制等方面逐步构建系统。
系统设计概述
本示例系统将实现以下功能:
- 用户注册和登录:支持用户通过用户名和密码登录系统。
- 角色和权限管理:支持角色和权限的定义和分配。
- 基于角色的访问控制:不同角色的用户只能访问授权的资源。
步骤一:创建Spring Boot项目
-
使用Spring Initializr创建一个新的Spring Boot项目,选择以下依赖:
- Spring Web
- Spring Data JPA
- Spring Security
- MySQL Driver
- Thymeleaf(用于渲染HTML页面)
- Spring Boot DevTools(用于热部署)
-
完成项目创建后,导入到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 !!!
⭐️若喜欢我,就请关注我叭。
⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。
版权声明:本文由作者原创,转载请注明出处,谢谢支持!