Spring Security Как реализовать вход в систему с именем пользователя или электронной почтой - PullRequest
0 голосов
/ 21 сентября 2019

У меня есть модель пользователя

  @Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_id")
private Long id;

@Size(min = 2, max = 20)
@NotBlank
private String firstName;

@Size(min = 2, max = 40)
@NotBlank
private String lastName;

@NotBlank
@Size(max = 20)
private String username;

@NotBlank
@Email
private String email;

@Enumerated(EnumType.STRING)
@NotNull
private Gender gender;

@NotBlank
private String password;

boolean isActive;


//Contructors,getters,setters

И пользовательская реализация UserDetailsService

public class CustomUserDetailsService implements UserDetailsService {

private UserRepository userRepository;

@Autowired
public CustomUserDetailsService(UserRepository userRepository) {
    this.userRepository = userRepository;
}

@Override
public UserDetails loadUserByUsername(String usernameOrEmail) throws UsernameNotFoundException {
    User user = userRepository.findByUsernameOrEmail(usernameOrEmail, usernameOrEmail)
            .orElseThrow(() ->
                    new UsernameNotFoundException("User not found with username or email : " + usernameOrEmail)
            );
    //???
}

И я хочу, чтобы люди могли входить с именем пользователя или электронной почтой, но я не знаю, гденачать искать и что реализовать.Когда я использовал логин с единственным именем пользователя, я реализовал org.springframework.security.core.userdetails.User следующим образом:

org.springframework.security.core.userdetails.User userDetails = 
            new org.springframework.security.core.userdetails.User(
                    user.getEmail(), 
                    user.getPassword(), 
                    convertAuthorities(user.getRoles()));
    return userDetails;
}

private Set<GrantedAuthority> convertAuthorities(Set<UserRole> userRoles) {
    Set<GrantedAuthority> authorities = new HashSet<>();
    for(UserRole ur: userRoles) {
        authorities.add(new SimpleGrantedAuthority(ur.getRole()));
    }
    return authorities;
}

Но я не знаю, как реализовать это с помощью логина с именем пользователя или электронной почтой. Любойпомощь и указатели высоко ценятся.

1 Ответ

0 голосов
/ 21 сентября 2019

Другой поток останется прежним.Единственное место, которое можно изменить, - это запрос поиска в репозитории пользователей

 @Override
public UserDetails loadUserByUsername(String usernameOrEmail) throws UsernameNotFoundException {
    List<User> users = userRepository.findByUsernameOrEmail(usernameOrEmail)
        .orElseThrow(() ->
            new UsernameNotFoundException("User not found with username or email : " + usernameOrEmail)
    );


    User firstUser =  users.get(0);
    User userDetails = 
            new org.springframework.security.core.userdetails.User(
                    firstUser.getEmail(), 
                    firstUser.getPassword(), 
                    convertAuthorities(firstUser.getRoles()));
    return userDetails;
}

public interface UserRepository extends JpaRepository<User, Long> {

  @Query(value = "SELECT u FROM USER u WHERE u.EMAIL_ADDRESS = ?1 OR u.USER_NAME= ?1")
  List<User> findByUsernameOrEmail(String usernameOrEmail);

}
...