diff --git a/spring_online_calculator/src/main/java/premium_store/configuration/SecurityConfiguration.java b/spring_online_calculator/src/main/java/premium_store/configuration/SecurityConfiguration.java index 3d74620..098c6cd 100644 --- a/spring_online_calculator/src/main/java/premium_store/configuration/SecurityConfiguration.java +++ b/spring_online_calculator/src/main/java/premium_store/configuration/SecurityConfiguration.java @@ -10,15 +10,17 @@ import org.springframework.security.config.annotation.authentication.builders.Au import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer; import org.springframework.security.web.SecurityFilterChain; +import premium_store.service.UserService; @Configuration @EnableWebSecurity @EnableMethodSecurity( securedEnabled = true ) -public class SecurityConfiguration { +public class SecurityConfiguration extends WebSecurityConfigurerAdapter { private final Logger log = LoggerFactory.getLogger(SecurityConfiguration.class); private static final String LOGIN_URL = "/login"; private final UserService userService; @@ -32,7 +34,7 @@ public class SecurityConfiguration { final String admin = "admin"; if (userService.findByLogin(admin) == null) { log.info("Admin user successfully created"); - userService.addUser(admin, "adminemail@gmail.com", admin, admin, UserRole.ADMIN); + userService.createUser(admin, "adminemail@gmail.com", admin, admin, UserRole.ADMIN); } } @@ -70,4 +72,9 @@ public class SecurityConfiguration { .requestMatchers("/templates/**") .requestMatchers("/webjars/**"); } + + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception { + auth.userDetailsService(userService); + } } \ No newline at end of file diff --git a/spring_online_calculator/src/main/java/premium_store/service/UserService.java b/spring_online_calculator/src/main/java/premium_store/service/UserService.java new file mode 100644 index 0000000..9f32af6 --- /dev/null +++ b/spring_online_calculator/src/main/java/premium_store/service/UserService.java @@ -0,0 +1,62 @@ +package premium_store.service; + +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; +import premium_store.model.GameClient; +import premium_store.repository.GameClientRepository; +import premium_store.util.validation.ValidatorUtil; + +import javax.validation.ValidationException; +import java.util.Collections; +import java.util.Objects; + +@Service +public class UserService implements UserDetailsService { + private final GameClientRepository userRepository; + private final PasswordEncoder passwordEncoder; + private final ValidatorUtil validatorUtil; + + public UserService(GameClientRepository userRepository, + PasswordEncoder passwordEncoder, + ValidatorUtil validatorUtil) { + this.userRepository = userRepository; + this.passwordEncoder = passwordEncoder; + this.validatorUtil = validatorUtil; + } + + public GameClient findByLogin(String login) { + return userRepository.findOneByLoginIgnoreCase(login); + } + + public GameClient createUser(String login, String password, String passwordConfirm) { + if (findByLogin(login) != null) { + throw new ValidationException(String.format("User '%s' already exists", login)); + } + + final GameClient user = new GameClient(login, passwordEncoder.encode(password), 0); + + validatorUtil.validate(user); + + if (!Objects.equals(password, passwordConfirm)) { + throw new ValidationException("Passwords not equals"); + } + + return userRepository.save(user); + } + + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + final GameClient userEntity = findByLogin(username); + + if (userEntity == null) { + throw new UsernameNotFoundException(username); + } + + return new org.springframework.security.core.userdetails.User( + userEntity.getNickName(), userEntity.getEmail(), Collections.emptyList()); + } + +} diff --git a/spring_online_calculator/src/main/resources/templates/signup.html b/spring_online_calculator/src/main/resources/templates/signup.html new file mode 100644 index 0000000..9119a07 --- /dev/null +++ b/spring_online_calculator/src/main/resources/templates/signup.html @@ -0,0 +1,32 @@ + + + + + + +
+
+
+
+ +
+
+ +
+
+ +
+
+ + Назад +
+
+
+ + \ No newline at end of file