【发布时间】:2019-06-20 17:04:42
【问题描述】:
我无法从Collection 对象中的Collection 获取用户角色为String List。
我想将用户角色设置为List 以在我的loadUserByUsername 方法上的UserServiceImlementation 中实现它,其中我将角色名称作为列表传递给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();
}
}
【问题讨论】:
-
那么问题是什么?
-
问题是如何获取用户角色为 List
-
@D.Skowron 1) 在粘贴之前格式化您的代码(所有主要的 Java IDE 都可以这样做) 2) 编辑您的问题并使其更清晰 - 特别是哪一行没有按预期工作?您的期望是什么,实际发生了什么? 3)将您的问题归结为核心-在我看来,您的问题与任何形式的 JPA 无关。
-
所以基本上这条线是问题?
List<String> roleNames = (Collectors.toList(user.getRoles())); -
@aBnormaLz 是的,这是主要问题。
标签: java spring spring-security