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

Spring Boot JPA——为用户分配角色的合适方式是什么?

颜新
2023-03-14

我正在尝试开发一个应用程序,在这个应用程序中,用户可以被分配一个特定的角色,并且基于这个角色,他们可以访问特定的功能。这就是我目前的情况:

用户类:

@Entity
@Table(name = "users",
    uniqueConstraints = {
      @UniqueConstraint(columnNames = "username"),
      @UniqueConstraint(columnNames = "email")
    })
public class User {
  @Id
  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "usid_generator")
  @SequenceGenerator(name = "usid_generator", initialValue = 1000, allocationSize = 1, sequenceName = "usid_seq")
  private Long id;

  @NotBlank
  @Size(max = 20)
  private String username;

  @NotBlank
  @Size(max = 50)
  @Email
  private String email;

  @NotBlank
  @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
  @Size(max = 120)
  private String password;

  @OneToMany(cascade = CascadeType.ALL,
      fetch = FetchType.LAZY)
  @JoinTable(name = "user_roles",
        joinColumns = @JoinColumn(name = "user_id"),
        inverseJoinColumns = @JoinColumn(name = "role_id"))
  private Set<Role> roles = new HashSet<>();

  private Integer notifications;

角色类别:

@Entity
@Table(name = "roles")
public class Role {
  @Id
  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "roleid_generator")
  @SequenceGenerator(name = "roleid_generator", initialValue = 100, allocationSize = 1, sequenceName = "roleid_seq")
  private Integer id;

  @Enumerated(EnumType.STRING)
  @Column(length = 20)
  private ERole name;

然而,我遇到了一些问题。我的应用程序前端有一些按钮,允许我更改用户角色,下面是一个示例:

@PutMapping("/users/setadmin/{id}")
    @PreAuthorize("hasRole('ADMIN')")
    public ResponseEntity<User> setAdmin(@PathVariable("id") Long id, @RequestBody User user) {
        Optional<User> userData = userRepository.findById(id);
        Optional<Role> adminRole = roleRepository.findByName(ERole.ROLE_ADMIN);
        Set<Role> roles = new HashSet<>();
        roles.add(adminRole.get());
        if (userData.isPresent()) {
            User _user = userData.get();
            _user.setRoles(roles);
            return new ResponseEntity<>(userRepository.save(_user), HttpStatus.OK);
        } else {
            return new ResponseEntity<>(HttpStatus.NOT_FOUND);
        }
    }

ERoles存储在一个单独的类中:

public enum ERole {
  ROLE_USER,
  ROLE_MODERATOR,
  ROLE_ADMIN
}

然而,通过使用这种方法,我得到了两个错误:

  1. 我在整个数据库中似乎不能有三个以上的用户。每次我用另一个用户已经拥有的角色创建一个新用户时,我都会出错。下面是一个例子,当我在数据库中已经有另一个用户具有该角色后,试图将角色USER分配给一个新帐户时,我得到了什么:

java。sql。SQLIntegrityConstraintViolationException:关键“用户”角色的重复条目“1”。UK_5Q4RC4FH1ON 6567QK69UESVYF'

我猜这是级联类型的问题。用户类上的所有属性。我读了一些关于级联类型的文档,但我不知道应该使用哪一种,或者这是否是问题所在。非常感谢您的帮助

共有1个答案

苏鸿志
2023-03-14

@OneTo众多注释表示一个用户可以有多个角色,但一个角色不能与多个用户相关。

试试这个:

User:
@ManyToMany(cascade = CascadeType.ALL)
    private Set<Role> roles = new HashSet<>();

Role:
@ManyToMany(mappedBy = "roles")
private Set<User> users;
 类似资料:
  • 我不是Spring4的新手,但我是SpringSecurity4ACL的新手。我刚刚在我的MVC Web应用程序上实现了Spring Security4,这些应用程序都是后端Web服务。这里贴出了我所做的事情的链接: 这为我的URL增加了安全性,只有具有特定角色的用户才能请求URL。这太棒了!我们以SiteMinder为例,不是传回一个用户名,而是在请求头中传回一个令牌。我们调用OpenAM,传入

  • 我知道还有其他类似的线程,但我不确定它们是否与Postgres相关。 我正在阅读PostgreSQL文档,内容如下: 注意:如第20章所述,PostgreSQL实际上在“角色”方面进行了权限管理。在本章中,我们始终使用数据库用户来表示“具有 LOGIN 特权的角色”。 这是否意味着角色是数据库用户?或者角色和用户之间有区别吗?用户是否有可能不具有完全权限,而角色是始终具有完全权限的用户?

  • 角色决定了员工的管理范围、功能权限,一个员工可以有多个角色。当员工拥有多个角色时,其管理范围、功能权限为多个角色相加。 管理范围 您可设置角色的管理范围,若设置该角色管理范围为部门,则可管理员工与单据;和设置该员工管理范围为项目,则可管理单据。部门支持选择所有部门、所在的部门及所有子部门、指定部门 项目支持选择所有项目、所在的项目及所有子项目、指定项目 功能权限 您可设置角色的功能权限,其中单据、

  • 我正在创建一个约会网站来学习网络开发,我不知道如何制作背景色,它只是在特定的div上不起作用。我应该改变什么?我尝试了很多东西,但什么都没有发生。 添加lorem ipsum所以我可以问这个问题...跳过这个 Lorem ipsum dolor sit amet,concetetur adipiscing elit。Morbi ut felis magna。聪明的人,聪明的人,聪明的人,聪明的人。

  • 您可在添加员工是分配角色,具体请详见【如何导入员工】 除此之外,您可在【角色】页面通过“管理成员”进行角色分配。(主管,初始管理员除外) 分配角色 点击角色右侧“管理成员”按钮(主管、初始超管除外) 您可在此添加或移除角色成员。 设置主管 您可在部门或项目模块进行主管设置,具体请详见【通过部门、项目管理员工】 设置初始管理员 初始管理员为默认角色,为企业唯一,若需修改,请详见【如何移交初始管理员】

  • 问题内容: 名称(和javadocs)暗示这是一个适配器(设计模式)。但我不这么认为-至少一见钟情,它无法使任何事物适应任何事物 发生的唯一变化是,您可以将的实例传递给需要任何一个接口的任何方法。因此,您可以使用仅预期的实例。但是没有“翻译”发生。而且它不符合GoF的UML-在“类适配器”版本中,期望对一个方法的调用会从适配器中调用一个方法。 那么,这是一个适配器(设计模式),还是仅仅是一个引起混