【问题标题】:How can I better represent user permissions?如何更好地表示用户权限?
【发布时间】:2011-03-24 17:02:50
【问题描述】:

在我的系统中,我有一个负载为 (20?) final booleans 的类,用于定义此用户类型的权限。

有什么更好的方法来做到这一点?

我确信有很多关于此的示例,但我不知道关键字。

【问题讨论】:

  • 能否请您粘贴一些代码 sn-p 以更好地了解您正在尝试做的事情。

标签: java data-structures oop permissions


【解决方案1】:

您可以利用枚举,例如:

public enum Permission {
    READ, WRITE;
}

public class User {

    private final EnumSet<Permission> permissions;

    public User(Permission... permissions) {
       this.permissions = EnumSet.copyOf(Arrays.asList(permissions));
    }

    public boolean hasPermission(Permission permission) {
        return permissions.contains(permission);
    }

    //...
}

User user = new User(Permission.READ, Permission.WRITE);

【讨论】:

  • 顺便说一句:此代码不会编译,因为您在没有初始化的情况下创建了最终字段
  • +1,这就是我对 tdammers 回答的评论中的意思。 @Vash - 这完全没问题,该字段在构造函数中初始化。
【解决方案2】:

创建一个类Permission,并为每个User 提供它们的集合。如果权限在用户的权限集合中,则用户有权限,否则没有。

【讨论】:

  • 他明确要求最终的布尔值。
  • @Tim:他明确要求一种比最终布尔值更好的方法。
  • 不,他要求比最终布尔值更好的方法
  • 一个特别好的方法是使Permission 类成为一个枚举(从概念上讲,它可能是一个枚举,除非应用程序正在使用动态创建的角色做一些不寻常的事情)。然后通过调用EnumSet.contains(Permission.ADMIN) 之类的代码,您可以获得非常清晰的代码。
  • @Andrzej Doyle 当你有 20 个角色你需要检查写 20 次 EnumSet.Contains(Permission.ADMIN) 代码停止是非常干净的。基于 Enum 的角色是非常有限的选择。
【解决方案3】:

您可以为此使用掩码

public interface IPersmisions {

 public static final int NONE = 1 << 0;
 public static final int LEVEL1 = 1 << 1;
 public static final int LEVEL2 = 1 << 2;
 public static final int LEVEL3 = 1 << 3;
 public static final int LEVEL4 = 1 << 4;
 public static final int LEVEL5 = 1 << 5;
 public static final int LEVEL6 = 1 << 6;
 public static final int LEVEL7 = 1 << 7;
 public static final int LEVEL8 = 1 << 8;
 public static final int LEVEL9 = 1 << 9;
}

在用过你加

int permisions = IPersmisions.NONE;

    public boolean checkPermission(int permission) {
        return (permissions & permission) != 0;
    }

    public void addPermission(int permission) {
            permissions = (permissions | permission);
    }

    public void removePermission(int permission) {
        permissions = (permissions & ~permission);
    }

比你可以轻松地为用户设置一个组

public interface IPermisionGroup extends IPermisions {

  public static final int LEVEL1_2_3 = LEVEL1 | LEVEL2 | LEVEL3; 
  public static final int LEVEL4_5_6 = LEVEL4 | LEVEL5 | LEVEL6; 
  public static final int LEVEL7_8_9 = LEVEL7 | LEVEL8 | LEVEL9; 

}

而在你可以使用的代码中是这样的

   user.addPermision(IPermisions.LEVEL1);

或

   user.addPermision(IPermisions.LEVEL1 | IPermision.LEVEL2);

或

user.addPermision(IPermisionGroup.LEVEL1_2_3);

【讨论】:

  • 2010 年在 .NET 中滚动您自己的位掩码。你一定是在开玩笑吧。
  • @eopchwolf:这有什么问题?顺便说一句,不是在 .NET 中,而是在 Java 中。
【解决方案4】:

@tdammers 建议的完整示例:

class enum Permission {
    WRITE, READ, EXECUTE, GROUP, OWNER
}

public class User {
    protected Set<Permission> permissions;

    public User() {
        permissions = new EnumSet<Permission>();
    }

    public boolean hasPermission(Permission p) {
        return permissions.contains(p);
    }

    public void addPermisssion(Permission p) {
        permissions.add(p);
    }

    public void removePermisssion(Permission p) {
        permissions.remove(p);
    }
}

//usage
User u = new User();
u.addPermission(Permission.READ);
System.out.writeln(u.hasPermission(Permission.WRITE));
u.removePermission(Permission.READ);

【讨论】:

    【解决方案5】:

    如果您不知道关键字和语法,您可能想阅读有关 Java 的书籍或在线学习一些教程。但是,一个类可能如下所示:

    public class User {
    
    private final boolean admin, superuser, guest;
    
    public User(boolean admin, boolean superuser, boolean guest) {
        this.admin = admin;
        this.superuser = superuser;
        this.guest = guest;
    }
    
    public boolean isAdmin() {
        return admin;
    }
    
    public boolean isSuperuser() {
        return superuser;
    }
    
    public boolean isGuest() {
        return guest;
    }
    
    // and so on
    }
    

    【讨论】:

      【解决方案6】:

      多态,而不是条件。

      class User {
          final Print print;
          User(Print print) {
              this.print = print;
          }
      }
      
      interface Print {
          void print();
      }
      
      class CanPrint implements Print {
          public void print() { do whatever it takes to print a user }
      }
      
      class CannotPrint implements Print {
          public void print() { throw null; }
      }
      

      【讨论】:

        猜你喜欢
        • 2016-11-10
        • 1970-01-01
        • 2013-05-07
        • 2013-12-04
        • 2020-07-23
        • 1970-01-01
        • 2021-12-15
        • 2010-10-27
        • 1970-01-01
        相关资源
        最近更新 更多