У меня проблема с получением пользовательских ролей как String
List
из Collection
ролей в объекте User
.
Я хочу получить роли пользователя как List
, чтобы реализовать его в моем методе UserServiceImlementation
on loadUserByUsername
, в котором я передаю имена ролей в виде списка в класс SocialUserDetailsImplementation
, чтобы сделать доступным социальную регистрацию. Будем благодарны за решение.
Модель пользователя :
@Entity
@Table(uniqueConstraints = @UniqueConstraint(columnNames = "email"))
public class User {
public static final String ROLE_USER = "ROLE_USER";
public static final String ROLE_ADMIN = "ROLE_ADMIN";
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name ="user_id", nullable = false)
private Long userId;
private String firstName;
private String lastName;
private String email;
private String password;
private String userName;
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinTable(
name = "users_roles",
joinColumns = @JoinColumn(
name = "user_id", referencedColumnName = "user_id"),
inverseJoinColumns = @JoinColumn(
name = "role_id", referencedColumnName = "id"))
private Collection<Role> roles;
@Column(name = "enabled")
private boolean enabled;
public User() {
super();
this.enabled=false;
}
public User(String firstName, String lastName, String email, String password) {
this.firstName = firstName;
this.lastName = lastName;
this.email = email;
this.password = password;
}
public User(String firstName, String lastName, String email, String password, Collection<Role> roles) {
this.firstName = firstName;
this.lastName = lastName;
this.email = email;
this.password = password;
this.roles = roles;
}
public User(String firstName, String lastName, String email, String password, String userName, Collection<Role> roles) {
this.firstName = firstName;
this.lastName = lastName;
this.email = email;
this.password = password;
this.userName = userName;
this.roles = roles;
}
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public boolean isEnabled() {
return enabled;
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
}
public Collection<Role> getRoles() {
return roles;
}
public void setRoles(Collection<Role> roles) {
this.roles = roles;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
UserServiceImpl
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException {
User user = userRepository.findByUserName(userName);
if (user == null) {
throw new UsernameNotFoundException("Invalid username or password.");
}
List<String> roleNames = (Collectors.toList(user.getRoles()));
List<GrantedAuthority> grantList = new ArrayList<GrantedAuthority>();
if (roleNames != null) {
for (String role : roleNames) {
GrantedAuthority authority = new SimpleGrantedAuthority(role);
grantList.add(authority);
}
}
SocialUserDetailsImpl userDetails = new SocialUserDetailsImpl(user, roleNames);
return userDetails;
}
SocialUserDetailsImpl
public class SocialUserDetailsImpl implements SocialUserDetails {
private static final long serialVersionUID = 1L;
private List<GrantedAuthority> list = new ArrayList<GrantedAuthority>();
private User user;
public SocialUserDetailsImpl(User user, List<String> roleNames) {
this.user = user;
for (String roleName : roleNames) {
GrantedAuthority grant = new SimpleGrantedAuthority(roleName);
this.list.add(grant);
}
}
@Override
public String getUserId() {
return this.user.getUserId() + "";
}
@Override
public String getUsername() {
return user.getUserName();
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return list;
}
@Override
public String getPassword() {
return user.getPassword();
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return this.user.isEnabled();
}
}