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 {@Beanpublic UserDetailsService userDetailsService() {// 在内存中定义用户UserDetails user = User.withDefaultPasswordEncoder().username("user").password("password").roles("USER").build();return new InMemoryUserDetailsManager(user);}@Overrideprotected 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 {@Autowiredprivate UserRepository userRepository;@Overridepublic 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
实现。