Связать полномочия с ролями - PullRequest
0 голосов
/ 05 октября 2018

(я использую 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)
...