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

基于角色的spring boot用户创建

慕容灿
2023-03-14

我有三个实体用户,机构和角色。1)用户和机构之间的一对多2)用户和角色之间的多对多

-------用户--------

@Entity
@Table(name = "user")
public class User {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="user_Id")
    private int userId;
    @Column(name="name")
    private String name;
    @Column(name="lastname")
    private String lastname;
    @Column(name="email")
    private String email;
    @Column(name="password")
    private String password;
    @Column(name="isActive")
    private boolean isActive;
    @Column(name="lastActive")
    private String lastActive;
    @Column(name="createdDate")
    private String createdDate;
    @Column(name="isBlocked")
    private boolean isBlocked;
    
    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    @JoinColumn(name = "institution_id", nullable = false)
    @JsonIgnoreProperties(value = {"user"})
    private Institution institution;
    
    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "user_has_role",
            joinColumns = {
                    @JoinColumn(name = "user_id", referencedColumnName = "user_id",
                            nullable = false, updatable = true)},
            inverseJoinColumns = {
                    @JoinColumn(name = "role_id", referencedColumnName = "role_id",
                            nullable = false, updatable = true)})
    @JsonIgnoreProperties(value = {"users"})
    private Set<Role> roles = new HashSet<>();

}

-------机构-------

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString

@Entity
@Table(name = "institution")
public class Institution {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="institution_Id")
    private int institutionId;
    @Column(name="name")
    private String name;
    @Column(name="type")
    private String type;
    @Column(name="location")
    private String location;
    @OneToMany(mappedBy = "institution", fetch = FetchType.LAZY)
    @JsonIgnoreProperties(value = {"institution" , "user"})
    private Set<User> user;
    }

-------角色-------

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString

@Entity
@Table(name = "role")
public class Role {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="role_Id")
    private int roleId;
    @Column(name="name")
    private String name;
    @Column(name="description")
    private String description;
    @ManyToMany(mappedBy = "roles", fetch = FetchType.LAZY)
    @JsonIgnoreProperties(value = {"roles"})
    private Set<User> users = new HashSet<>();

}

这是我在MySql中的3个实体和表我有7个角色•超级用户•银行管理•银行支持•银行服务•商户管理•商户支持•商户服务

超级用户可以创建任意角色的用户

@PostMapping("/addUser")
    public String addUser(@RequestBody User user) {
        String rawpassword = user.getPassword();
        String encodedpasswrod = passwordencoder.encode(rawpassword);
        user.setPassword(encodedpasswrod);
        userrepository.save(user);
        return "user saved with name: " + user.getName();
    }

这个api可以工作,我可以将角色设置为api json主体中的任何内容

但是希望如果用户是Bank-Admin,他只能创建Bank-Support和Bank-Service,我试图创建一个新的API,它只能创建一个具有这两个特定角色的用户。然后限制bank admin访问其他可以创建任何类型用户的API。

有没有其他的方法,如果没有,我该怎么做。。。

共有1个答案

周涵畅
2023-03-14

您必须实现用户权限的自定义实现。

就像根据login person一样,您将获得那个login person角色,并且根据您的标准,只需进行验证,比如检查他试图添加的实体是否有资格创建它。

Map<String, List<String>> roleUserAccessMap = new HashMap<>();
roleUserAccessMap.put("Bank-Admin", Arrays.asList("Bank-Support", "Bank-Service"));

就像下面那样检查一下

        String loginPersonRole="Bank-Admin"; //This value should get from logged-in person context
        if(roleUserAccessMap.containsKey(loginPersonRole)){
            //proceed ahead with Add api
        }else{
            System.out.println("You do not have enough privileage to create Use");
        }

这会帮到你的。

 类似资料:
  • 我是oAuth2安全系统的新手。关于访问REST资源的基于用户角色的授权,我有一个问题。我的互联网冲浪提供了关于oauth2的身份验证部分的输入。 让我提供给你困扰我的情况。

  • 我有一个具有多个角色(ROLE1、ROLE2)的安全springboot应用程序。一个用户同时具有两个角色,而另一个用户只有一个角色。在成功登录用户被发送到登陆页面,在那里我想禁用元素,如果用户只有一个角色。 我试过用thymeleaf-extras-springsecurity3,但没有成功。这是我的代码: pom.xml 任何帮助都将不胜感激!谢谢!

  • 我用各种各样的产品建立了Woocommerce。 这些产品在一个属性上都有可能值为1kg、2kg和5kg的变化。 我还创建了一个“Aziende”用户组。我想一些产品的变化,只显示“阿齐恩德”的客户。我不想让其他客户看到这些变化。 例如:Aziende客户可以看到选项“1kg、2kg、5kg”,而其他客户角色只能看到1kg选项。 这在WooCommerce中可能吗?

  • 因此,在我们的Laravel应用程序中有两个角色(internet客户端和管理员)。下面是DB模式 我们想允许www.site。com/登录路径,仅记录具有“客户端”角色的用户。 请注意,一旦用户登录并强制注销,我们不想检查角色。 谢谢

  • 有没有更好的方法来实现这种设置(类似于组织设置,一个人可以属于几个组织并管理其中的一些/所有组织,而不必有几个帐户)? 我用的是Keycloak 4.6

  • 我有多个角色用于用户登录,如果一个用户只有一个角色,我已经成功实现了,但问题是如果一个用户有多个角色,那么我如何实现这一点。 感谢并问候普拉巴特·潘伟迪。

  • 情景: 我们有一个多租户应用程序,其中每个租户都有自己的模式。有一个公共模式,其中存在一个包含每个租户记录的表。因此,有一个超级管理员可以创建租户,并将管理员分配给新创建的租户。 为了实现RBAC(基于角色的访问控制),我计划将每个角色表放入租户模式,并实现一些中间件来检查授权。在孤立的模式环境中,这是一个好的体系结构吗?

  • 本文展示了如何根据不同的用户角色,在登录之后来重定向到不同的页面。 在 method-security项目的基础上,我们构建了一个role-base-login项目。 build.gradle 修改 build.gradle 文件,让我们的role-base-login项目成为一个新的项目。 修改内容也比较简单,修改项目名称及版本即可。 jar { baseName = 'role-bas