Java 如何将JPA与用户、组和权限的简单权限系统一起使用?
我想构建一个简单的ORM/数据库权限系统,其中我有用户、组和权限:Java 如何将JPA与用户、组和权限的简单权限系统一起使用?,java,jquery,database,jpa,annotations,Java,Jquery,Database,Jpa,Annotations,我想构建一个简单的ORM/数据库权限系统,其中我有用户、组和权限: 每个用户可以是多个组的成员,每个组可以有多个用户作为成员 用户和组之间的每个关系都有一条附加信息:权限 其思想是,每个用户可以在每个组中拥有不同的权限 我的实体应该是什么样子的,这样我就可以查询东西了 从“组视图”中,如“检索此组的所有成员” “用户视图”如“检索此用户所属的所有组” 以及“给定此用户和此组,用户拥有哪些权限” 我正在使用带有JPA2注释和EclipseLink的Java6 用户表 分组桌 用户\u是\u
- 每个用户可以是多个组的成员,每个组可以有多个用户作为成员
- 用户和组之间的每个关系都有一条附加信息:权限
- 从“组视图”中,如“检索此组的所有成员”
- “用户视图”如“检索此用户所属的所有组”
- 以及“给定此用户和此组,用户拥有哪些权限”
我可以做更多的细节,但这可能足以让您创建实体,因为这还取决于您想要的字段。我想您可能需要查看应用服务器社区已经提供的实现。通常来说,您描述的是基于表单的身份验证的定义 基本上,这种关系是:
User
+ Role[]
一旦配置好,这就允许像JSF这样的框架(但是你会注意到我在这里访问Tomcat会话)查询特定的角色。下面的代码取自我在一个小型web应用程序上使用的一个基本的基于表单的身份验证方案,它急需重构,我只是有更高的优先级
public boolean isUserInRole(Roles role)
{
return FacesContext.getCurrentInstance().getExternalContext().isUserInRole(role.getRoleValue());
}
在本例中,角色是存储在我的“角色”实体中的(名称不正确)枚举类型:
这最终会创建表(如我指定的字段),以便我可以向配置提供SQL查询并创建一个领域。如果你在谷歌上搜索“j_security_check”,有很多关于这个的好文档
作为一个群体?对我来说,组听起来像是角色的集合——因此,将查询修改为第三个表或仅仅提供一个枚举并不是一件费力的事
(阅读本文后,唯一需要澄清的是我的角色存储在包含角色字符串值的枚举中,因此roles.getValue()返回类似“administrators”的字符串。下面是一个包含三个表(用户、组和用户组)的示例:
@实体
@表(name=“user”)
公共类用户实现可序列化{
私有静态最终长serialVersionUID=1L;
私人长id;
私有字符串名称;
私人字符串电子邮件;
私有字符串密码;
私有列表组;//->许多规则和权限
公共用益{
}
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
公共长getId(){
返回id;
}
公共无效集合id(长id){
this.id=id;
}
@纵队
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
@纵队
公共字符串getEmail(){
回复邮件;
}
公用电子邮件(字符串电子邮件){
this.email=电子邮件;
}
@纵队
公共字符串getPassword(){
返回密码;
}
public void setPassword(字符串密码){
this.password=密码;
}
/**这是第三张桌子**/
@多个(级联=级联类型.ALL)
@JoinTable(name=“user\u group”,joinColumns=@JoinColumn(name=“user\u id”),
inverseJoinColumns=@JoinColumn(name=“group\u id”))
公共列表getGroups(){
返回组;
}
公共void集合组(列表组){
这个组=组;
}
@凌驾
公共int hashCode(){
最终整数素数=31;
int结果=1;
result=prime*result+((id==null)?0:id.hashCode();
返回结果;
}
@凌驾
公共布尔等于(对象obj){
if(this==obj)
返回true;
if(obj==null)
返回false;
如果(getClass()!=obj.getClass())
返回false;
Usuario其他=(Usuario)obj;
if(id==null){
if(other.id!=null)
返回false;
}如果(!id.equals(other.id))
返回false;
返回true;
}
}
//////////////////////
@实体
@表(name=“group”)
公共课组{
私人长id;
私有字符串名称;
私有字符串描述;
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
公共长getId(){
返回id;
}
公共无效集合id(长id){
this.id=id;
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
公共字符串getDescription(){
返回说明;
}
公共void集合描述(字符串描述){
this.description=描述;
}
@凌驾
公共int hashCode(){
最终整数素数=31;
int结果=1;
result=prime*result+((id==null)?0:id.hashCode();
返回结果;
}
@凌驾
公共布尔等于(对象obj){
if(this==obj)
返回true;
if(obj==null)
返回false;
如果(getClass()!=obj.getClass())
返回false;
Grupo其他=(Grupo)obj;
if(id==null){
if(other.id!=null)
返回false;
}如果(!id.equals(other.id))
返回false;
返回true;
}
}
是的,我想知道更多细节。表格:用户{id,名称}组{id,名称}权限{id,名称}连接表格:用户{u在组{User\u id,组{u id}//仅在将用户添加到组时创建的行用户{u在组}中拥有{Rights\u id,用户{u在组}//仅在分配时创建的行
@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;
}
}
@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;
}
}