4Secure by Design

认证与授权

身份管理

认证授权RBAC最小权限

🎯 AI 时代的学习建议:不要只读理论。理解这一章的设计动机(为什么需要这个概念?)和边界条件(什么情况下会失效?)。当 AI 生成的代码涉及这些概念时,你能判断它是否用对了场景。AI 能帮你总结内容,但无法替代你亲手阅读、思考、建立直觉的过程。

第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 有什么安全风险?如何防御?

设计一个多租户系统的权限模型。


4/7认证与授
0%