[SECARSP-111] +Auth API [SECARSP-115 +Get Devices]
[platform/core/security/suspicious-activity-monitor.git] / server / src / main / java / com / samsung / samserver / security / DomainUserDetailsService.java
1 /*
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.
5  */
6 package com.samsung.samserver.security;
7
8
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;
21
22 import java.util.*;
23 import java.util.stream.Collectors;
24
25 /**
26  * Authenticate a user from the database.
27  */
28 @Component("userDetailsService")
29 public class DomainUserDetailsService implements UserDetailsService {
30
31     private final Logger log = LoggerFactory.getLogger(DomainUserDetailsService.class);
32
33     private final UserRepository userRepository;
34
35     public DomainUserDetailsService(UserRepository userRepository) {
36         this.userRepository = userRepository;
37     }
38
39     @Override
40     @Transactional
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 " +
49                     "database"));
50         });
51     }
52
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");
56         }
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(),
61             user.getPassword(),
62             grantedAuthorities);
63     }
64
65
66     /**
67      * This exception is thrown in case of a not activated user trying to authenticate.
68      */
69     public static class UserNotActivatedException extends AuthenticationException {
70
71         private static final long serialVersionUID = 1L;
72
73         public UserNotActivatedException(String message) {
74             super(message);
75         }
76
77         public UserNotActivatedException(String message, Throwable t) {
78             super(message, t);
79         }
80     }
81 }