Как использовать JPA с простой системой разрешений с пользователями, группами и правами? - PullRequest
0 голосов
/ 01 сентября 2011

Я хотел бы создать простую систему разрешений ORM / базы данных, в которой у меня есть пользователи, группы и права:

  • Каждый пользователь может быть членом нескольких групп, в каждой группе может быть несколько пользователей.
  • Каждое отношение между пользователем и группой имеет дополнительную информацию: права.

Идея состоит в том, что каждый пользователь может иметь разные права в каждой группе.

Как должны выглядеть мои сущности, чтобы я мог запрашивать вещи

  • из «вида группы», как «извлечь всех членов этой группы»
  • и "представление пользователя", как "получить все группы, членом которых является этот пользователь"
  • а также «какие права имеет данный пользователь и эта группа?»

Я использую Java 6 с аннотациями JPA2 и EclipseLink.

Ответы [ 3 ]

1 голос
/ 01 сентября 2011

Думаю, вы захотите взглянуть на реализации, уже предоставленные сообществом серверов приложений.Как правило, вы описали определение аутентификации на основе форм.

http://tomcat.apache.org/tomcat-5.5-doc/config/realm.html

В сущности, отношения таковы:

    User
      + Role[]

После настройки это позволяет использовать такие инфраструктуры, как JSF (но вы заметите, что я получаю доступ кTomcat сессия здесь), чтобы запросить конкретную роль.Приведенный ниже код взят из базовой схемы аутентификации на основе форм, которую я использую в небольшом веб-приложении, и она крайне нуждается в рефакторинге, у меня только что были более высокие приоритеты

public boolean isUserInRole(Roles role)
  {
    return FacesContext.getCurrentInstance().getExternalContext().isUserInRole(role.getRoleValue()); 
  }

В этом случаеRoles - это тип перечисления (со слабым именем), который хранится в моей сущности «Role»:

@Entity
@Table(name = "role", uniqueConstraints = @UniqueConstraint(columnNames = { "user_user", "role" }))
public class Role implements Serializable
{
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @ManyToOne(targetEntity = User.class, fetch = FetchType.LAZY)
    private User user;
    private String role;

    public Long getId()
    {
        return id;
    }

    public void setId(Long id)
    {
        this.id = id;
    }

    public User getUser()
    {
        return user;
    }

    public void setUser(User user)
    {
        this.user = user;
    }

    public String getRole()
    {
        return role;
    }

    public void setRole(String role)
    {
        this.role = role;
    }
}

В результате создаются таблицы (как я указал поля), поэтому я могу предоставить SQL-запрос дляКонфигурация и создать царство.Есть много хорошей документации по этому вопросу, если вы Google "j_security_check".

Что касается группы?Для меня группа звучит как набор ролей - поэтому не сложно перестроить запрос в третью таблицу или просто предоставить перечисление.

(после прочтения этого единственное разъяснение состоит в том, чтомои роли хранятся в enum, который содержит строковое значение роли, поэтому role.getValue () возвращает строку, подобную «administrator».

1 голос
/ 01 сентября 2011

Я думаю

A Таблица пользователей A Таблица групп A Таблица ссылок User_is_in_group

A Таблица прав.Таблица User_in_group_has_Rights.

Затем сопоставьте все ссылки с соответствующими полями в JPA.

Я могу сделать более подробную информацию, но, возможно, этого достаточно для создания ваших сущностей, так как это также будетзависит от того, какие поля вы хотите.

0 голосов
/ 17 июня 2017

Вот пример с тремя таблицами (user, group и user_group):

@Entity
@Table(name="user")
public class User implements Serializable{

    private static final long serialVersionUID = 1L;

    private Long id;
    private String name;
    private String email;
    private String password;
    private List<Grupo> groups; //-> a lot of rules and permissions

    public Usuario(){
    }

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @Column
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Column
    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Column
    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    /** Here is the third table **/
    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name="user_group", joinColumns = @JoinColumn(name="user_id"),
                              inverseJoinColumns = @JoinColumn(name="group_id"))
    public List<Grupo> getGroups() {
        return groups;
    }

    public void setGroups(List<Grupo> groups) {
        this.groups = groups;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((id == null) ? 0 : id.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Usuario other = (Usuario) obj;
        if (id == null) {
            if (other.id != null)
                return false;
        } else if (!id.equals(other.id))
            return false;
        return true;
    }

}

//////////////////////

@Entity
@Table(name="group")
public class Group {

    private Long id;
    private String name;
    private String description;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((id == null) ? 0 : id.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Grupo other = (Grupo) obj;
        if (id == null) {
            if (other.id != null)
                return false;
        } else if (!id.equals(other.id))
            return false;
        return true;
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...