Java 允许用户删除他在spring boot中创建的实体
在spring boot controller类中,我可以向以下方法添加什么样的最佳方法,以允许用户删除他创建的餐厅 我不想将用户id添加到路径中,我希望登录的用户不允许删除他未创建的餐厅 注意,我扩展了Auditable,将createdBy添加到数据库mysql中Java 允许用户删除他在spring boot中创建的实体,java,spring-boot,spring-security,Java,Spring Boot,Spring Security,在spring boot controller类中,我可以向以下方法添加什么样的最佳方法,以允许用户删除他创建的餐厅 我不想将用户id添加到路径中,我希望登录的用户不允许删除他未创建的餐厅 注意,我扩展了Auditable,将createdBy添加到数据库mysql中 @DeleteMapping("/restaurant/{restaurantId}") public String deleteRestaurantById(@PathVariable(&qu
@DeleteMapping("/restaurant/{restaurantId}")
public String deleteRestaurantById(@PathVariable("restaurantId") Long restaurantId) {
if(restaurantService.existsById(id) == false){
logger.info("Error occurred because this restaurant is not found!");
throw new InternalServerErrorException("There is no restaurant with this id");
}
restaurantService.deleteById(id);
return "deleted";
}
java餐厅
@Entity
@NoArgsConstructor
@RequiredArgsConstructor
@Getter
@Setter
@ToString
public class Restaurant extends Auditable{
@Id
@GeneratedValue
private long id;
@NonNull
@NotEmpty(message = "The restaurant must have a name")
private String name;
....
}
User.java
@Entity
@RequiredArgsConstructor
@Getter
@Setter
@ToString
@NoArgsConstructor
@PasswordMatch
public class User implements UserDetails {
@Id @GeneratedValue
private Long id;
@NonNull
@Size(min = 8, max = 20)
@Column(nullable = false, unique = true)
private String email;
@NonNull
@Column(length = 100)
private String password;
@Transient
@NotEmpty(message = "Please enter Password Confirmation.")
private String confirmPassword;
@NonNull
@Column(nullable = false)
private boolean enabled;
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(
name = "users_roles",
joinColumns = @JoinColumn(name = "user_id",referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "role_id",referencedColumnName = "id")
)
private Set<Role> roles = new HashSet<>();
@NonNull
@NotEmpty(message = "You must enter First Name.")
private String firstName;
@NonNull
@NotEmpty(message = "You must enter Last Name.")
private String lastName;
@Transient
@Setter(AccessLevel.NONE)
private String fullName;
@NonNull
@NotEmpty(message = "Please enter alias.")
@Column(nullable = false, unique = true)
private String alias;
private String activationCode;
public String getFullName() {
return firstName + " " + lastName;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return roles.stream().map(role -> new SimpleGrantedAuthority(role.getName())).collect(Collectors.toList());
}
public void addRole(Role role) {
roles.add(role);
}
public void addRoles(Set<Role> roles) {
roles.forEach(this::addRole);
}
@Override
public String getUsername() {
return email;
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return enabled;
}
}
@实体
@所需参数构造函数
@吸气剂
@塞特
@托斯特林
@诺尔格构装师
@密码匹配
公共类用户实现UserDetails{
@Id@GeneratedValue
私人长id;
@非空
@尺寸(最小值为8,最大值为20)
@列(nullable=false,unique=true)
私人字符串电子邮件;
@非空
@列(长度=100)
私有字符串密码;
@短暂的
@NotEmpty(message=“请输入密码确认”)
私有字符串确认密码;
@非空
@列(nullable=false)
启用私有布尔值;
@ManyToMany(fetch=FetchType.EAGER)
@可接合(
name=“用户\角色”,
joinColumns=@JoinColumn(name=“user\u id”,referencedColumnName=“id”),
inverseJoinColumns=@JoinColumn(name=“role\u id”,referencedColumnName=“id”)
)
私有集角色=新HashSet();
@非空
@NotEmpty(message=“您必须输入名字。”)
私有字符串名;
@非空
@NotEmpty(message=“您必须输入姓氏。”)
私有字符串lastName;
@短暂的
@Setter(AccessLevel.NONE)
私有字符串全名;
@非空
@NotEmpty(message=“请输入别名”)
@列(nullable=false,unique=true)
私有字符串别名;
私有字符串激活码;
公共字符串getFullName(){
返回firstName+“”+lastName;
}
@凌驾
public Collection如果用户能够创建唯一的餐厅,则可以使用联接表在用户和餐厅之间实现一对一关系。spring security不可能神奇地知道用户创建了哪些餐厅
用户和餐厅之间必须存在某种形式的关系。
如前所述,您可以在创建的餐厅和创建它们的用户之间建立关系
或者,您可以在餐厅实体中创建一个名为的列,然后将用户id
存储在该列中。这样,当您获取餐厅时,您可以使用主体中的id
来过滤所述用户创建的餐厅
但是,期待spring security为您解决这一问题是不可能的。不,我不想这样做。我想用spring security找到一种方法,可以处理任何情况。但感谢您的努力回答我!