重学Spring Boot 3 - 集成Spring Security(三)
在前两篇文章中,我们已经初步认识了Spring Security以及如何在Spring Boot 3中进行基本的安全配置。在本篇文章中,我们将深入探讨如何实现用户认证和角色授权,以及一些常见的安全配置。
一、引入依赖
首先,确保你的pom.xml
中添加了Spring Security的依赖。如果你还没有添加,可以通过以下代码来引入:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
二、用户认证
我们将使用内存中存储用户数据的方式来进行用户认证。在实际项目中,通常会使用数据库存储用户信息。
代码示例
创建一个SecurityConfig
类来实现用户认证:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
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;
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("user")
.password("{noop}password") // {noop}表示不加密,实际项目中请使用加密
.roles("USER")
.and()
.withUser("admin")
.password("{noop}admin")
.roles("ADMIN");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/user/**").hasRole("USER")
.antMatchers("/", "/home").permitAll()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.permitAll();
}
}
在上面的配置中,我们定义了两个用户,分别是user
和admin
,并为他们设置了不同的角色。configure(HttpSecurity http)
方法则配置了不同URL的访问权限。注意这里的password
是使用{noop}
,表示密码不需要加密。生产环境建议使用BCrypt等安全方式进行密码加密。
三、编写控制器
接下来,我们需要创建一些控制器来处理请求。以下是一个简单的控制器示例:
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HomeController {
@GetMapping("/")
public String home() {
return "home"; // 返回主页
}
@GetMapping("/login")
public String login() {
return "login"; // 返回登录页面
}
@GetMapping("/user")
public String userPage(Model model) {
model.addAttribute("message", "欢迎用户");
return "user"; // 返回用户页面
}
@GetMapping("/admin")
public String adminPage(Model model) {
model.addAttribute("message", "欢迎管理员");
return "admin"; // 返回管理员页面
}
}
四、创建视图
在src/main/resources/templates
目录下,你可以创建home.html
、login.html
、user.html
和admin.html
页面。
例如login.html
:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>登录</title>
</head>
<body>
<h1>登录</h1>
<form th:action="@{/login}" method="post">
<div>
<label for="username">用户名:</label>
<input type="text" name="username" required />
</div>
<div>
<label for="password">密码:</label>
<input type="password" name="password" required />
</div>
<button type="submit">登录</button>
</form>
</body>
</html>
五、总结
以上内容展示了如何在Spring Boot 3中集成Spring Security,通过内存认证和角色授权实现简单的安全控制。对于更加复杂的需求,建议使用数据库来存储用户信息,并使用Spring Security的JWT、OAuth2等机制来增强安全性。希望通过这几篇文章的学习,能够帮助你更好地掌握Spring Security的使用,提升应用程序的安全性。