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 是相互正交的。