Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

jhipster authentication login with email

I'm looking for a way to use email / password as authentication and not the default login(username) / password.

I'm using spring security oauth2.

Would this be possible? I do allow change email for the user.

Google was not my friend.

Nor was my code hacking: When putting the same email in the login-column I got authentication errors

like image 283
DavidT Avatar asked Feb 26 '15 10:02

DavidT


People also ask

What is JHipster Lite?

JHipster Lite ⚡ is a development platform to generate, develop & deploy modern web applications & microservices architecture, step by step.


2 Answers

Found the('mine') solution in 'com.example.myjhipster.security.UserDetailsService'

    @Override
    @Transactional
    public UserDetails loadUserByUsername(final String login) {
        log.debug("Authenticating {}", login);

        String lowercaseLogin = login.toLowerCase();
//        Optional<User> userFromDatabase =  userRepository.findOneByLogin(login);
        Optional<User> userFromDatabase =  userRepository.findOneByEmail(login);
        return userFromDatabase.map(user -> {
            if (!user.getVerified()) {
                throw new UserNotActivatedException("User " + lowercaseLogin + " was not activated");
            }

            List<GrantedAuthority> grantedAuthorities = user.getAuthorities().stream()
                    .map(authority -> new SimpleGrantedAuthority(authority.getName()))
                    .collect(Collectors.toList());
//            return new org.springframework.security.core.userdetails.User(lowercaseLogin,
            return new org.springframework.security.core.userdetails.User(user.getLogin(),
                    user.getPassword(),
                    grantedAuthorities);
        }).orElseThrow(() -> new UsernameNotFoundException("User " + lowercaseLogin + " was not found in the database"));
    }
like image 183
DavidT Avatar answered Oct 13 '22 14:10

DavidT


This is perhaps a bit too late, but here is a solution that would understand both login and email.

@Override
@Transactional
public UserDetails loadUserByUsername(final String login) {
    log.debug("Authenticating {}", login);
    String lowercaseLogin = login.toLowerCase(Locale.ENGLISH);

   User user = userRepository.findOneByLogin(lowercaseLogin)
           .map(Optional::of)
           .orElse(userRepository.findOneByEmail(lowercaseLogin))
           .orElseThrow(() -> new UsernameNotFoundException("User " + lowercaseLogin + " was not found in the " + "database"));

   if (!user.getActivated()) {
       throw new UserNotActivatedException("User " + lowercaseLogin + " was not activated");
   }

   List<GrantedAuthority> grantedAuthorities = getGrantedAuthorities(user);

   return new org.springframework.security.core.userdetails.User(user.getLogin(),
          user.getPassword(),
          grantedAuthorities);

}

private List<GrantedAuthority> getGrantedAuthorities(User user) {
    return user.getAuthorities().stream()
            .map(authority -> new SimpleGrantedAuthority(authority.getName()))
        .collect(Collectors.toList());
}
like image 24
pilot Avatar answered Oct 13 '22 14:10

pilot