MST
星途 面试题库

面试题:Java授权机制应用场景分析

假设你正在开发一个多用户在线文档编辑系统,不同用户有不同的权限(如只读、编辑、删除等)。请描述如何基于Java的授权机制来实现这种权限控制,包括涉及到的主要类和方法,以及授权策略的设计思路。
11.4万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

主要类和方法

  1. 主体类(Subject)
    • 可以是代表用户的User类,包含用户标识、用户名等基本信息。例如:
public class User {
    private String userId;
    private String username;
    // 其他用户相关属性和方法
    public User(String userId, String username) {
        this.userId = userId;
        this.username = username;
    }
    // getters 和 setters 方法
    public String getUserId() {
        return userId;
    }
    public String getUsername() {
        return username;
    }
}
  1. 资源类(Resource)
    • 例如代表在线文档的Document类,包含文档标识、文档内容等。
public class Document {
    private String documentId;
    private String content;
    // 其他文档相关属性和方法
    public Document(String documentId, String content) {
        this.documentId = documentId;
        this.content = content;
    }
    // getters 和 setters 方法
    public String getDocumentId() {
        return documentId;
    }
    public String getContent() {
        return content;
    }
}
  1. 权限类(Permission)
    • 定义不同的权限类型,如只读、编辑、删除。可以使用枚举类型:
public enum Permission {
    READ_ONLY, EDIT, DELETE
}
  1. 授权策略类(AuthorizationPolicy)
    • 这是核心类,负责检查主体对资源是否具有特定权限。例如:
import java.util.HashMap;
import java.util.Map;

public class AuthorizationPolicy {
    private static Map<String, Map<String, Permission>> userPermissions = new HashMap<>();
    // 初始化权限配置
    static {
        // 模拟配置,实际应用中可从数据库等加载
        Map<String, Permission> user1Permissions = new HashMap<>();
        user1Permissions.put("document1", Permission.READ_ONLY);
        userPermissions.put("user1", user1Permissions);

        Map<String, Permission> user2Permissions = new HashMap<>();
        user2Permissions.put("document1", Permission.EDIT);
        userPermissions.put("user2", user2Permissions);
    }
    public static boolean hasPermission(User user, Document document, Permission permission) {
        Map<String, Permission> userPermissionsMap = userPermissions.get(user.getUserId());
        if (userPermissionsMap == null) {
            return false;
        }
        Permission userPermission = userPermissionsMap.get(document.getDocumentId());
        return userPermission != null && userPermission.ordinal() >= permission.ordinal();
    }
}

授权策略设计思路

  1. 基于角色的访问控制(RBAC)简化版思路
    • 虽然没有严格的角色概念,但通过直接为用户配置对文档的权限来实现类似功能。
    • AuthorizationPolicy类中,使用userPermissions这个Map来存储用户与文档权限的映射关系。
  2. 权限比较逻辑
    • hasPermission方法中,先获取用户对应的权限配置userPermissionsMap
    • 然后根据文档ID获取用户对该文档的实际权限userPermission
    • 最后通过比较权限的枚举顺序来判断用户是否具有足够权限,例如EDIT权限的枚举顺序大于READ_ONLY,如果用户有EDIT权限则必然有READ_ONLY权限。
  3. 灵活性扩展
    • 实际应用中,userPermissions的初始化可以从数据库、配置文件等加载,提高系统的灵活性和可维护性。
    • 可以进一步引入角色概念,通过角色来管理权限,这样在用户数量较多时权限管理更加方便。