当前位置: 首页 > 知识库问答 >
问题:

spring JPA用户、角色身份验证-如何避免重复的角色条目?

鞠自明
2023-03-14
import java.util.Set;

import javax.persistence.*;

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    private String email;

    private String password;

    public long getId() {
        return id;
    }

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

    public String getEmail() {
        return email;
    }

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

    public String getPassword() {
        return password;
    }

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

    public Set<Role> getRoles() {
        return roles;
    }

    public void setRoles(Set<Role> roles) {
        this.roles = roles;
    }

    @ManyToMany(fetch = FetchType.EAGER,cascade = CascadeType.ALL)
    @JoinTable(joinColumns = @JoinColumn(name = "id"),inverseJoinColumns = @JoinColumn(name = "roleId"))
    private Set<Role> roles;

    public User(String email, String password, Set<Role> roles) {
        super();
        this.email = email;
        this.password = password;
        this.roles = roles;
    }

}

角色

 import java.util.Set;

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;

@Entity
public class Role {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    private String role;

    @ManyToMany(mappedBy = "roles",fetch = FetchType.LAZY)
    private Set<User> users;

    public Role(String role) {
        super();
        this.role = role;
    }

    public long getId() {
        return id;
    }

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

    public String getRole() {
        return role;
    }

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

    public Set<User> getUsers() {
        return users;
    }

    public void setUser(Set<User> users) {
        this.users = users;
    }



}

共有1个答案

潘学民
2023-03-14

manytomany是正确的逻辑关系类型。获得太多角色的原因可能是创建了Role的新实例,但如果数据库中已经存在该角色,则必须将其加载到持久性上下文中,只有在不存在时才创建新角色。

如果您用代码管理事务,那么它将如下所示,如果您使用@transactional的容器管理持久性,则应该删除事务代码和try-finally块。

try {
    List<String> roleNames = Lists.newArrayList("user, admin, superuser");
    User user = new User("Peter", "Pan");
    List<Role> roles = new ArrayList<>();
    entityManager.getTransaction().begin();
    for (String roleName : roleNames) {
        List<Role> found = entityManager.createQuery("select r from Roles r where r.name = :roleName", Role.class)
                .setParameter("roleName", roleName).getResultList();
        if (found.isEmpty()) {
            Role role = new Role(roleName);
            entityManager.persist(role);
            roles.add(role);
        } else {
            roles.addAll(found);
        }
    }
    user.setRoles(roles);
    entityManager.persist(user);
    entityManager.getTransaction().commit();
} finally {
    entityManager.close();
}

就我个人而言,我几乎从不使用JPA的manytomany,我通常将其分解为2个onetomany关系,这样我就有了映射表的一个实体,而映射表是由JPA神奇地创建的。这还为您提供了额外的控制,例如,如果您需要修改或删除用户的角色,您可以直接删除UserRoleMapping实体,而不必在role和user上操作列表。它也给你更多的控制级联。

 类似资料:
  • 我在学Spring保安。 在浏览了一些教程之后,我发现其中一些使用了UserRole,而一些使用了一个实现身份验证的UserAuthentication类。我尝试实现的一个(并起作用)是创建一个自定义的MyUserDetailsService,它实现UserDetailsService,并授予权限(角色?)像这样: 我想知道用户角色和GrantedAuthorities之间有什么区别(例如,当使用

  • 我正在尝试在 Swift 中创建一个 iOS 应用程序,该应用程序使用 AWS Lambda 使用以下身份验证服务 - https://github.com/danilop/LambdAuth 它使用适用于 iOS 的 AWS 移动开发工具包与迪纳摩数据库和 Lambda 进行通信 - http://docs.aws.amazon.com/mobile/sdkforios/developergui

  • 我试图为AWS实现“开发人员身份验证身份”,如下所示:https://AWS.amazon.com/blogs/mobile/amazon-cognito-innecling-developer-authenticated-identities/ 我很好地理解了基本流程。 我怎样才能做到这一点?

  • 我与拉雷维尔和托拉斯合作,基础工作很好。我确实有一个问题似乎不是随包而来的。我想要的是,当我执行时,如果他们登录,它也会返回他们的角色。目前我知道我可以做

  • 我已经通过 RMI 实现了用于 JMX 身份验证的 ,但是我不确定如何创建角色以允许只读/读写访问级别。例如,在中,我有我的自定义身份验证逻辑,并希望它来确定访问角色。我已经尝试了以下内容,但在JConsole中执行操作时没有区别: 然后我创建了一个访问文件,,包含 和< code > JMX . management . properties ,其中包含< code > com . sun .

  • 我正在研究使用JWT身份验证的Spring Security实现。我不确定如何检查用户角色并在方法级别获得经过身份验证的用户。我在网上看到这个例子: 我需要从JWT令牌中提取用户类型吗?还有其他方法可以实现吗?在我看来,仅使用是不完整的。 看起来这段代码是用来获得用户如果使用会话类型,我得到NPE。你知道对于JWT我如何才能成为用户吗? Github完整来源:https://Github.com/