重学SpringBoot3-集成Spring Security(二)
在上一篇文章中,我们探讨了Spring Security的基础概念以及如何在Spring Boot 3项目中进行简单的集成。这一部分我们将深入讨论如何实现基于角色的访问控制,并配置自定义的安全策略。
1. 环境准备
确保你已经创建了一个Spring Boot 3项目,并在pom.xml
中添加了Spring Security的依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2. 编写用户和角色的模型
为了实现基于角色的访问控制,首先我们需要定义用户和角色的模型。这里我们使用内存中的用户存储,当然在实际应用中,通常会使用数据库。
创建一个User
类和一个Role
类:
// Role类
public class Role {
private String name;
public Role(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
// User类
public class User {
private String username;
private String password;
private List<Role> roles;
public User(String username, String password, List<Role> roles) {
this.username = username;
this.password = password;
this.roles = roles;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
public List<Role> getRoles() {
return roles;
}
}
3. 创建安全配置类
接下来,我们撰写一个安全配置类,继承WebSecurityConfigurerAdapter
,并重写相关方法来配置认证和权限。我们可以通过InMemoryUserDetailsManager
来创建内存用户。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
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;
@EnableWebSecurity
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN") // 只有ADMIN角色可访问
.antMatchers("/user/**").hasAnyRole("USER", "ADMIN") // USER和ADMIN角色可访问
.anyRequest().authenticated() // 其他请求需要认证
.and()
.formLogin(); // 使用表单登录
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("user").password(passwordEncoder().encode("password")).roles("USER")
.and()
.withUser("admin").password(passwordEncoder().encode("admin")).roles("ADMIN");
}
}
在上面的配置中,我们定义了两个用户:一个名为user
的用户,密码为password
,角色为USER
;另一个名为admin
的用户,密码为admin
,角色为ADMIN
。同时,我们定义了不同路由的访问权限。
4. 创建控制器
我们接下来可以创建一些简单的控制器,以便验证权限控制。
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MyController {
@GetMapping("/user/hello")
public String userHello() {
return "Hello User!";
}
@GetMapping("/admin/hello")
public String adminHello() {
return "Hello Admin!";
}
}
5. 测试安全配置
启动Spring Boot应用,尝试访问以下URL:
/user/hello
- 使用user
角色访问,应该能成功返回消息。/admin/hello
- 使用admin
角色访问,应该能成功返回消息。/admin/hello
- 使用user
角色访问,应该被拒绝访问。
6. 小结
在本次文章中,我们学习了如何在Spring Boot 3中集成Spring Security,并通过角色实现基于权限的访问控制。随着项目的复杂性增加,可能还需要实现更复杂的用户认证和授权逻辑,比如JWT认证、OAuth2等。希望这篇文章能帮助你在Spring Security的学习和应用中打下基础。