在一个项目中,我有3个Actors(用户,专家,管理员)和5个主要用例(CRUD:创建,读取,更新,删除和同步)。但是用户对每个用例的访问权限与其他Actors不同。例如,用户可以创建一个实体,但是专家和管理员可以创建任意数字,等等其他用例:
此外,演员使用相同的UI。所以我必须决定在运行时启用或禁用当前演员的动作。这似乎很容易做到,但我喜欢好的设计。特别是,用例,参与者及其访问权限级别的数量可能会在以后发生变化。所以我必须尊重 OCP原则。但是我如何才能有一个好的设计来管理用例和演员&# 39; s访问权限级别?
答案 0 :(得分:1)
Java带有非常简单但强大的安全性思想。 Principal(用户)拥有一些权限,而对象(实体)可能需要以某种方式处理某些权限。
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'的概念,您可以打开界面。和'实体类型'例如,然后在PermissionFactory中代替静态方法提供一些权限构建器接口。但无论如何安全模型和OCP彼此正交。