我想构建一个简单的ORM /数据库权限系统,其中包含用户,组和权限:
这个想法是每个用户可以在每个组中拥有不同的权限。
我的实体应该如何,以便我可以查询事物
我正在使用Java 6和JPA2注释以及EclipseLink。
答案 0 :(得分:1)
我在想
用户表 组表 User_is_in_group链接表
权利表。 User_in_group_has_Rights表。
然后将所有链接映射到JPA中的相关字段。
我可以做更多细节,但也许这足以让您创建实体,因为它还取决于您想要的字段。
答案 1 :(得分:1)
我想你可能想看一下应用服务器社区已经提供的实现。通常来说,您所描述的是基于表单的身份验证的定义。
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是一个(命名不佳的)枚举类型,存储在我的“角色”实体中:
@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”,那么有很多很好的文档。
对于一个团体?一个组听起来像是我的角色集合 - 因此将查询修改为第三个表格或仅提供枚举不是一个延伸。
(在阅读之后,唯一的澄清是我的角色存储在包含角色的字符串值的枚举中,因此roles.getValue()返回一个类似“administrators”的字符串。
答案 2 :(得分:0)
以下是三个表(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;
}
}