首页 > 解决方案 > 如何从一组角色中只获得一个角色

问题描述

我正在尝试实现一个简单的弹簧安全项目,基本上我有用户和角色实体。我有一组角色“管理员”和“用户”。

现在我只想分配“用户”角色以及创建一个新用户。

我曾尝试使用具有相同问题的列表和集合。

用户实体有 Set<Role>

public class User {

    @Id
    @Column(name = "user_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int user_id;

    @NotNull
    @Column(name = "user_name", unique = true)
    private String userName;

    @NotNull
    @Column(name = "first_name")
    private String firstName;

    @NotNull
    @Column(name = "last_name")
    private String lastName;

    @Column(name = "roles")
    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))
    private Set<Role> roles;}

和角色实体:

public class Role {

    }
    @Id
    private int role_id;
    private String role;

}

这是将用户保存到我的数据库的 saveMyUser 方法。当我使用:

public void saveMyUser(User user) {
    Set<Role> hash_Set = new HashSet<Role>();
    user.setPassword(encoder().encode(user.getPassword()));
        user.setRoles(new HashSet<>(roleRepository.findAll())); <--- Here
        userRepository.save(user);
    }

user.setRoles(new HashSet<>(roleRepository.findAll()));将所有角色分配给用户,因为我只想为新用户分配“USER”角色。

我试过了user.setRoles(new HashSet<>(roleRepository.findByRole(2)));,也试过user.setRoles(new HashSet<>(roleRepository.findByID(2)));这个错误:无法推断 HashSet<> 的类型参数。

我的数据库中的角色表:

role_id    role
1          ADMIN
2          USER

标签: javaspring-boot

解决方案


构造HashSet函数接受一个Collection,而不是单个元素。这一行:

user.setRoles(new HashSet<>(roleRepository.findAll()));

使用您的所有角色创建一个新的 HashSet。这条线

user.setRoles(new HashSet<>(roleRepository.findByRole(2)));

尝试在构造函数中使用单个元素创建一个新的 HashSet,这将不起作用,因为 Role 不是 Collection 的实例。

只需获取您的角色,创建一个 HashSet,添加角色,然后设置用户的角色:

Role role = roleRepository.findByRole(2);
Set<Role> roles = new HashSet<>();
roles.add(role);
user.setRoles(roles);

推荐阅读