package ee.esutoniagodesu.security.social;
import ee.esutoniagodesu.domain.ac.table.User;
import ee.esutoniagodesu.repository.domain.ac.UserRepository;
import ee.esutoniagodesu.security.UserNotActivatedException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.dao.DataAccessException;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.social.security.SocialUser;
import org.springframework.social.security.SocialUserDetails;
import org.springframework.social.security.SocialUserDetailsService;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
import java.util.stream.Collectors;
public class SimpleSocialUserDetailsService implements SocialUserDetailsService {
private static final Logger log = LoggerFactory.getLogger(SimpleSocialUserDetailsService.class);
private final UserRepository userRepository;
public SimpleSocialUserDetailsService(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Override
@Transactional(readOnly = true)
public SocialUserDetails loadUserByUserId(final String uuid) throws UsernameNotFoundException, DataAccessException {
log.debug("Authenticating {} from social login", uuid);
Optional<User> userFromDatabase = userRepository.findOneByUuid(uuid);
return userFromDatabase.map(user -> {
if (!user.isActivated()) {
throw new UserNotActivatedException("User " + uuid + " was not activated");
}
List<GrantedAuthority> grantedAuthorities = user.getAuthorities().stream()
.map(authority -> new SimpleGrantedAuthority(authority.name()))
.collect(Collectors.toList());
log.debug("Login successful");
return new SocialUser(uuid,
UUID.randomUUID().toString(),
grantedAuthorities);
}).orElseThrow(() -> new UsernameNotFoundException("User " + uuid + " was not found in the database"));
}
}