2 * In Samsung Ukraine R&D Center (SRK under a contract between)
3 * LLC "Samsung Electronics Co", Ltd (Seoul, Republic of Korea)
4 * Copyright (C) 2018 Samsung Electronics Co., Ltd. All rights reserved.
6 package com.samsung.samserver.security;
9 import com.samsung.samserver.domain.User;
10 import com.samsung.samserver.repository.UserRepository;
11 import org.slf4j.Logger;
12 import org.slf4j.LoggerFactory;
13 import org.springframework.security.core.AuthenticationException;
14 import org.springframework.security.core.GrantedAuthority;
15 import org.springframework.security.core.authority.SimpleGrantedAuthority;
16 import org.springframework.security.core.userdetails.UserDetails;
17 import org.springframework.security.core.userdetails.UserDetailsService;
18 import org.springframework.security.core.userdetails.UsernameNotFoundException;
19 import org.springframework.stereotype.Component;
20 import org.springframework.transaction.annotation.Transactional;
23 import java.util.stream.Collectors;
26 * Authenticate a user from the database.
28 @Component("userDetailsService")
29 public class DomainUserDetailsService implements UserDetailsService {
31 private final Logger log = LoggerFactory.getLogger(DomainUserDetailsService.class);
33 private final UserRepository userRepository;
35 public DomainUserDetailsService(UserRepository userRepository) {
36 this.userRepository = userRepository;
41 public UserDetails loadUserByUsername(final String login) {
42 log.debug("Authenticating {}", login);
43 String lowercaseLogin = login.toLowerCase(Locale.ENGLISH);
44 Optional<User> userByEmailFromDatabase = userRepository.findOneWithAuthoritiesByEmail(lowercaseLogin);
45 return userByEmailFromDatabase.map(user -> createSpringSecurityUser(lowercaseLogin, user)).orElseGet(() -> {
46 Optional<User> userByLoginFromDatabase = userRepository.findOneWithAuthoritiesByLogin(lowercaseLogin);
47 return userByLoginFromDatabase.map(user -> createSpringSecurityUser(lowercaseLogin, user))
48 .orElseThrow(() -> new UsernameNotFoundException("User " + lowercaseLogin + " was not found in the " +
53 private org.springframework.security.core.userdetails.User createSpringSecurityUser(String lowercaseLogin, User user) {
54 if (!user.getActivated()) {
55 throw new UserNotActivatedException("User " + lowercaseLogin + " was not activated");
57 List<GrantedAuthority> grantedAuthorities = user.getAuthorities().stream()
58 .map(authority -> new SimpleGrantedAuthority(authority.getName()))
59 .collect(Collectors.toList());
60 return new org.springframework.security.core.userdetails.User(user.getLogin(),
67 * This exception is thrown in case of a not activated user trying to authenticate.
69 public static class UserNotActivatedException extends AuthenticationException {
71 private static final long serialVersionUID = 1L;
73 public UserNotActivatedException(String message) {
77 public UserNotActivatedException(String message, Throwable t) {