首页 > 解决方案 > 在 Spring Boot 中基于角色创建用户

问题描述

我有三个实体用户、机构和角色。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 正文中的任何内容

但是希望如果用户是银行管理员,他只能创建银行支持和银行服务,我试图创建一个只能创建具有这两个特定角色的用户的新 API。然后限制银行管理员访问可以创建任何类型用户的其他 API。

有没有其他方法可以做到这一点,如果没有,我该怎么做......

标签: javamysqlspring-bootapi

解决方案


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

就像根据登录人一样,您将获得该登录人角色,并根据您的标准进行验证,例如检查他尝试添加的实体是否有资格创建它。

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) && roleUserAccessMap.get(loginPersonRole).contains(newuserrole) ){
            //proceed ahead with Add api
        }else{
            System.out.println("You do not have enough privileage to create Use");
        }

这将对您有所帮助。


推荐阅读