Spring Boot集成Spring Security:实现用户认证与授权
1. 添加依赖
在pom.xml
文件中添加Spring Security的依赖。如果你使用的是Spring Boot 3.x或更高版本,可以添加以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
如果你使用的是Spring Boot 2.x,可能需要额外添加spring-security-config
依赖。
2. 配置Spring Security
Spring Security的核心是SecurityFilterChain
和UserDetailsService
。你需要通过配置类来定义安全策略。
创建配置类
创建一个继承自WebSecurityConfigurerAdapter
的配置类,并重写相关方法。
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.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public UserDetailsService userDetailsService() {
// 在内存中定义用户
UserDetails user = User.withDefaultPasswordEncoder()
.username("user")
.password("password")
.roles("USER")
.build();
return new InMemoryUserDetailsManager(user);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable() // 禁用CSRF保护(开发环境可以禁用,生产环境建议启用)
.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN") // 配置路径权限
.antMatchers("/user/**").hasRole("USER")
.antMatchers("/", "/home", "/register").permitAll() // 允许匿名访问的路径
.anyRequest().authenticated() // 其他请求需要认证
.and()
.formLogin()
.loginPage("/login") // 自定义登录页面
.permitAll() // 允许匿名访问登录页面
.and()
.logout()
.permitAll(); // 允许匿名访问登出页面
}
}
说明:
-
UserDetailsService
:定义用户信息。这里使用了内存用户管理InMemoryUserDetailsManager
,实际项目中可以使用数据库存储用户信息。 -
HttpSecurity
:定义安全策略,例如:
-
csrf()
:CSRF保护。 -
authorizeRequests()
:定义路径的访问权限。 -
formLogin()
:自定义登录页面。 -
logout()
:配置登出功能。
3. 创建登录页面
Spring Security默认会提供一个简单的登录表单,但你可以自定义登录页面。
创建登录页面
在src/main/resources/templates
目录下创建login.html
文件(假设使用Thymeleaf模板引擎):
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Login</title>
</head>
<body>
<form th:action="@{/login}" method="post">
<div><label>Username: <input type="text" name="username"/></label></div>
<div><label>Password: <input type="password" name="password"/></label></div>
<div><input type="submit" value="Sign In"/></div>
</form>
</body>
</html>
4. 测试
启动项目后,访问受保护的路径(如/admin
或/user
),会被重定向到登录页面。输入用户名和密码后,根据角色权限访问对应的资源。
5. 扩展功能
数据库用户存储
如果需要从数据库中获取用户信息,可以实现UserDetailsService
接口,并从数据库中加载用户信息。
@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 with username: " + username));
return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), new ArrayList<>());
}
}
自定义登录逻辑
可以通过实现AuthenticationProvider
接口来自定义登录逻辑。
配置JWT
如果需要使用JWT进行无状态认证,可以结合JwtAuthenticationToken
和JwtAuthenticationProvider
实现。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步