繁体   English   中英

如何过滤掉数据库中所有用户的获取请求,以便具有管理员角色的用户不显示在列表中?

[英]How can I filter out a get request of all users in my DB so that users with an admin role are not shown in the list?

我正在构建一个 spring 引导应用程序,它允许管理员查看保存在我的数据库中的所有用户的列表。 但是,目前正在显示所有用户,包括具有管理员角色的用户。 有人建议我在后端代码中过滤掉管理员,但我不确定如何做到这一点 go。 如果有人可以帮助我,我将不胜感激。 谢谢! (我正在使用 JPA + Hibernate)

更新:有人建议我在下面使用一个非常有用的解决方案。 我需要制作一个getUsers方法,以过滤掉管理员的方式从我的数据库中查询数据。 起初,我在查询的 SQL 部分遇到问题,因为我使用的是 hibernate(我想,如果我错了请纠正我)。 我知道你不能使用 JPQL 查询从表中访问原始实体数据,因为我使用 @JoinTable 创建我的 user_roles 表,它没有实体 class,我很困惑。 在我的User class看到如下:

 @ManyToMany(fetch = FetchType.LAZY) @JoinTable( name = "user_roles", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id")) private Set<Role> roles = new HashSet<>();

我在FROM User u,Role r, user_role ur中的 user_role ur 的用户存储库 class 收到一条红线。 此外,我收到以下错误: user_role is not mapped [SELECT u.id,u.username,u.email FROM com.Application.models.User u,com.Application.models.Role r, user_role ur WHERE u.id=ur.id AND r.id=ur.id AND r.name<>'ADMIN'] 我的角色实体用于 map 角色 ID 和角色名称,而我的 user_role 表在一个表中包含一列用户 ID 和角色 ID,用于将用户 ID 映射到角色 ID。 那是我最后一个错误所在。

我的解决方案

 @Query("SELECT u FROM User u join u.roles r WHERE NOT EXISTS" + "(SELECT r FROM u.roles WHERE r.name = 'ROLE_ADMIN')") List<User> getUsers();

在我的案例中,这成功地过滤掉了具有管理员角色的用户。 我希望有一天这对某人有所帮助,我被困了一分钟。 感谢您的帮助!

用户.java:

 package com.Application.models; import javax.persistence.*; import javax.validation.constraints.Email; import javax.validation.constraints.NotBlank; import javax.validation.constraints.Size; import java.util.HashSet; import java.util.Set; @Entity @Table( name = "users", uniqueConstraints = { @UniqueConstraint(columnNames = "username"), }) public class User { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") private Long id; @Column(name = "username") @NotBlank @Size(max = 20) private String username; @Column(name = "email") @NotBlank @Size(max = 50) @Email private String email; @NotBlank @Size(max = 120) private String password; @ManyToMany(fetch = FetchType.LAZY) @JoinTable( name = "user_roles", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id")) private Set<Role> roles = new HashSet<>(); @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "user") private Set<UserPost> userPosts = new HashSet<>(); public User(String username, String email,String password) { this.username = username; this.email = email; this.password = password; } public User() { } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Set<Role> getRoles() { return roles; } public void setRoles(Set<Role> roles) { this.roles = roles; } }

测试控制器.java:

 package com.Application.controller; import com.Application.models.User; import com.Application.repository.UserPostsRepository; import com.Application.repository.UserProfileRepository; import com.Application.repository.UserRepository; import com.Application.security.jwt.JwtUtils; import com.Application.security.services.UserDetailsService; import com.Application.security.services.UserPostService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; @CrossOrigin(origins = "http://localhost:3000") @RestController @RequestMapping("/api/test") public class TestController { private static final String AUTH_HEADER = "authorization"; @Autowired private final UserPostsRepository userPostRepo; @Autowired private final UserRepository userRepo; @Autowired private final UserProfileRepository userProfRepo; @Autowired private UserDetailsService userDetailsService; @Autowired private UserPostService userPostService; @Autowired JwtUtils jwtUtils; public TestController(UserPostsRepository userPostRepo, UserRepository userRepo, UserProfileRepository userProfRepo) { this.userPostRepo = userPostRepo; this.userRepo = userRepo; this.userProfRepo = userProfRepo; } @GetMapping("/all") public String allAccess() { return "Public Content."; } @GetMapping("/user") @PreAuthorize("hasRole('USER') or hasRole('MODERATOR') or hasRole('ADMIN')") public String userAccess() { return "User Content."; } @GetMapping("/mod") @PreAuthorize("hasRole('MODERATOR')") public String moderatorAccess() { return "Moderator Board."; } @GetMapping("/admin") @PreAuthorize("hasRole('ADMIN')") public List<User> adminAccess(Model model) { List<User> allUsers = userRepo.getUsers(); allUsers.forEach(user -> model.addAttribute("username", user.getUsername())); return allUsers; } }

角色.java:

 package com.Application.models; import javax.persistence.*; @Entity @Table(name = "roles") public class Role { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; @Enumerated(EnumType.STRING) @Column(length = 20) private ERole name; public Role() { } public Role(ERole name) { this.name = name; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public ERole getName() { return name; } public void setName(ERole name) { this.name = name; } }

ERole.java:

 package com.Application.models; public enum ERole { ROLE_USER, ROLE_MODERATOR, ROLE_ADMIN }

用户库.java:

 package com.Application.repository; import java.util.List; import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; import com.Application.models.User; @Repository public interface UserRepository extends JpaRepository<User, Long> { Optional<User> findByUsername(String username); User findUserById(Long id); Optional<User> findByEmail(String email); List<User> findAll(); @Query("SELECT u.id,u.username,u.email FROM User u,Role r, user_role ur WHERE u.id=ur.id AND r.id=ur.id AND r.name<>\'ADMIN\'") //Error at users u, roles r, user_roles ur even though the table names are right List<User> getUsers(); Boolean existsByUsername(String username); Boolean existsByEmail(String email);

角色库.java:

 package com.Application.repository; import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import com.Application.models.ERole; import com.Application.models.Role; @Repository public interface RoleRepository extends JpaRepository<Role, Long> { Optional<Role> findByName(ERole name); }

有更好的方法可以做到这一点,但这里有一个简单的方法。只需在您的存储库界面中添加以下方法

@Query("SELECT u.firstname,u.lastname,u.email FROM user u,role r,user_role ur WHERE u.id=ur.user_id AND r.id=ur.role_id AND r.name<>\'ADMIN\'")
List<User> getUsers();

getUsers() 返回除管理员用户之外的用户列表。 当然,您可以根据用户表中的列更改查询,并使用数据库中相应表的名称更改 user_roles。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM