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

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


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


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


用户实体有 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


梵蒂冈之花
浏览 88回答 3
3回答

紫衣仙女

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

波斯汪

控制器代码:@PostMapping("/do_register")public String registration(@ModelAttribute("user") User user, Model model)&nbsp;{&nbsp; &nbsp; &nbsp; &nbsp;&nbsp; &nbsp; user.setRoles(new HashSet<>(roleRepository.findByName("USER")));&nbsp; &nbsp; user.setEnabled(true);&nbsp; &nbsp; user.setPassword(passwordEncoder.encode(user.getPassword()));&nbsp; &nbsp; userRepository.save(user);&nbsp; &nbsp; return "signup";}&nbsp;角色存储库代码:public interface RoleRepository extends JpaRepository<Role, Integer>{&nbsp; &nbsp; public Set<Role> findByName(String USER);}&nbsp;它对我来说工作得很好,因为我也有同样的问题。

aluckdog

如果您使用的是 Spring Data 存储库,那么一个问题是您选择的查询名称/参数类型与您的实体不匹配。没有名为“ID”的字段,类型role是String,不是int。您最好的选择是让您的存储库方法签名Role&nbsp;findByRole(String&nbsp;roleName);您还应该更改Role对象中 ID 的名称和数据类型 - 按照约定,Java 使用 camelCase,而不是 snake_case,虽然对于可能保持较小的 ROLE 之类的表来说,int 可能很好,但在一般情况下,您会想要给你更大的键空间long。在您的对象中为您的 id 提供一致的数据类型也更好 - 它使您不必考虑“等等,这是一个 int 还是 long?”。应该是private long roleId;。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java