我想构建一个简单的 ORM/数据库权限系统,其中我有用户、组和权限:
- 每个用户可以是多个群组的成员,每个群组可以有多个用户作为成员。
- 用户和群组之间的每个关系都有一条附加信息:权限。
这个想法是每个用户在每个组中可以拥有不同的权限。
我的实体应该是什么样子,以便我可以查询事物
- 从“群组 View ”,例如“检索该群组的所有成员”
- 以及“用户 View ”,例如“检索该用户所属的所有群组”
- 以及“给定该用户和该组,该用户拥有哪些权限”?
我使用带有 JPA2 注释和 EclipseLink 的 Java 6。
最佳答案
我认为您可能想查看应用程序服务器社区已经提供的实现。一般来说,您所描述的是基于表单的身份验证的定义。
http://tomcat.apache.org/tomcat-5.5-doc/config/realm.html
基本上来说,关系是:
User
+ Role[]
配置完成后,它允许 JSF 等框架(但您会注意到我正在此处访问 Tomcat session )查询特定角色。下面的代码取 self 在一个小型网络应用程序上的基于表单的基本身份验证方案,它迫切需要重构,我只是有更高的优先级
public boolean isUserInRole(Roles role)
{
return FacesContext.getCurrentInstance().getExternalContext().isUserInRole(role.getRoleValue());
}
在本例中,角色是一个(命名不佳的)枚举类型,存储在我的“角色”实体中:
@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”的字符串。
关于java - 如何使用带有用户、组和权限的简单权限系统的 JPA?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7271833/