java - 在 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。
有没有其他方法可以做到这一点,如果没有,我该怎么做......
解决方案
您必须实现用户权利的自定义实现。
就像根据登录人一样,您将获得该登录人角色,并根据您的标准进行验证,例如检查他尝试添加的实体是否有资格创建它。
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");
}
这将对您有所帮助。
推荐阅读
- tensorrt - 如何在 TensorRT 上使用多个输入网络进行推理?
- angular - 如何包含弹性布局?
- nginx - NGINX 位置块中应该包含哪些内容才能仅引用主页?
- android - Flutter:如何在`showDatePicker`中禁用过去的日期?
- java - java - 如何在java中使用正则表达式拆分具有[]的复杂字符串?
- python - 导入 Flask 时遇到问题
- android - 网络关闭时 Webview 失败
- c++ - 使用前向声明类中的枚举
- sql - 递归 cte 查询是否可以进行分支修剪
- python-3.x - 我是 python 新手,我想从文本文件中导入值和参数并将其传递给我的函数。我该怎么做?