Spring Security掌握内容速忆(适用于初学者)
目录
一、需要掌握的
二、详细指引
1. 配置文件
2. 查用户
3. 在 Controller 里获取当前用户
四、容易搞混的问题
五、Security 报错解决方案
Spring Security 是公司里“骨架化”程度最高的组件之一,架构组会提供一个“认证授权中心”的 Maven 骨架(archetype),我们只需要:
- 改数据库表名(如果要加字段)
- 配白名单路径(哪些接口不需要登录)
- 写一个实现类(告诉框架怎么从数据库查用户)
其他的,比如 JWT 生成/校验、密码加密、Session 管理、过滤器链……统统不用你管,全是现成的。
一、需要掌握的
层级 | 需要掌握的内容 |
开发必知 | 1. 怎么配白名单( |
面试必问 | 认证流程(用户→UsernamePasswordAuthenticationToken→AuthenticationManager→UserDetailsService) |
排错必看 | 401/403 的区别;怎么从 SecurityContext 里取用户 |
二、详细指引
1. 配置文件(只需要改这三行)
@Configuration @EnableWebSecurity public class SecurityConfig { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.authorizeHttpRequests(auth -> auth // 我们只需要在这里加白名单 .requestMatchers("/api/login", "/api/register", "/swagger-ui/**").permitAll() .anyRequest().authenticated() ); return http.build(); } }2. 查用户(唯一要写的核心逻辑)
@Service public class MyUserDetailsService implements UserDetailsService { @Autowired private UserMapper userMapper; @Override public UserDetails loadUserByUsername(String username) { // 就写这一句:从数据库查用户 User user = userMapper.selectByUsername(username); if (user == null) { throw new UsernameNotFoundException("用户不存在"); } // 然后返回给框架,框架会自动校验密码 return new org.springframework.security.core.userdetails.User( user.getUsername(), user.getPassword(), new ArrayList<>() // 权限列表 ); } }3. 在 Controller 里获取当前用户(直接拿)
@GetMapping("/me") public UserInfo getCurrentUser() { // 就这么拿当前登录用户,不用自己解析Token Authentication auth = SecurityContextHolder.getContext().getAuthentication(); String username = auth.getName(); return userService.findByUsername(username); }四、容易搞混的问题
问题 | 答案 |
401 和 403 什么区别? | 401 = 没登录(未认证);403 = 登录了但权限不够(已认证但无权限) |
SecurityContext 里拿不到用户? | 检查过滤器链是否执行了,或者是不是在 |
我怎么区分普通用户和管理员? | 在 User 表里加一个 |
五、Security 报错解决方案
先检查:
/login放行了没有?(没放行就一直在登录页循环)UserDetailsService里查到的用户密码对不对?(错一个就 401)- 密码加密方式一致吗?(明文和 BCrypt 别混用)
只要把这三条记牢,Spring Security 这块就算过关了
