Java,设计模式:用例和参与者管理器
Posted
技术标签:
【中文标题】Java,设计模式:用例和参与者管理器【英文标题】:Java,design pattern:Manager for Use cases and Actors 【发布时间】:2015-01-17 05:27:15 【问题描述】:在一个项目中,我有 3 个参与者(用户、专家、管理员)和 5 个主要用例(CRUD:创建、读取、更新、删除和同步)。但是用户对每个用例的访问权限与其他 Actors 不同。例如用户可以创建一个实体,但专家和管理员可以创建任意数量,等等其他用例:
另外,演员使用相同的 UI。所以我必须在运行时决定启用或禁用当前演员的动作。这似乎很容易做到,但我喜欢有一个好的设计.特别是,用例的数量,参与者及其访问权限级别可能会在以后发生变化。所以我必须尊重OCP原则。但是我如何才能有一个好的设计来管理用例和参与者的访问权限水平合适吗?
【问题讨论】:
【参考方案1】: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
例如,如果您添加“动作”和“实体类型”的概念,您可以打开您的界面,然后在 PermissionFactory 中提供一些权限构建器界面来代替静态方法。但无论如何,安全模型和 OCP 是相互正交的。
【讨论】:
以上是关于Java,设计模式:用例和参与者管理器的主要内容,如果未能解决你的问题,请参考以下文章