Spring Security按角色获取用户列表

时间:2015-11-30 14:37:25

标签: java spring jpa

在我的Spring项目中,我使用Spring Security。我有两个实体User和UserRole关系一对多。在实体中,这种关系是单向的。例如,我想获得具有Admin角色的用户列表。 我的实体:

cv::Mat

我使用Spring Data。我的查询在方法中调用:

cv::Mat image_on_proc = newpopulation(cv::Rect(0, start, population.cols, rows_in_section));
    std::vector<byte> img = matToBytes(image_on_proc);

    std::vector<uchar> test;
    for(int i=0; i<image_on_proc.rows; i++)
    {
      for(int j=0; j<image_on_proc.cols; j++)
      {
    test.push_back(image_on_proc.at<uchar>(i,j));
      }
    }

    MPI_Barrier(MPI_COMM_WORLD);

    MPI_Send(&test[0],test.size()*sizeof(uchar), MPI_BYTE, 0, 99, MPI_COMM_WORLD);

,查询如下所示:

@Entity
@Table(name = "users")
public class User implements Serializable {
    @JoinColumn(name = "userId")
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    private Set<UserRole> userRoleSet;
}

@Entity
@Table(name = "user_roles")
public class UserRole implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue
    @Column(name = "id")
    private Long id;
    @Column(name = "name", nullable = false, unique = true, length = 40)
    private String name;
}

我尝试使用表达式成员来获取具有Admin角色的用户,但它不起作用。我得到以下异常:

@Override
@Transactional(readOnly = true)
public List<User> getAdminList(String username) {
    UserRole userRole = new UserRole("ROLE_ADMIN");
    return userDao.getAdminList(userRole, username);
}

如何按角色获取用户列表?之前我的实体之间有双向关系,一切正常,但我认为在这种情况下不需要双向关系。如何用单向关系解决它?

1 个答案:

答案 0 :(得分:1)

试试这个

@Query("SELECT u FROM User u WHERE u.id IN (SELECT ur.userId FROM UserRole ur WHERE ur.name = :role)")
List<User> getAdminList(@Param("role") String userRole);

@Override
@Transactional(readOnly = true)
public List<User> getAdminList() {
    String roleName = "ROLE_ADMIN";
    return userDao.getAdminList(roleName);
}

此外,您应该重构您的代码,因为命名方法getAdminList并将角色名称设置为参数是错误的,它应该被命名为getUserListByRoleName(String roleName)

修改

您还应该考虑使用三个表:users,user_roles和roles

因为现在您将为不同的用户复制相同的角色