К примеру, вот у меня есть два Entity
Privilege и
Role. Они взаимосвязаны
@ManyToMany
Лишние подробности ( конструкторы, методы ) пропущены для краткости.
public class Privilege extends AbstractBaseEntity {
private String name;
@ManyToMany(mappedBy = "privileges")
private Collection<Role> roles;
public class Role extends AbstractBaseEntity {
private String name;
@ManyToMany(mappedBy = "roles")
private Collection<User> users;
@ManyToMany
@JoinTable(name = "roles_privileges", joinColumns = @JoinColumn(name = "role_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "privilege_id", referencedColumnName = "id"))
private Collection<Privilege> privileges;
}
У User есть просто коллекция Roles
public class User extends AbstractBaseEntity{
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "users_roles", joinColumns = @JoinColumn(name = "user_id", referencedColumnName = "id"), inverseJoinColumns = @JoinColumn(name = "role_id", referencedColumnName = "id"))
private Collection<Role> roles;
А теперь то, что я не понимаю абсолютно:
У нас при loadUserByUsername в конструкторе для User в GrantedAuthority мы выдаем
role.getName() и role.getPrivileges().getName(). Т.е. мы мешаем имя роли и имена привилегий для этой роли в одну кучу.
Если роль в теории должна быть контейнером для привилегий, то зачем нам класть в GrantedAuthorities имя роли, почему не оставлять одни привилегии?
public class MyUserDetailsService implements UserDetailsService {
private User user;
@Override
public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
return new org.springframework.security.core.userdetails.User(
user.getEmail(), user.getPassword(), user.isEnabled(),
true, true, true,
getAuthorities(user.getRoles()));
}
private Collection<? extends GrantedAuthority> getAuthorities(final Collection<Role> roles) {
return getGrantedAuthorities(getPrivileges(roles));
}
private List<String> getPrivileges(final Collection<Role> roles) { // Просто возвращает
// коллекцию role.getName() и role.getPrivileges().getName в одной Коллекции
final List<String> rolePrivilegesAndNames = new ArrayList<>();
final List<Privilege> rolePrivileges = new ArrayList<>();
for (final Role role : roles) {
rolePrivilegesAndNames.add(role.getName());
rolePrivileges.addAll(role.getPrivileges());
}
for (final Privilege privilege : rolePrivileges) {
rolePrivilegesAndNames.add(privilege.getName());
}
return rolePrivilegesAndNames;
}
private List<GrantedAuthority> getGrantedAuthorities(final List<String> privileges) {
// Переделывает List String в List GrantedAuthority
final List<GrantedAuthority> authorities = new ArrayList<>();
for (final String privilege : privileges) {
authorities.add(new SimpleGrantedAuthority(privilege));
}
return authorities;
}
}