(我已经使用Spring一个月了,如果我的问题很明显,对不起)
我有一个User类,一个Role类和一个Authority类。
用户
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String token;
@Email
@NotEmpty
private String email;
@Length(min = 5)
@NotEmpty
@JsonIgnore
private String password;
@NotEmpty
private String firstName;
@NotEmpty
private String lastName;
private String phoneNumber;
private boolean active;
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))
private List<Role> roles;
// Getters and setters...
}
角色
@Entity
public class Role {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@NotEmpty
@Enumerated(EnumType.STRING)
private ERoleName name;
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(name = "role_authority", joinColumns = @JoinColumn(name = "role_id"), inverseJoinColumns = @JoinColumn(name = "authority_id"))
private List<Authority> authorities;
// Getters and setters...
}
权限
@Entity
public class Authority implements GrantedAuthority {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@NotEmpty
private String name;
// Getters and setters...
}
我正在尝试采用以下方案:
-用户具有角色
-角色具有权限
调试代码时,可以看到上述方案有效。
作为示例,我向用户添加了角色“ ROLE_ADMIN”。该角色具有权限“ WRITE_AUTHORITY”和“ READ_AUTHORITY”。
在我的SecurityConfiguration文件中,有以下一行:
.antMatchers("/admin/**").hasAuthority("WRITE_AUTHORITY")
当我尝试访问“ / admin / users / list”时,出现禁止错误。
我读到Spring没有区分角色和权限,所以我的理论是它在用户角色列表内而不是用户角色内寻找“ WRITE_AUTHORITY”。
解决方案
我终于设法使用this link找到了解决方案。
对于@ManyToMany批注(角色和授权类),我必须将fetch属性设置为EAGER:
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)