主要类和方法
- 主体类(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;
}
}
- 资源类(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;
}
}
- 权限类(Permission):
- 定义不同的权限类型,如只读、编辑、删除。可以使用枚举类型:
public enum Permission {
READ_ONLY, EDIT, DELETE
}
- 授权策略类(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();
}
}
授权策略设计思路
- 基于角色的访问控制(RBAC)简化版思路:
- 虽然没有严格的角色概念,但通过直接为用户配置对文档的权限来实现类似功能。
- 在
AuthorizationPolicy
类中,使用userPermissions
这个Map
来存储用户与文档权限的映射关系。
- 权限比较逻辑:
- 在
hasPermission
方法中,先获取用户对应的权限配置userPermissionsMap
。
- 然后根据文档ID获取用户对该文档的实际权限
userPermission
。
- 最后通过比较权限的枚举顺序来判断用户是否具有足够权限,例如
EDIT
权限的枚举顺序大于READ_ONLY
,如果用户有EDIT
权限则必然有READ_ONLY
权限。
- 灵活性扩展:
- 实际应用中,
userPermissions
的初始化可以从数据库、配置文件等加载,提高系统的灵活性和可维护性。
- 可以进一步引入角色概念,通过角色来管理权限,这样在用户数量较多时权限管理更加方便。