(я использую 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» в списке ролей моего пользователя, а не внутри ролей моего пользователя.
РЕШЕНИЕ
Мне наконец удалось найти решение, используя эту ссылку .
Для аннотаций @ManyToMany (классы Role и Authority) мне пришлосьустановите для свойства fetch значение EAGER:
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)