第4章:认证与授权(Authentication and Authorization)
一、导读
1.1 本章学习目标
第4章讲解身份认证和权限控制——安全系统的核心。
本章的核心学习目标包括:
- 理解认证与授权的区别
- 掌握 RBAC(基于角色的访问控制)
- 理解最小权限原则
- 学会设计安全的会话管理
1.2 为什么本章如此重要
认证和授权是几乎所有应用的基础。错误的实现可能导致身份冒用、越权访问、数据泄露等严重后果。
1.3 核心问题引导
认证和授权有什么区别?
RBAC 模型如何工作?有什么优缺点?
最小权限原则在实践中如何应用?
会话管理有哪些安全风险?
二、核心概念详解
2.1 认证 vs 授权
认证(Authentication):你是谁?
→ 验证身份(密码、Token、生物特征)
授权(Authorization):你能做什么?
→ 检查权限(角色、权限、策略)2.2 RBAC
java
// 角色
public enum Role {
ADMIN, MANAGER, USER, GUEST
}
// 权限
public enum Permission {
USER_READ, USER_WRITE, USER_DELETE,
ORDER_READ, ORDER_WRITE, ORDER_DELETE,
REPORT_VIEW, REPORT_EXPORT
}
// 角色-权限映射
public class RolePermissionMapping {
private static final Map<Role, Set<Permission>> MAPPING = Map.of(
Role.ADMIN, EnumSet.allOf(Permission.class),
Role.MANAGER, EnumSet.of(
Permission.USER_READ, Permission.ORDER_READ, Permission.ORDER_WRITE,
Permission.REPORT_VIEW, Permission.REPORT_EXPORT
),
Role.USER, EnumSet.of(Permission.USER_READ, Permission.ORDER_READ),
Role.GUEST, EnumSet.of(Permission.USER_READ)
);
}
// 授权检查
public class AuthorizationService {
public boolean hasPermission(User user, Permission permission) {
return user.getRoles().stream()
.flatMap(role -> RolePermissionMapping.getPermissions(role).stream())
.anyMatch(p -> p == permission);
}
}2.3 最小权限原则
java
// 不好的设计:过度授权
@PreAuthorize("hasRole('ADMIN')") // 只有管理员能查看自己的资料
public UserProfile getMyProfile() { ... }
// 好的设计:最小权限
@PreAuthorize("isAuthenticated()") // 任何登录用户都能查看自己的资料
public UserProfile getMyProfile(@AuthenticationPrincipal User user) { ... }2.4 安全会话管理
java
// 安全的 Session 配置
@Configuration
public class SecurityConfig {
@Bean
public SessionManager sessionManager() {
return SessionManager.builder()
.sessionTimeout(Duration.ofMinutes(30)) // 超时自动失效
.maxSessions(3) // 限制并发会话
.secureCookie(true) // HTTPS only
.httpOnlyCookie(true) // 禁止 JS 访问
.sameSiteCookie(SameSite.STRICT) // 防止 CSRF
.build();
}
}三、实战案例
3.1 案例一:JWT 认证
java
public class JwtTokenService {
private final SecretKey key = Keys.secretKeyFor(SignatureAlgorithm.HS256);
public String generateToken(User user) {
return Jwts.builder()
.setSubject(user.getId())
.claim("roles", user.getRoles())
.setIssuedAt(new Date())
.setExpiration(new Date(System.currentTimeMillis() + 3600000))
.signWith(key)
.compact();
}
public Claims validateToken(String token) {
return Jwts.parserBuilder()
.setSigningKey(key)
.build()
.parseClaimsJws(token)
.getBody();
}
}四、本章小结
认证:验证身份(你是谁)。
授权:检查权限(你能做什么)。
RBAC:基于角色的访问控制。
最小权限:只授予必要的权限。
五、思考与练习
RBAC 和 ABAC(基于属性的访问控制)有什么区别?
JWT 有什么安全风险?如何防御?
设计一个多租户系统的权限模型。