プロジェクトには、3つのアクター(ユーザー、エキスパート、管理者)と5つの主要なユースケース(CRUD:作成、読み取り、更新、削除、同期)があります。ただし、各ユースケースへのユーザーのアクセスは他のアクターとは異なります。たとえば、ユーザーは1つのエンティティを作成できますが、エキスパートと管理者は任意の数を作成できます。
また、アクターは同じUIを使用するため、実行時に現在のアクターに対してアクションを有効にするか無効にするかを決定する必要があります。それは簡単に思えますが、優れたデザインが好きです。特に、ユースケース、アクターの数そのため、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
}
たとえば、「アクション」と「エンティティタイプ」の概念を追加すると、インターフェイスを開くことができます。その後、PermissionFactoryの静的メソッドの代わりに、いくつかのアクセス許可ビルダーインターフェイスを提供します。しかし、とにかくセキュリティモデルとOCPは互いに直交しています。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加