Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 允许用户删除他在spring boot中创建的实体_Java_Spring Boot_Spring Security - Fatal编程技术网

Java 允许用户删除他在spring boot中创建的实体

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

在spring boot controller类中,我可以向以下方法添加什么样的最佳方法,以允许用户删除他创建的餐厅

我不想将用户id添加到路径中,我希望登录的用户不允许删除他未创建的餐厅

注意,我扩展了Auditable,将createdBy添加到数据库mysql中

    @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找到一种方法,可以处理任何情况。但感谢您的努力回答我!