Как я могу лучше представлять разрешения пользователей? - PullRequest
5 голосов
/ 03 августа 2010

В моей системе у меня есть один класс с нагрузкой (20?) final booleans, определяющий разрешения, которые имеет этот тип пользователя.

Какой лучший способ сделать это?

Я уверен, что есть много примеров по этому поводу, но я не знаю ключевых слов.

Ответы [ 6 ]

12 голосов
/ 03 августа 2010

Вы можете воспользоваться перечислениями, например:

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);
8 голосов
/ 03 августа 2010

Создайте класс Permission и дайте каждому User набор из них.Если разрешение находится в коллекции разрешений пользователя, то у пользователя есть разрешение, в противном случае - нет.

5 голосов
/ 03 августа 2010

Вы можете использовать маску для этого

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);
4 голосов
/ 03 августа 2010

Полный пример того, что предложил @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);
0 голосов
/ 03 августа 2010

Полиморфизм, а не условия.

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; }
}
0 голосов
/ 03 августа 2010

Если вы не знаете ключевых слов и синтаксиса, вы можете прочитать книгу о 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...