如何根据用户访问权限从数据库中过滤记录

时间:2019-11-12 10:02:15

标签: java mysql spring-boot jpa jpql

我正在为事件管理应用程序构建REST服务。 这个想法是,每个用户只能在Feed上看到他被邀请参加的事件和他创建的事件。一个条件是每个用户都有多封电子邮件。 为特定(已认证)用户(通过JpaRepository)检索事件的最佳方法是什么?

我想到的一种可能的解决方案是进行如下查询,其中:auth_email和:auth_id是已验证用户的电子邮件和ID。

SELECT e.* FROM events e 
  WHERE e.user_id = :auth_id OR
  EXISTS (
    SELECT id FROM invitations 
      WHERE (e.id = invitations.event_id) AND
       (
        invitations.email = :auth_email 
        OR EXISTS (
          SELECT id FROM user_emails WHERE
            (user_emails.user_id = :auth_id) 
            AND (invitations.email = user_emails.email)
        )
      )
  )

我不确定它是否可扩展,也不确定如何将其“转换”为JPQL ...

我有大概的型号:

  1. 用于身份验证的USERS表,包含主电子邮件
@Data @Entity @Table(name = "users")
public class User {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(unique = true, nullable = false)
    private String email;
    // other columns
}
  1. USER_EMAILS-用于保留其他(个人)用户电子邮件:
@Data @Entity @Table(name = "user_emails")
public class UserEmails {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @ManyToOne
    private User user;

    @Column(unique = true, nullable = false)
    private String email;
}
  1. 事件
@Data @Entity @Table(name = "events")
public class Event {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @ManyToOne
    private User user;

    @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "event_id") @JsonIgnore
    private List<Invitation> invitations;

    private String title;
    // other columns
}
  1. 邀请-邀请参加活动的用户(电子邮件)-可以用作主要电子邮件(users.email)或任何个人电子邮件(来自user_emails)
@Data @Entity @Table(name = "invitations")
public class Invitation {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String email;

    @ManyToOne @JsonIgnore
    private Event event;
}

0 个答案:

没有答案