为了账号安全,请及时绑定邮箱和手机立即绑定

如何从一组角色中只获得一个角色

如何从一组角色中只获得一个角色

梵蒂冈之花 2022-10-07 16:32:44
我正在尝试实现一个简单的弹簧安全项目,基本上我有用户和角色实体。我有一组角色“管理员”和“用户”。现在我只想分配“用户”角色以及创建一个新用户。我曾尝试使用具有相同问题的列表和集合。用户实体有 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    role1          ADMIN2          USER
查看完整描述

3 回答

?
紫衣仙女

TA贡献1839条经验 获得超15个赞

构造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);


查看完整回答
反对 回复 2022-10-07
?
波斯汪

TA贡献1811条经验 获得超4个赞

控制器代码:


@PostMapping("/do_register")

public String registration(@ModelAttribute("user") User user, Model model) 

{       

    user.setRoles(new HashSet<>(roleRepository.findByName("USER")));

    user.setEnabled(true);

    user.setPassword(passwordEncoder.encode(user.getPassword()));

    userRepository.save(user);

    return "signup";

角色存储库代码:


public interface RoleRepository extends JpaRepository<Role, Integer>

{

    public Set<Role> findByName(String USER);

它对我来说工作得很好,因为我也有同样的问题。


查看完整回答
反对 回复 2022-10-07
?
aluckdog

TA贡献1847条经验 获得超7个赞

如果您使用的是 Spring Data 存储库,那么一个问题是您选择的查询名称/参数类型与您的实体不匹配。没有名为“ID”的字段,类型roleString,不是int

您最好的选择是让您的存储库方法签名

Role findByRole(String roleName);

您还应该更改Role对象中 ID 的名称和数据类型 - 按照约定,Java 使用 camelCase,而不是 snake_case,虽然对于可能保持较小的 ROLE 之类的表来说,int 可能很好,但在一般情况下,您会想要给你更大的键空间long。在您的对象中为您的 id 提供一致的数据类型也更好 - 它使您不必考虑“等等,这是一个 int 还是 long?”。应该是private long roleId;


查看完整回答
反对 回复 2022-10-07
  • 3 回答
  • 0 关注
  • 86 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信