资源范围(Resource Scope)
它解决什么问题
Section titled “它解决什么问题”permission 回答「能做什么」,scope 回答「能在哪些资源上做」。仅有 permission 不够——reader 能读文档,但不应读其他项目的文档。scope 把授权限定到资源空间。
// 资源描述:被访问的资源及其父路径record ResourceDescriptor( resourceType, resourceId, parentPath, // List<String>,形如 ["PROJECT:101","DEPARTMENT:1"] attributes // Map<String,String>)
// 授权范围:允许访问的资源空间与访问模式record ResourceScope( scopeType, // 如 "PROJECT" scopeRefId, // 如 "101" accessMode // ScopeAccess)
enum ScopeAccess { READ, WRITE }判断资源是否落在 scope 内由宿主实现:
interface ResourceHierarchyProvider { boolean isWithinScope(ResourceDescriptor resource, ResourceScope scope);}源码见 ResourceHierarchyProvider.java 与 模型目录。
示例:项目内只读
Section titled “示例:项目内只读”reader profile 的 scope 为 (PROJECT,101,READ)。文档 1001 解析为 ResourceDescriptor("DOCUMENT", "1001", parentPath=["PROJECT:101","DEPARTMENT:1"]),落在 scope 内 → 允许;文档 2001(PROJECT:202)不在 scope 内 → SCOPE_DENIED(403)。
与 MVC 集成
Section titled “与 MVC 集成”用 @RequirePermission 时,由 MvcResourceDescriptorResolver 把请求解析为 ResourceDescriptor,详见 MvcResourceDescriptorResolver。