package ru.ulstu.user; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import ru.ulstu.model.User; import ru.ulstu.model.UserRole; import ru.ulstu.model.UserRoleConstants; import java.util.Collections; import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; @Service @Transactional public class UserService implements UserDetailsService { private final Logger log = LoggerFactory.getLogger(UserService.class); private final PasswordEncoder passwordEncoder; private final UserRepository userRepository; private final UserRoleRepository userRoleRepository; public UserService(PasswordEncoder passwordEncoder, UserRepository userRepository, UserRoleRepository userRoleRepository) { this.passwordEncoder = passwordEncoder; this.userRepository = userRepository; this.userRoleRepository = userRoleRepository; } public User getUserByLogin(String login) { return userRepository.findOneByLoginIgnoreCase(login); } @Override public UserDetails loadUserByUsername(String username) { final User user = userRepository.findOneByLoginIgnoreCase(username); if (user == null) { throw new UserNotFoundException(username); } return new org.springframework.security.core.userdetails.User(user.getLogin(), user.getPassword(), Optional.ofNullable(user.getRoles()).orElse(Collections.emptySet()).stream() .map(role -> new SimpleGrantedAuthority(role.getName())) .collect(Collectors.toList())); } public User createUser(User user) { if (getUserByLogin(user.getLogin()) != null) { throw new RuntimeException(user.getLogin()); } //user.setRoles(Collections.singleton(new UserRole(UserRoleConstants.USER))); user.setPassword(passwordEncoder.encode(user.getPassword())); user = userRepository.save(user); log.debug("Created Information for User: {}", user.getLogin()); return user; } public void initDefaultAdmin() { String adminLogin = "admin"; String adminPassword = "adminadmin"; if (getUserByLogin(adminLogin) == null) { UserRole adminRole = userRoleRepository.save(new UserRole(UserRoleConstants.ADMIN)); createUser(new User(adminLogin, adminPassword, Set.of(adminRole))); } } }