Java,为用例和参与者设计 pattern:Manager

Java,design pattern:Manager for Use cases and Actors

在一个项目中,我有 3 个参与者(用户、专家、管理员)和 5 个主要用例(CRUD:创建、读取、更新、删除和同步)。但是用户对每个用例的访问不同于其他 Actors.For 例如用户可以创建一个实体,但是专家和管理员可以创建任意数量,等等其他用例:

此外,演员使用相同的 UI.So 我必须决定在 运行 time.It 处启用或禁用与当前演员相关的操作 time.It 似乎很容易做到,但我喜欢有一个好的设计。特别是,用例的数量、参与者和他们的访问权限级别可能会改变later.So我必须尊重OCP原则.但是我如何才能有一个好的设计来管理用例和参与者的访问权限级别?

Java 带有非常简单但强大的安全思想。委托人(用户)拥有一些权限,而对象(实体)可能需要以某种方式处理一些权限。

import java.security.Permission;
import java.security.Permissions;
import java.security.SecurityPermission;

public class PermissionFactory {
        public static Permission createOneEntity() {
            return new SecurityPermission("entity.create.one");
        }
        public static Permission createManyEntities() {
            return new SecurityPermission("entity.create.many");
        }
        public static Permission deleteEntity(Entity e) {
            return new SecurityPermission("entity.delete." + entyty.getOwnerId());
        }   

        public static Permission deleteMyEntity(User owner) {
            return new SecurityPermission("entity.delete." + user.getId());
        }   
        public static Permission deleteAnyEntity() {
            return new SecurityPermission("entity.delete.*"); // * is a placeholder for 'any'
        }   
    }

public class User {
    private final Permissions permissions  = new Permissions();

    public void addPermission(Permission p) {
        if(p != null) {
            this.permissions.add(p);
        }
    }
    public boolean hasPermission(Permission p){
        return permissions.implies(p);
    }
}

当您创建用户时,您可以将他们的权限与他们一起存储。

User admin = new User(); 
admin.addPermission(PermissionFactory.deleteAnyEntity());
User regular = new User();
regular.addPermission(PermissionFactory.deletyMyEntitiy(tregular);

最后,当您需要执行一些受保护的操作时,您可以询问委托人他是否有足够的权限来执行此操作。

Entity object = ...;
if(regular.hasPermission(PermissionFactory.deleteEntity(object)) {
delete object
}

如果您添加 'action' 和 'entity type' 的概念,您可以打开您的界面,然后在 PermissionFactory 中提供一些权限生成器界面而不是静态方法。但无论如何,安全模型和 OCP 是相互正交的。