From bacd580822e555bb97d414a855dedb02eb04a815 Mon Sep 17 00:00:00 2001 From: anuragkumawat Date: Tue, 5 Apr 2022 14:08:25 +0530 Subject: [PATCH] JAVA-8360 Split or move spring-5-security module --- .../spring-5-security/README.md | 1 - .../spring-security-web-login/README.md | 1 + .../spring-security-web-login/pom.xml | 34 ++++ .../CustomAuthenticationFilter.java | 100 +++++----- .../CustomAuthenticationToken.java | 56 +++--- ...stomUserDetailsAuthenticationProvider.java | 184 +++++++++--------- .../CustomUserDetailsService.java | 20 +- .../CustomUserDetailsServiceImpl.java | 60 +++--- .../CustomUserRepository.java | 66 +++---- .../ExtraLoginFieldsApplication.java | 0 .../PasswordEncoderConfiguration.java | 0 .../SecurityConfig.java | 126 ++++++------ .../baeldung/loginextrafieldscustom/User.java | 46 ++--- .../UserRepository.java | 14 +- .../loginextrafieldscustom/WebController.java | 102 +++++----- .../ExtraLoginFieldsApplication.java | 0 .../PasswordEncoderConfiguration.java | 0 .../SecurityConfig.java | 132 ++++++------- .../SimpleAuthenticationFilter.java | 108 +++++----- .../SimpleUserDetailsService.java | 64 +++--- .../SimpleUserRepository.java | 66 +++---- .../baeldung/loginextrafieldssimple/User.java | 42 ++-- .../UserRepository.java | 14 +- .../loginextrafieldssimple/WebController.java | 102 +++++----- .../application-extrafields.properties | 0 .../src/main/resources/application.properties | 7 + .../src/main/resources/static/css/main.css | 0 .../resources/templatesextrafields/index.html | 0 .../resources/templatesextrafields/login.html | 0 .../templatesextrafields/user/index.html | 0 ...stractExtraLoginFieldsIntegrationTest.java | 92 ++++----- .../LoginFieldsFullIntegrationTest.java | 144 +++++++------- .../LoginFieldsSimpleIntegrationTest.java | 144 +++++++------- 33 files changed, 883 insertions(+), 842 deletions(-) rename spring-security-modules/{spring-5-security => spring-security-web-login}/src/main/java/com/baeldung/loginextrafieldscustom/CustomAuthenticationFilter.java (97%) rename spring-security-modules/{spring-5-security => spring-security-web-login}/src/main/java/com/baeldung/loginextrafieldscustom/CustomAuthenticationToken.java (97%) rename spring-security-modules/{spring-5-security => spring-security-web-login}/src/main/java/com/baeldung/loginextrafieldscustom/CustomUserDetailsAuthenticationProvider.java (97%) rename spring-security-modules/{spring-5-security => spring-security-web-login}/src/main/java/com/baeldung/loginextrafieldscustom/CustomUserDetailsService.java (97%) rename spring-security-modules/{spring-5-security => spring-security-web-login}/src/main/java/com/baeldung/loginextrafieldscustom/CustomUserDetailsServiceImpl.java (97%) rename spring-security-modules/{spring-5-security => spring-security-web-login}/src/main/java/com/baeldung/loginextrafieldscustom/CustomUserRepository.java (92%) rename spring-security-modules/{spring-5-security => spring-security-web-login}/src/main/java/com/baeldung/loginextrafieldscustom/ExtraLoginFieldsApplication.java (100%) rename spring-security-modules/{spring-5-security => spring-security-web-login}/src/main/java/com/baeldung/loginextrafieldscustom/PasswordEncoderConfiguration.java (100%) rename spring-security-modules/{spring-5-security => spring-security-web-login}/src/main/java/com/baeldung/loginextrafieldscustom/SecurityConfig.java (97%) rename spring-security-modules/{spring-5-security => spring-security-web-login}/src/main/java/com/baeldung/loginextrafieldscustom/User.java (97%) rename spring-security-modules/{spring-5-security => spring-security-web-login}/src/main/java/com/baeldung/loginextrafieldscustom/UserRepository.java (95%) rename spring-security-modules/{spring-5-security => spring-security-web-login}/src/main/java/com/baeldung/loginextrafieldscustom/WebController.java (96%) rename spring-security-modules/{spring-5-security => spring-security-web-login}/src/main/java/com/baeldung/loginextrafieldssimple/ExtraLoginFieldsApplication.java (100%) rename spring-security-modules/{spring-5-security => spring-security-web-login}/src/main/java/com/baeldung/loginextrafieldssimple/PasswordEncoderConfiguration.java (100%) rename spring-security-modules/{spring-5-security => spring-security-web-login}/src/main/java/com/baeldung/loginextrafieldssimple/SecurityConfig.java (97%) rename spring-security-modules/{spring-5-security => spring-security-web-login}/src/main/java/com/baeldung/loginextrafieldssimple/SimpleAuthenticationFilter.java (97%) rename spring-security-modules/{spring-5-security => spring-security-web-login}/src/main/java/com/baeldung/loginextrafieldssimple/SimpleUserDetailsService.java (97%) rename spring-security-modules/{spring-5-security => spring-security-web-login}/src/main/java/com/baeldung/loginextrafieldssimple/SimpleUserRepository.java (96%) rename spring-security-modules/{spring-5-security => spring-security-web-login}/src/main/java/com/baeldung/loginextrafieldssimple/User.java (97%) rename spring-security-modules/{spring-5-security => spring-security-web-login}/src/main/java/com/baeldung/loginextrafieldssimple/UserRepository.java (95%) rename spring-security-modules/{spring-5-security => spring-security-web-login}/src/main/java/com/baeldung/loginextrafieldssimple/WebController.java (96%) rename spring-security-modules/{spring-5-security => spring-security-web-login}/src/main/resources/application-extrafields.properties (100%) create mode 100644 spring-security-modules/spring-security-web-login/src/main/resources/application.properties rename spring-security-modules/{spring-5-security => spring-security-web-login}/src/main/resources/static/css/main.css (100%) rename spring-security-modules/{spring-5-security => spring-security-web-login}/src/main/resources/templatesextrafields/index.html (100%) rename spring-security-modules/{spring-5-security => spring-security-web-login}/src/main/resources/templatesextrafields/login.html (100%) rename spring-security-modules/{spring-5-security => spring-security-web-login}/src/main/resources/templatesextrafields/user/index.html (100%) rename spring-security-modules/{spring-5-security => spring-security-web-login}/src/test/java/com/baeldung/loginextrafields/AbstractExtraLoginFieldsIntegrationTest.java (97%) rename spring-security-modules/{spring-5-security => spring-security-web-login}/src/test/java/com/baeldung/loginextrafields/LoginFieldsFullIntegrationTest.java (97%) rename spring-security-modules/{spring-5-security => spring-security-web-login}/src/test/java/com/baeldung/loginextrafields/LoginFieldsSimpleIntegrationTest.java (97%) diff --git a/spring-security-modules/spring-5-security/README.md b/spring-security-modules/spring-5-security/README.md index bad99c22d4..dac2d0f6b8 100644 --- a/spring-security-modules/spring-5-security/README.md +++ b/spring-security-modules/spring-5-security/README.md @@ -4,7 +4,6 @@ This module contains articles about Spring Security 5 ## Relevant articles: -- [Extra Login Fields with Spring Security](https://www.baeldung.com/spring-security-extra-login-fields) - [A Custom Spring SecurityConfigurer](https://www.baeldung.com/spring-security-custom-configurer) - [New Password Storage In Spring Security 5](https://www.baeldung.com/spring-security-5-password-storage) - [Default Password Encoder in Spring Security 5](https://www.baeldung.com/spring-security-5-default-password-encoder) diff --git a/spring-security-modules/spring-security-web-login/README.md b/spring-security-modules/spring-security-web-login/README.md index 8b9c1583f6..bbef468944 100644 --- a/spring-security-modules/spring-security-web-login/README.md +++ b/spring-security-modules/spring-security-web-login/README.md @@ -12,6 +12,7 @@ The "Learn Spring Security" Classes: http://github.learnspringsecurity.com - [Spring Security – Customize the 403 Forbidden/Access Denied Page](https://www.baeldung.com/spring-security-custom-access-denied-page) - [Spring Security – Redirect to the Previous URL After Login](https://www.baeldung.com/spring-security-redirect-login) - [Spring Security Custom AuthenticationFailureHandler](https://www.baeldung.com/spring-security-custom-authentication-failure-handler) +- [Extra Login Fields with Spring Security](https://www.baeldung.com/spring-security-extra-login-fields) ### Build the Project ``` diff --git a/spring-security-modules/spring-security-web-login/pom.xml b/spring-security-modules/spring-security-web-login/pom.xml index 3d9947c519..346338cbcd 100644 --- a/spring-security-modules/spring-security-web-login/pom.xml +++ b/spring-security-modules/spring-security-web-login/pom.xml @@ -16,6 +16,26 @@ + + org.springframework.boot + spring-boot-starter-web + ${spring-boot.version} + + + org.springframework.boot + spring-boot-starter-security + ${spring-boot.version} + + + org.springframework.boot + spring-boot-starter-thymeleaf + ${spring-boot.version} + + + org.thymeleaf.extras + thymeleaf-extras-springsecurity5 + ${thymeleaf-extras-springsecurity5.version} + org.springframework.security @@ -98,6 +118,12 @@ runtime + + org.springframework.boot + spring-boot-starter-test + ${spring-boot.version} + test + org.springframework spring-test @@ -110,6 +136,11 @@ ${spring-security.version} test + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + @@ -153,6 +184,9 @@ 1.9.9 + 2.6.4 + 3.0.4.RELEASE + 3.11 \ No newline at end of file diff --git a/spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/CustomAuthenticationFilter.java b/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldscustom/CustomAuthenticationFilter.java similarity index 97% rename from spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/CustomAuthenticationFilter.java rename to spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldscustom/CustomAuthenticationFilter.java index 2a5c5f0368..9e7ecdb2cc 100644 --- a/spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/CustomAuthenticationFilter.java +++ b/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldscustom/CustomAuthenticationFilter.java @@ -1,50 +1,50 @@ -package com.baeldung.loginextrafieldscustom; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.springframework.security.authentication.AuthenticationServiceException; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.AuthenticationException; -import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; - -public class CustomAuthenticationFilter extends UsernamePasswordAuthenticationFilter { - - public static final String SPRING_SECURITY_FORM_DOMAIN_KEY = "domain"; - - @Override - public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) - throws AuthenticationException { - - if (!request.getMethod().equals("POST")) { - throw new AuthenticationServiceException("Authentication method not supported: " - + request.getMethod()); - } - - CustomAuthenticationToken authRequest = getAuthRequest(request); - setDetails(request, authRequest); - return this.getAuthenticationManager().authenticate(authRequest); - } - - private CustomAuthenticationToken getAuthRequest(HttpServletRequest request) { - String username = obtainUsername(request); - String password = obtainPassword(request); - String domain = obtainDomain(request); - - if (username == null) { - username = ""; - } - if (password == null) { - password = ""; - } - if (domain == null) { - domain = ""; - } - - return new CustomAuthenticationToken(username, password, domain); - } - - private String obtainDomain(HttpServletRequest request) { - return request.getParameter(SPRING_SECURITY_FORM_DOMAIN_KEY); - } -} +package com.baeldung.loginextrafieldscustom; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.security.authentication.AuthenticationServiceException; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; + +public class CustomAuthenticationFilter extends UsernamePasswordAuthenticationFilter { + + public static final String SPRING_SECURITY_FORM_DOMAIN_KEY = "domain"; + + @Override + public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) + throws AuthenticationException { + + if (!request.getMethod().equals("POST")) { + throw new AuthenticationServiceException("Authentication method not supported: " + + request.getMethod()); + } + + CustomAuthenticationToken authRequest = getAuthRequest(request); + setDetails(request, authRequest); + return this.getAuthenticationManager().authenticate(authRequest); + } + + private CustomAuthenticationToken getAuthRequest(HttpServletRequest request) { + String username = obtainUsername(request); + String password = obtainPassword(request); + String domain = obtainDomain(request); + + if (username == null) { + username = ""; + } + if (password == null) { + password = ""; + } + if (domain == null) { + domain = ""; + } + + return new CustomAuthenticationToken(username, password, domain); + } + + private String obtainDomain(HttpServletRequest request) { + return request.getParameter(SPRING_SECURITY_FORM_DOMAIN_KEY); + } +} diff --git a/spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/CustomAuthenticationToken.java b/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldscustom/CustomAuthenticationToken.java similarity index 97% rename from spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/CustomAuthenticationToken.java rename to spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldscustom/CustomAuthenticationToken.java index 50995169a1..fd7624d965 100644 --- a/spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/CustomAuthenticationToken.java +++ b/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldscustom/CustomAuthenticationToken.java @@ -1,28 +1,28 @@ -package com.baeldung.loginextrafieldscustom; - -import java.util.Collection; - -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.GrantedAuthority; - -public class CustomAuthenticationToken extends UsernamePasswordAuthenticationToken { - - private String domain; - - public CustomAuthenticationToken(Object principal, Object credentials, String domain) { - super(principal, credentials); - this.domain = domain; - super.setAuthenticated(false); - } - - public CustomAuthenticationToken(Object principal, Object credentials, String domain, - Collection authorities) { - super(principal, credentials, authorities); - this.domain = domain; - super.setAuthenticated(true); // must use super, as we override - } - - public String getDomain() { - return this.domain; - } -} +package com.baeldung.loginextrafieldscustom; + +import java.util.Collection; + +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.GrantedAuthority; + +public class CustomAuthenticationToken extends UsernamePasswordAuthenticationToken { + + private String domain; + + public CustomAuthenticationToken(Object principal, Object credentials, String domain) { + super(principal, credentials); + this.domain = domain; + super.setAuthenticated(false); + } + + public CustomAuthenticationToken(Object principal, Object credentials, String domain, + Collection authorities) { + super(principal, credentials, authorities); + this.domain = domain; + super.setAuthenticated(true); // must use super, as we override + } + + public String getDomain() { + return this.domain; + } +} diff --git a/spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/CustomUserDetailsAuthenticationProvider.java b/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldscustom/CustomUserDetailsAuthenticationProvider.java similarity index 97% rename from spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/CustomUserDetailsAuthenticationProvider.java rename to spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldscustom/CustomUserDetailsAuthenticationProvider.java index 693900d843..85d768aaab 100644 --- a/spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/CustomUserDetailsAuthenticationProvider.java +++ b/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldscustom/CustomUserDetailsAuthenticationProvider.java @@ -1,92 +1,92 @@ -package com.baeldung.loginextrafieldscustom; - -import org.springframework.security.authentication.BadCredentialsException; -import org.springframework.security.authentication.InternalAuthenticationServiceException; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider; -import org.springframework.security.core.AuthenticationException; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UsernameNotFoundException; -import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.util.Assert; - -public class CustomUserDetailsAuthenticationProvider extends AbstractUserDetailsAuthenticationProvider { - - /** - * The plaintext password used to perform - * PasswordEncoder#matches(CharSequence, String)} on when the user is - * not found to avoid SEC-2056. - */ - private static final String USER_NOT_FOUND_PASSWORD = "userNotFoundPassword"; - - private PasswordEncoder passwordEncoder; - private CustomUserDetailsService userDetailsService; - - /** - * The password used to perform - * {@link PasswordEncoder#matches(CharSequence, String)} on when the user is - * not found to avoid SEC-2056. This is necessary, because some - * {@link PasswordEncoder} implementations will short circuit if the password is not - * in a valid format. - */ - private String userNotFoundEncodedPassword; - - public CustomUserDetailsAuthenticationProvider(PasswordEncoder passwordEncoder, CustomUserDetailsService userDetailsService) { - this.passwordEncoder = passwordEncoder; - this.userDetailsService = userDetailsService; - } - - @Override - protected void additionalAuthenticationChecks(UserDetails userDetails, UsernamePasswordAuthenticationToken authentication) - throws AuthenticationException { - - if (authentication.getCredentials() == null) { - logger.debug("Authentication failed: no credentials provided"); - throw new BadCredentialsException( - messages.getMessage("AbstractUserDetailsAuthenticationProvider.badCredentials", "Bad credentials")); - } - - String presentedPassword = authentication.getCredentials() - .toString(); - - if (!passwordEncoder.matches(presentedPassword, userDetails.getPassword())) { - logger.debug("Authentication failed: password does not match stored value"); - throw new BadCredentialsException( - messages.getMessage("AbstractUserDetailsAuthenticationProvider.badCredentials", "Bad credentials")); - } - } - - @Override - protected void doAfterPropertiesSet() throws Exception { - Assert.notNull(this.userDetailsService, "A UserDetailsService must be set"); - this.userNotFoundEncodedPassword = this.passwordEncoder.encode(USER_NOT_FOUND_PASSWORD); - } - - @Override - protected UserDetails retrieveUser(String username, UsernamePasswordAuthenticationToken authentication) - throws AuthenticationException { - CustomAuthenticationToken auth = (CustomAuthenticationToken) authentication; - UserDetails loadedUser; - - try { - loadedUser = this.userDetailsService.loadUserByUsernameAndDomain(auth.getPrincipal() - .toString(), auth.getDomain()); - } catch (UsernameNotFoundException notFound) { - if (authentication.getCredentials() != null) { - String presentedPassword = authentication.getCredentials() - .toString(); - passwordEncoder.matches(presentedPassword, userNotFoundEncodedPassword); - } - throw notFound; - } catch (Exception repositoryProblem) { - throw new InternalAuthenticationServiceException(repositoryProblem.getMessage(), repositoryProblem); - } - - if (loadedUser == null) { - throw new InternalAuthenticationServiceException("UserDetailsService returned null, " - + "which is an interface contract violation"); - } - return loadedUser; - } - -} +package com.baeldung.loginextrafieldscustom; + +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.authentication.InternalAuthenticationServiceException; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.util.Assert; + +public class CustomUserDetailsAuthenticationProvider extends AbstractUserDetailsAuthenticationProvider { + + /** + * The plaintext password used to perform + * PasswordEncoder#matches(CharSequence, String)} on when the user is + * not found to avoid SEC-2056. + */ + private static final String USER_NOT_FOUND_PASSWORD = "userNotFoundPassword"; + + private PasswordEncoder passwordEncoder; + private CustomUserDetailsService userDetailsService; + + /** + * The password used to perform + * {@link PasswordEncoder#matches(CharSequence, String)} on when the user is + * not found to avoid SEC-2056. This is necessary, because some + * {@link PasswordEncoder} implementations will short circuit if the password is not + * in a valid format. + */ + private String userNotFoundEncodedPassword; + + public CustomUserDetailsAuthenticationProvider(PasswordEncoder passwordEncoder, CustomUserDetailsService userDetailsService) { + this.passwordEncoder = passwordEncoder; + this.userDetailsService = userDetailsService; + } + + @Override + protected void additionalAuthenticationChecks(UserDetails userDetails, UsernamePasswordAuthenticationToken authentication) + throws AuthenticationException { + + if (authentication.getCredentials() == null) { + logger.debug("Authentication failed: no credentials provided"); + throw new BadCredentialsException( + messages.getMessage("AbstractUserDetailsAuthenticationProvider.badCredentials", "Bad credentials")); + } + + String presentedPassword = authentication.getCredentials() + .toString(); + + if (!passwordEncoder.matches(presentedPassword, userDetails.getPassword())) { + logger.debug("Authentication failed: password does not match stored value"); + throw new BadCredentialsException( + messages.getMessage("AbstractUserDetailsAuthenticationProvider.badCredentials", "Bad credentials")); + } + } + + @Override + protected void doAfterPropertiesSet() throws Exception { + Assert.notNull(this.userDetailsService, "A UserDetailsService must be set"); + this.userNotFoundEncodedPassword = this.passwordEncoder.encode(USER_NOT_FOUND_PASSWORD); + } + + @Override + protected UserDetails retrieveUser(String username, UsernamePasswordAuthenticationToken authentication) + throws AuthenticationException { + CustomAuthenticationToken auth = (CustomAuthenticationToken) authentication; + UserDetails loadedUser; + + try { + loadedUser = this.userDetailsService.loadUserByUsernameAndDomain(auth.getPrincipal() + .toString(), auth.getDomain()); + } catch (UsernameNotFoundException notFound) { + if (authentication.getCredentials() != null) { + String presentedPassword = authentication.getCredentials() + .toString(); + passwordEncoder.matches(presentedPassword, userNotFoundEncodedPassword); + } + throw notFound; + } catch (Exception repositoryProblem) { + throw new InternalAuthenticationServiceException(repositoryProblem.getMessage(), repositoryProblem); + } + + if (loadedUser == null) { + throw new InternalAuthenticationServiceException("UserDetailsService returned null, " + + "which is an interface contract violation"); + } + return loadedUser; + } + +} diff --git a/spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/CustomUserDetailsService.java b/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldscustom/CustomUserDetailsService.java similarity index 97% rename from spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/CustomUserDetailsService.java rename to spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldscustom/CustomUserDetailsService.java index 358129173d..fa690edade 100644 --- a/spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/CustomUserDetailsService.java +++ b/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldscustom/CustomUserDetailsService.java @@ -1,10 +1,10 @@ -package com.baeldung.loginextrafieldscustom; - -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UsernameNotFoundException; - -public interface CustomUserDetailsService { - - UserDetails loadUserByUsernameAndDomain(String username, String domain) throws UsernameNotFoundException; - -} +package com.baeldung.loginextrafieldscustom; + +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UsernameNotFoundException; + +public interface CustomUserDetailsService { + + UserDetails loadUserByUsernameAndDomain(String username, String domain) throws UsernameNotFoundException; + +} diff --git a/spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/CustomUserDetailsServiceImpl.java b/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldscustom/CustomUserDetailsServiceImpl.java similarity index 97% rename from spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/CustomUserDetailsServiceImpl.java rename to spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldscustom/CustomUserDetailsServiceImpl.java index ea979e2fab..056bd47b20 100644 --- a/spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/CustomUserDetailsServiceImpl.java +++ b/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldscustom/CustomUserDetailsServiceImpl.java @@ -1,30 +1,30 @@ -package com.baeldung.loginextrafieldscustom; - -import org.apache.commons.lang3.StringUtils; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UsernameNotFoundException; -import org.springframework.stereotype.Service; - -@Service("userDetailsService") -public class CustomUserDetailsServiceImpl implements CustomUserDetailsService { - - private UserRepository userRepository; - - public CustomUserDetailsServiceImpl(UserRepository userRepository) { - this.userRepository = userRepository; - } - - @Override - public UserDetails loadUserByUsernameAndDomain(String username, String domain) throws UsernameNotFoundException { - if (StringUtils.isAnyBlank(username, domain)) { - throw new UsernameNotFoundException("Username and domain must be provided"); - } - User user = userRepository.findUser(username, domain); - if (user == null) { - throw new UsernameNotFoundException( - String.format("Username not found for domain, username=%s, domain=%s", - username, domain)); - } - return user; - } -} +package com.baeldung.loginextrafieldscustom; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; + +@Service("userDetailsService") +public class CustomUserDetailsServiceImpl implements CustomUserDetailsService { + + private UserRepository userRepository; + + public CustomUserDetailsServiceImpl(UserRepository userRepository) { + this.userRepository = userRepository; + } + + @Override + public UserDetails loadUserByUsernameAndDomain(String username, String domain) throws UsernameNotFoundException { + if (StringUtils.isAnyBlank(username, domain)) { + throw new UsernameNotFoundException("Username and domain must be provided"); + } + User user = userRepository.findUser(username, domain); + if (user == null) { + throw new UsernameNotFoundException( + String.format("Username not found for domain, username=%s, domain=%s", + username, domain)); + } + return user; + } +} diff --git a/spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/CustomUserRepository.java b/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldscustom/CustomUserRepository.java similarity index 92% rename from spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/CustomUserRepository.java rename to spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldscustom/CustomUserRepository.java index effc750940..fbc2851dc1 100644 --- a/spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/CustomUserRepository.java +++ b/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldscustom/CustomUserRepository.java @@ -1,33 +1,33 @@ -package com.baeldung.loginextrafieldscustom; - -import java.util.ArrayList; -import java.util.Collection; - -import org.apache.commons.lang3.StringUtils; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.stereotype.Repository; - -@Repository("userRepository") -public class CustomUserRepository implements UserRepository { - - private PasswordEncoder passwordEncoder; - - public CustomUserRepository(PasswordEncoder passwordEncoder) { - this.passwordEncoder = passwordEncoder; - } - - @Override - public User findUser(String username, String domain) { - if (StringUtils.isAnyBlank(username, domain)) { - return null; - } else { - Collection authorities = new ArrayList<>(); - User user = new User(username, domain, - passwordEncoder.encode("secret"), true, - true, true, true, authorities); - return user; - } - } - -} +package com.baeldung.loginextrafieldscustom; + +import java.util.ArrayList; +import java.util.Collection; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Repository; + +@Repository("userRepository") +public class CustomUserRepository implements UserRepository { + + private PasswordEncoder passwordEncoder; + + public CustomUserRepository(PasswordEncoder passwordEncoder) { + this.passwordEncoder = passwordEncoder; + } + + @Override + public User findUser(String username, String domain) { + if (StringUtils.isAnyBlank(username, domain)) { + return null; + } else { + Collection authorities = new ArrayList<>(); + User user = new User(username, domain, + passwordEncoder.encode("secret"), true, + true, true, true, authorities); + return user; + } + } + +} diff --git a/spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/ExtraLoginFieldsApplication.java b/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldscustom/ExtraLoginFieldsApplication.java similarity index 100% rename from spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/ExtraLoginFieldsApplication.java rename to spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldscustom/ExtraLoginFieldsApplication.java diff --git a/spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/PasswordEncoderConfiguration.java b/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldscustom/PasswordEncoderConfiguration.java similarity index 100% rename from spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/PasswordEncoderConfiguration.java rename to spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldscustom/PasswordEncoderConfiguration.java diff --git a/spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/SecurityConfig.java b/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldscustom/SecurityConfig.java similarity index 97% rename from spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/SecurityConfig.java rename to spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldscustom/SecurityConfig.java index e7b56e5763..d20b7a10dc 100644 --- a/spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/SecurityConfig.java +++ b/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldscustom/SecurityConfig.java @@ -1,63 +1,63 @@ -package com.baeldung.loginextrafieldscustom; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.PropertySource; -import org.springframework.security.authentication.AuthenticationProvider; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; -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.crypto.bcrypt.BCryptPasswordEncoder; -import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler; -import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; - -@EnableWebSecurity -@PropertySource("classpath:/application-extrafields.properties") -public class SecurityConfig extends WebSecurityConfigurerAdapter { - - @Autowired - private CustomUserDetailsService userDetailsService; - - @Autowired - private PasswordEncoder passwordEncoder; - - @Override - protected void configure(HttpSecurity http) throws Exception { - - http - .addFilterBefore(authenticationFilter(), UsernamePasswordAuthenticationFilter.class) - .authorizeRequests() - .antMatchers("/css/**", "/index").permitAll() - .antMatchers("/user/**").authenticated() - .and() - .formLogin().loginPage("/login") - .and() - .logout() - .logoutUrl("/logout"); - } - - public CustomAuthenticationFilter authenticationFilter() throws Exception { - CustomAuthenticationFilter filter = new CustomAuthenticationFilter(); - filter.setAuthenticationManager(authenticationManagerBean()); - filter.setAuthenticationFailureHandler(failureHandler()); - return filter; - } - - @Autowired - public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { - auth.authenticationProvider(authProvider()); - } - - public AuthenticationProvider authProvider() { - CustomUserDetailsAuthenticationProvider provider - = new CustomUserDetailsAuthenticationProvider(passwordEncoder, userDetailsService); - return provider; - } - - public SimpleUrlAuthenticationFailureHandler failureHandler() { - return new SimpleUrlAuthenticationFailureHandler("/login?error=true"); - } - -} +package com.baeldung.loginextrafieldscustom; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.PropertySource; +import org.springframework.security.authentication.AuthenticationProvider; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +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.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; + +@EnableWebSecurity +@PropertySource("classpath:/application-extrafields.properties") +public class SecurityConfig extends WebSecurityConfigurerAdapter { + + @Autowired + private CustomUserDetailsService userDetailsService; + + @Autowired + private PasswordEncoder passwordEncoder; + + @Override + protected void configure(HttpSecurity http) throws Exception { + + http + .addFilterBefore(authenticationFilter(), UsernamePasswordAuthenticationFilter.class) + .authorizeRequests() + .antMatchers("/css/**", "/index").permitAll() + .antMatchers("/user/**").authenticated() + .and() + .formLogin().loginPage("/login") + .and() + .logout() + .logoutUrl("/logout"); + } + + public CustomAuthenticationFilter authenticationFilter() throws Exception { + CustomAuthenticationFilter filter = new CustomAuthenticationFilter(); + filter.setAuthenticationManager(authenticationManagerBean()); + filter.setAuthenticationFailureHandler(failureHandler()); + return filter; + } + + @Autowired + public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { + auth.authenticationProvider(authProvider()); + } + + public AuthenticationProvider authProvider() { + CustomUserDetailsAuthenticationProvider provider + = new CustomUserDetailsAuthenticationProvider(passwordEncoder, userDetailsService); + return provider; + } + + public SimpleUrlAuthenticationFailureHandler failureHandler() { + return new SimpleUrlAuthenticationFailureHandler("/login?error=true"); + } + +} diff --git a/spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/User.java b/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldscustom/User.java similarity index 97% rename from spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/User.java rename to spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldscustom/User.java index aa03f15b6a..be4730592b 100644 --- a/spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/User.java +++ b/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldscustom/User.java @@ -1,23 +1,23 @@ -package com.baeldung.loginextrafieldscustom; - -import java.util.Collection; - -import org.springframework.security.core.GrantedAuthority; - -public class User extends org.springframework.security.core.userdetails.User { - - private static final long serialVersionUID = 1L; - - private String domain; - - public User(String username, String domain, String password, boolean enabled, - boolean accountNonExpired, boolean credentialsNonExpired, - boolean accountNonLocked, Collection authorities) { - super(username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities); - this.domain = domain; - } - - public String getDomain() { - return domain; - } -} +package com.baeldung.loginextrafieldscustom; + +import java.util.Collection; + +import org.springframework.security.core.GrantedAuthority; + +public class User extends org.springframework.security.core.userdetails.User { + + private static final long serialVersionUID = 1L; + + private String domain; + + public User(String username, String domain, String password, boolean enabled, + boolean accountNonExpired, boolean credentialsNonExpired, + boolean accountNonLocked, Collection authorities) { + super(username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities); + this.domain = domain; + } + + public String getDomain() { + return domain; + } +} diff --git a/spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/UserRepository.java b/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldscustom/UserRepository.java similarity index 95% rename from spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/UserRepository.java rename to spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldscustom/UserRepository.java index e2358e055b..a6dea786f0 100644 --- a/spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/UserRepository.java +++ b/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldscustom/UserRepository.java @@ -1,7 +1,7 @@ -package com.baeldung.loginextrafieldscustom; - -public interface UserRepository { - - public User findUser(String username, String domain); - -} +package com.baeldung.loginextrafieldscustom; + +public interface UserRepository { + + public User findUser(String username, String domain); + +} diff --git a/spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/WebController.java b/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldscustom/WebController.java similarity index 96% rename from spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/WebController.java rename to spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldscustom/WebController.java index b5e0b511ac..4f0d4013ff 100644 --- a/spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldscustom/WebController.java +++ b/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldscustom/WebController.java @@ -1,51 +1,51 @@ -package com.baeldung.loginextrafieldscustom; - -import java.util.Optional; - -import org.springframework.security.authentication.AnonymousAuthenticationToken; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.RequestMapping; - -@Controller -public class WebController { - - @RequestMapping("/") - public String root() { - return "redirect:/index"; - } - - @RequestMapping("/index") - public String index(Model model) { - getDomain().ifPresent(d -> { - model.addAttribute("domain", d); - }); - return "index"; - } - - @RequestMapping("/user/index") - public String userIndex(Model model) { - getDomain().ifPresent(d -> { - model.addAttribute("domain", d); - }); - return "user/index"; - } - - @RequestMapping("/login") - public String login() { - return "login"; - } - - private Optional getDomain() { - Authentication auth = SecurityContextHolder.getContext() - .getAuthentication(); - String domain = null; - if (auth != null && !auth.getClass().equals(AnonymousAuthenticationToken.class)) { - User user = (User) auth.getPrincipal(); - domain = user.getDomain(); - } - return Optional.ofNullable(domain); - } -} +package com.baeldung.loginextrafieldscustom; + +import java.util.Optional; + +import org.springframework.security.authentication.AnonymousAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class WebController { + + @RequestMapping("/") + public String root() { + return "redirect:/index"; + } + + @RequestMapping("/index") + public String index(Model model) { + getDomain().ifPresent(d -> { + model.addAttribute("domain", d); + }); + return "index"; + } + + @RequestMapping("/user/index") + public String userIndex(Model model) { + getDomain().ifPresent(d -> { + model.addAttribute("domain", d); + }); + return "user/index"; + } + + @RequestMapping("/login") + public String login() { + return "login"; + } + + private Optional getDomain() { + Authentication auth = SecurityContextHolder.getContext() + .getAuthentication(); + String domain = null; + if (auth != null && !auth.getClass().equals(AnonymousAuthenticationToken.class)) { + User user = (User) auth.getPrincipal(); + domain = user.getDomain(); + } + return Optional.ofNullable(domain); + } +} diff --git a/spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldssimple/ExtraLoginFieldsApplication.java b/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldssimple/ExtraLoginFieldsApplication.java similarity index 100% rename from spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldssimple/ExtraLoginFieldsApplication.java rename to spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldssimple/ExtraLoginFieldsApplication.java diff --git a/spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldssimple/PasswordEncoderConfiguration.java b/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldssimple/PasswordEncoderConfiguration.java similarity index 100% rename from spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldssimple/PasswordEncoderConfiguration.java rename to spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldssimple/PasswordEncoderConfiguration.java diff --git a/spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldssimple/SecurityConfig.java b/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldssimple/SecurityConfig.java similarity index 97% rename from spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldssimple/SecurityConfig.java rename to spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldssimple/SecurityConfig.java index 6d3d51ad30..2989a4bbc6 100644 --- a/spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldssimple/SecurityConfig.java +++ b/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldssimple/SecurityConfig.java @@ -1,66 +1,66 @@ -package com.baeldung.loginextrafieldssimple; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.PropertySource; -import org.springframework.security.authentication.AuthenticationProvider; -import org.springframework.security.authentication.dao.DaoAuthenticationProvider; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; -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.core.userdetails.UserDetailsService; -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; -import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler; -import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; - -@EnableWebSecurity -@PropertySource("classpath:/application-extrafields.properties") -public class SecurityConfig extends WebSecurityConfigurerAdapter { - - @Autowired - private UserDetailsService userDetailsService; - - @Autowired - private PasswordEncoder passwordEncoder; - - @Override - protected void configure(HttpSecurity http) throws Exception { - - http - .addFilterBefore(authenticationFilter(), UsernamePasswordAuthenticationFilter.class) - .authorizeRequests() - .antMatchers("/css/**", "/index").permitAll() - .antMatchers("/user/**").authenticated() - .and() - .formLogin().loginPage("/login") - .and() - .logout() - .logoutUrl("/logout"); - } - - public SimpleAuthenticationFilter authenticationFilter() throws Exception { - SimpleAuthenticationFilter filter = new SimpleAuthenticationFilter(); - filter.setAuthenticationManager(authenticationManagerBean()); - filter.setAuthenticationFailureHandler(failureHandler()); - return filter; - } - - @Autowired - public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { - auth.authenticationProvider(authProvider()); - } - - public AuthenticationProvider authProvider() { - DaoAuthenticationProvider provider = new DaoAuthenticationProvider(); - provider.setUserDetailsService(userDetailsService); - provider.setPasswordEncoder(passwordEncoder); - return provider; - } - - public SimpleUrlAuthenticationFailureHandler failureHandler() { - return new SimpleUrlAuthenticationFailureHandler("/login?error=true"); - } - -} +package com.baeldung.loginextrafieldssimple; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.PropertySource; +import org.springframework.security.authentication.AuthenticationProvider; +import org.springframework.security.authentication.dao.DaoAuthenticationProvider; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +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.core.userdetails.UserDetailsService; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; + +@EnableWebSecurity +@PropertySource("classpath:/application-extrafields.properties") +public class SecurityConfig extends WebSecurityConfigurerAdapter { + + @Autowired + private UserDetailsService userDetailsService; + + @Autowired + private PasswordEncoder passwordEncoder; + + @Override + protected void configure(HttpSecurity http) throws Exception { + + http + .addFilterBefore(authenticationFilter(), UsernamePasswordAuthenticationFilter.class) + .authorizeRequests() + .antMatchers("/css/**", "/index").permitAll() + .antMatchers("/user/**").authenticated() + .and() + .formLogin().loginPage("/login") + .and() + .logout() + .logoutUrl("/logout"); + } + + public SimpleAuthenticationFilter authenticationFilter() throws Exception { + SimpleAuthenticationFilter filter = new SimpleAuthenticationFilter(); + filter.setAuthenticationManager(authenticationManagerBean()); + filter.setAuthenticationFailureHandler(failureHandler()); + return filter; + } + + @Autowired + public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { + auth.authenticationProvider(authProvider()); + } + + public AuthenticationProvider authProvider() { + DaoAuthenticationProvider provider = new DaoAuthenticationProvider(); + provider.setUserDetailsService(userDetailsService); + provider.setPasswordEncoder(passwordEncoder); + return provider; + } + + public SimpleUrlAuthenticationFailureHandler failureHandler() { + return new SimpleUrlAuthenticationFailureHandler("/login?error=true"); + } + +} diff --git a/spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldssimple/SimpleAuthenticationFilter.java b/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldssimple/SimpleAuthenticationFilter.java similarity index 97% rename from spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldssimple/SimpleAuthenticationFilter.java rename to spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldssimple/SimpleAuthenticationFilter.java index 9dcb524157..7e21e1b82e 100644 --- a/spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldssimple/SimpleAuthenticationFilter.java +++ b/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldssimple/SimpleAuthenticationFilter.java @@ -1,54 +1,54 @@ -package com.baeldung.loginextrafieldssimple; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.springframework.security.authentication.AuthenticationServiceException; -import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.AuthenticationException; -import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; - -public class SimpleAuthenticationFilter extends UsernamePasswordAuthenticationFilter { - - public static final String SPRING_SECURITY_FORM_DOMAIN_KEY = "domain"; - - @Override - public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) - throws AuthenticationException { - - if (!request.getMethod() - .equals("POST")) { - throw new AuthenticationServiceException("Authentication method not supported: " + request.getMethod()); - } - - UsernamePasswordAuthenticationToken authRequest = getAuthRequest(request); - setDetails(request, authRequest); - return this.getAuthenticationManager() - .authenticate(authRequest); - } - - private UsernamePasswordAuthenticationToken getAuthRequest(HttpServletRequest request) { - String username = obtainUsername(request); - String password = obtainPassword(request); - String domain = obtainDomain(request); - - if (username == null) { - username = ""; - } - if (password == null) { - password = ""; - } - if (domain == null) { - domain = ""; - } - - String usernameDomain = String.format("%s%s%s", username.trim(), - String.valueOf(Character.LINE_SEPARATOR), domain); - return new UsernamePasswordAuthenticationToken(usernameDomain, password); - } - - private String obtainDomain(HttpServletRequest request) { - return request.getParameter(SPRING_SECURITY_FORM_DOMAIN_KEY); - } -} +package com.baeldung.loginextrafieldssimple; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.security.authentication.AuthenticationServiceException; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; + +public class SimpleAuthenticationFilter extends UsernamePasswordAuthenticationFilter { + + public static final String SPRING_SECURITY_FORM_DOMAIN_KEY = "domain"; + + @Override + public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) + throws AuthenticationException { + + if (!request.getMethod() + .equals("POST")) { + throw new AuthenticationServiceException("Authentication method not supported: " + request.getMethod()); + } + + UsernamePasswordAuthenticationToken authRequest = getAuthRequest(request); + setDetails(request, authRequest); + return this.getAuthenticationManager() + .authenticate(authRequest); + } + + private UsernamePasswordAuthenticationToken getAuthRequest(HttpServletRequest request) { + String username = obtainUsername(request); + String password = obtainPassword(request); + String domain = obtainDomain(request); + + if (username == null) { + username = ""; + } + if (password == null) { + password = ""; + } + if (domain == null) { + domain = ""; + } + + String usernameDomain = String.format("%s%s%s", username.trim(), + String.valueOf(Character.LINE_SEPARATOR), domain); + return new UsernamePasswordAuthenticationToken(usernameDomain, password); + } + + private String obtainDomain(HttpServletRequest request) { + return request.getParameter(SPRING_SECURITY_FORM_DOMAIN_KEY); + } +} diff --git a/spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldssimple/SimpleUserDetailsService.java b/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldssimple/SimpleUserDetailsService.java similarity index 97% rename from spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldssimple/SimpleUserDetailsService.java rename to spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldssimple/SimpleUserDetailsService.java index 2fad50ad01..25fc5c3572 100644 --- a/spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldssimple/SimpleUserDetailsService.java +++ b/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldssimple/SimpleUserDetailsService.java @@ -1,32 +1,32 @@ -package com.baeldung.loginextrafieldssimple; - -import org.apache.commons.lang3.StringUtils; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.security.core.userdetails.UsernameNotFoundException; -import org.springframework.stereotype.Service; - -@Service("userDetailsService") -public class SimpleUserDetailsService implements UserDetailsService { - - private UserRepository userRepository; - - public SimpleUserDetailsService(UserRepository userRepository) { - this.userRepository = userRepository; - } - - @Override - public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { - String[] usernameAndDomain = StringUtils.split(username, String.valueOf(Character.LINE_SEPARATOR)); - if (usernameAndDomain == null || usernameAndDomain.length != 2) { - throw new UsernameNotFoundException("Username and domain must be provided"); - } - User user = userRepository.findUser(usernameAndDomain[0], usernameAndDomain[1]); - if (user == null) { - throw new UsernameNotFoundException( - String.format("Username not found for domain, username=%s, domain=%s", - usernameAndDomain[0], usernameAndDomain[1])); - } - return user; - } -} +package com.baeldung.loginextrafieldssimple; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; + +@Service("userDetailsService") +public class SimpleUserDetailsService implements UserDetailsService { + + private UserRepository userRepository; + + public SimpleUserDetailsService(UserRepository userRepository) { + this.userRepository = userRepository; + } + + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + String[] usernameAndDomain = StringUtils.split(username, String.valueOf(Character.LINE_SEPARATOR)); + if (usernameAndDomain == null || usernameAndDomain.length != 2) { + throw new UsernameNotFoundException("Username and domain must be provided"); + } + User user = userRepository.findUser(usernameAndDomain[0], usernameAndDomain[1]); + if (user == null) { + throw new UsernameNotFoundException( + String.format("Username not found for domain, username=%s, domain=%s", + usernameAndDomain[0], usernameAndDomain[1])); + } + return user; + } +} diff --git a/spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldssimple/SimpleUserRepository.java b/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldssimple/SimpleUserRepository.java similarity index 96% rename from spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldssimple/SimpleUserRepository.java rename to spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldssimple/SimpleUserRepository.java index 44929c6189..4a597c7146 100644 --- a/spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldssimple/SimpleUserRepository.java +++ b/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldssimple/SimpleUserRepository.java @@ -1,33 +1,33 @@ -package com.baeldung.loginextrafieldssimple; - -import java.util.ArrayList; -import java.util.Collection; - -import org.apache.commons.lang3.StringUtils; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.crypto.password.PasswordEncoder; -import org.springframework.stereotype.Repository; - -@Repository("userRepository") -public class SimpleUserRepository implements UserRepository { - - private PasswordEncoder passwordEncoder; - - public SimpleUserRepository(PasswordEncoder passwordEncoder) { - this.passwordEncoder = passwordEncoder; - } - - @Override - public User findUser(String username, String domain) { - if (StringUtils.isAnyBlank(username, domain)) { - return null; - } else { - Collection authorities = new ArrayList<>(); - User user = new User(username, domain, - passwordEncoder.encode("secret"), true, - true, true, true, authorities); - return user; - } - } - -} +package com.baeldung.loginextrafieldssimple; + +import java.util.ArrayList; +import java.util.Collection; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Repository; + +@Repository("userRepository") +public class SimpleUserRepository implements UserRepository { + + private PasswordEncoder passwordEncoder; + + public SimpleUserRepository(PasswordEncoder passwordEncoder) { + this.passwordEncoder = passwordEncoder; + } + + @Override + public User findUser(String username, String domain) { + if (StringUtils.isAnyBlank(username, domain)) { + return null; + } else { + Collection authorities = new ArrayList<>(); + User user = new User(username, domain, + passwordEncoder.encode("secret"), true, + true, true, true, authorities); + return user; + } + } + +} diff --git a/spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldssimple/User.java b/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldssimple/User.java similarity index 97% rename from spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldssimple/User.java rename to spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldssimple/User.java index b76da65638..b5c790d2bc 100644 --- a/spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldssimple/User.java +++ b/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldssimple/User.java @@ -1,21 +1,21 @@ -package com.baeldung.loginextrafieldssimple; - -import java.util.Collection; - -import org.springframework.security.core.GrantedAuthority; - -public class User extends org.springframework.security.core.userdetails.User { - - private String domain; - - public User(String username, String domain, String password, boolean enabled, - boolean accountNonExpired, boolean credentialsNonExpired, - boolean accountNonLocked, Collection authorities) { - super(username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities); - this.domain = domain; - } - - public String getDomain() { - return domain; - } -} +package com.baeldung.loginextrafieldssimple; + +import java.util.Collection; + +import org.springframework.security.core.GrantedAuthority; + +public class User extends org.springframework.security.core.userdetails.User { + + private String domain; + + public User(String username, String domain, String password, boolean enabled, + boolean accountNonExpired, boolean credentialsNonExpired, + boolean accountNonLocked, Collection authorities) { + super(username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities); + this.domain = domain; + } + + public String getDomain() { + return domain; + } +} diff --git a/spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldssimple/UserRepository.java b/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldssimple/UserRepository.java similarity index 95% rename from spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldssimple/UserRepository.java rename to spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldssimple/UserRepository.java index 919e611b9c..02dfe9779a 100644 --- a/spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldssimple/UserRepository.java +++ b/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldssimple/UserRepository.java @@ -1,7 +1,7 @@ -package com.baeldung.loginextrafieldssimple; - -public interface UserRepository { - - public User findUser(String username, String domain); - -} +package com.baeldung.loginextrafieldssimple; + +public interface UserRepository { + + public User findUser(String username, String domain); + +} diff --git a/spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldssimple/WebController.java b/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldssimple/WebController.java similarity index 96% rename from spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldssimple/WebController.java rename to spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldssimple/WebController.java index 1b17de7bec..82add8f2e6 100644 --- a/spring-security-modules/spring-5-security/src/main/java/com/baeldung/loginextrafieldssimple/WebController.java +++ b/spring-security-modules/spring-security-web-login/src/main/java/com/baeldung/loginextrafieldssimple/WebController.java @@ -1,51 +1,51 @@ -package com.baeldung.loginextrafieldssimple; - -import java.util.Optional; - -import org.springframework.security.authentication.AnonymousAuthenticationToken; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.RequestMapping; - -@Controller -public class WebController { - - @RequestMapping("/") - public String root() { - return "redirect:/index"; - } - - @RequestMapping("/index") - public String index(Model model) { - getDomain().ifPresent(d -> { - model.addAttribute("domain", d); - }); - return "index"; - } - - @RequestMapping("/user/index") - public String userIndex(Model model) { - getDomain().ifPresent(d -> { - model.addAttribute("domain", d); - }); - return "user/index"; - } - - @RequestMapping("/login") - public String login() { - return "login"; - } - - private Optional getDomain() { - Authentication auth = SecurityContextHolder.getContext() - .getAuthentication(); - String domain = null; - if (auth != null && !auth.getClass().equals(AnonymousAuthenticationToken.class)) { - User user = (User) auth.getPrincipal(); - domain = user.getDomain(); - } - return Optional.ofNullable(domain); - } -} +package com.baeldung.loginextrafieldssimple; + +import java.util.Optional; + +import org.springframework.security.authentication.AnonymousAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class WebController { + + @RequestMapping("/") + public String root() { + return "redirect:/index"; + } + + @RequestMapping("/index") + public String index(Model model) { + getDomain().ifPresent(d -> { + model.addAttribute("domain", d); + }); + return "index"; + } + + @RequestMapping("/user/index") + public String userIndex(Model model) { + getDomain().ifPresent(d -> { + model.addAttribute("domain", d); + }); + return "user/index"; + } + + @RequestMapping("/login") + public String login() { + return "login"; + } + + private Optional getDomain() { + Authentication auth = SecurityContextHolder.getContext() + .getAuthentication(); + String domain = null; + if (auth != null && !auth.getClass().equals(AnonymousAuthenticationToken.class)) { + User user = (User) auth.getPrincipal(); + domain = user.getDomain(); + } + return Optional.ofNullable(domain); + } +} diff --git a/spring-security-modules/spring-5-security/src/main/resources/application-extrafields.properties b/spring-security-modules/spring-security-web-login/src/main/resources/application-extrafields.properties similarity index 100% rename from spring-security-modules/spring-5-security/src/main/resources/application-extrafields.properties rename to spring-security-modules/spring-security-web-login/src/main/resources/application-extrafields.properties diff --git a/spring-security-modules/spring-security-web-login/src/main/resources/application.properties b/spring-security-modules/spring-security-web-login/src/main/resources/application.properties new file mode 100644 index 0000000000..8159ace060 --- /dev/null +++ b/spring-security-modules/spring-security-web-login/src/main/resources/application.properties @@ -0,0 +1,7 @@ +server.port=8081 + +logging.level.root=INFO + +logging.level.com.baeldung.dsl.ClientErrorLoggingFilter=DEBUG + +logging.level.org.springframework.security=DEBUG \ No newline at end of file diff --git a/spring-security-modules/spring-5-security/src/main/resources/static/css/main.css b/spring-security-modules/spring-security-web-login/src/main/resources/static/css/main.css similarity index 100% rename from spring-security-modules/spring-5-security/src/main/resources/static/css/main.css rename to spring-security-modules/spring-security-web-login/src/main/resources/static/css/main.css diff --git a/spring-security-modules/spring-5-security/src/main/resources/templatesextrafields/index.html b/spring-security-modules/spring-security-web-login/src/main/resources/templatesextrafields/index.html similarity index 100% rename from spring-security-modules/spring-5-security/src/main/resources/templatesextrafields/index.html rename to spring-security-modules/spring-security-web-login/src/main/resources/templatesextrafields/index.html diff --git a/spring-security-modules/spring-5-security/src/main/resources/templatesextrafields/login.html b/spring-security-modules/spring-security-web-login/src/main/resources/templatesextrafields/login.html similarity index 100% rename from spring-security-modules/spring-5-security/src/main/resources/templatesextrafields/login.html rename to spring-security-modules/spring-security-web-login/src/main/resources/templatesextrafields/login.html diff --git a/spring-security-modules/spring-5-security/src/main/resources/templatesextrafields/user/index.html b/spring-security-modules/spring-security-web-login/src/main/resources/templatesextrafields/user/index.html similarity index 100% rename from spring-security-modules/spring-5-security/src/main/resources/templatesextrafields/user/index.html rename to spring-security-modules/spring-security-web-login/src/main/resources/templatesextrafields/user/index.html diff --git a/spring-security-modules/spring-5-security/src/test/java/com/baeldung/loginextrafields/AbstractExtraLoginFieldsIntegrationTest.java b/spring-security-modules/spring-security-web-login/src/test/java/com/baeldung/loginextrafields/AbstractExtraLoginFieldsIntegrationTest.java similarity index 97% rename from spring-security-modules/spring-5-security/src/test/java/com/baeldung/loginextrafields/AbstractExtraLoginFieldsIntegrationTest.java rename to spring-security-modules/spring-security-web-login/src/test/java/com/baeldung/loginextrafields/AbstractExtraLoginFieldsIntegrationTest.java index c46cbd8113..f8b1097b7a 100644 --- a/spring-security-modules/spring-5-security/src/test/java/com/baeldung/loginextrafields/AbstractExtraLoginFieldsIntegrationTest.java +++ b/spring-security-modules/spring-security-web-login/src/test/java/com/baeldung/loginextrafields/AbstractExtraLoginFieldsIntegrationTest.java @@ -1,46 +1,46 @@ -package com.baeldung.loginextrafields; - -import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.redirectedUrlPattern; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -import org.junit.Before; -import org.junit.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.web.FilterChainProxy; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import org.springframework.web.context.WebApplicationContext; - -public abstract class AbstractExtraLoginFieldsIntegrationTest { - - @Autowired - private FilterChainProxy springSecurityFilterChain; - - @Autowired - private WebApplicationContext wac; - - protected MockMvc mockMvc; - - @Before - public void setup() { - this.mockMvc = MockMvcBuilders.webAppContextSetup(wac) - .apply(springSecurity(springSecurityFilterChain)) - .build(); - } - - @Test - public void givenRootPathAccess_thenRedirectToIndex() throws Exception { - this.mockMvc.perform(get("/")) - .andExpect(status().is3xxRedirection()) - .andExpect(redirectedUrlPattern("/index*")); - } - - @Test - public void givenSecuredResource_whenAccessUnauthenticated_thenRequiresAuthentication() throws Exception { - this.mockMvc.perform(get("/user/index")) - .andExpect(status().is3xxRedirection()) - .andExpect(redirectedUrlPattern("**/login")); - } -} +package com.baeldung.loginextrafields; + +import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.redirectedUrlPattern; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import org.junit.Before; +import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.web.FilterChainProxy; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; + +public abstract class AbstractExtraLoginFieldsIntegrationTest { + + @Autowired + private FilterChainProxy springSecurityFilterChain; + + @Autowired + private WebApplicationContext wac; + + protected MockMvc mockMvc; + + @Before + public void setup() { + this.mockMvc = MockMvcBuilders.webAppContextSetup(wac) + .apply(springSecurity(springSecurityFilterChain)) + .build(); + } + + @Test + public void givenRootPathAccess_thenRedirectToIndex() throws Exception { + this.mockMvc.perform(get("/")) + .andExpect(status().is3xxRedirection()) + .andExpect(redirectedUrlPattern("/index*")); + } + + @Test + public void givenSecuredResource_whenAccessUnauthenticated_thenRequiresAuthentication() throws Exception { + this.mockMvc.perform(get("/user/index")) + .andExpect(status().is3xxRedirection()) + .andExpect(redirectedUrlPattern("**/login")); + } +} diff --git a/spring-security-modules/spring-5-security/src/test/java/com/baeldung/loginextrafields/LoginFieldsFullIntegrationTest.java b/spring-security-modules/spring-security-web-login/src/test/java/com/baeldung/loginextrafields/LoginFieldsFullIntegrationTest.java similarity index 97% rename from spring-security-modules/spring-5-security/src/test/java/com/baeldung/loginextrafields/LoginFieldsFullIntegrationTest.java rename to spring-security-modules/spring-security-web-login/src/test/java/com/baeldung/loginextrafields/LoginFieldsFullIntegrationTest.java index 54aece3b03..63c4e98505 100644 --- a/spring-security-modules/spring-5-security/src/test/java/com/baeldung/loginextrafields/LoginFieldsFullIntegrationTest.java +++ b/spring-security-modules/spring-security-web-login/src/test/java/com/baeldung/loginextrafields/LoginFieldsFullIntegrationTest.java @@ -1,72 +1,72 @@ -package com.baeldung.loginextrafields; - -import static org.junit.Assert.assertEquals; -import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.redirectedUrlPattern; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -import java.util.ArrayList; -import java.util.Collection; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.mock.web.MockHttpSession; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.context.SecurityContext; -import org.springframework.security.web.context.HttpSessionSecurityContextRepository; -import org.springframework.test.context.junit.jupiter.web.SpringJUnitWebConfig; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.test.web.servlet.MvcResult; -import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; - -import com.baeldung.loginextrafieldscustom.ExtraLoginFieldsApplication; -import com.baeldung.loginextrafieldscustom.User; - -@RunWith(SpringRunner.class) -@SpringJUnitWebConfig -@SpringBootTest(classes = ExtraLoginFieldsApplication.class) -public class LoginFieldsFullIntegrationTest extends AbstractExtraLoginFieldsIntegrationTest { - - @Test - public void givenAccessSecuredResource_whenAuthenticated_thenAuthHasExtraFields() throws Exception { - MockHttpServletRequestBuilder securedResourceAccess = get("/user/index"); - MvcResult unauthenticatedResult = mockMvc.perform(securedResourceAccess) - .andExpect(status().is3xxRedirection()) - .andReturn(); - - MockHttpSession session = (MockHttpSession) unauthenticatedResult.getRequest() - .getSession(); - String loginUrl = unauthenticatedResult.getResponse() - .getRedirectedUrl(); - - User user = getUser(); - - mockMvc.perform(post(loginUrl) - .param("username", user.getUsername()) - .param("password", user.getPassword()) - .param("domain", user.getDomain()) - .session(session) - .with(csrf())) - .andExpect(status().is3xxRedirection()) - .andExpect(redirectedUrlPattern("**/user/index")) - .andReturn(); - - mockMvc.perform(securedResourceAccess.session(session)) - .andExpect(status().isOk()); - - SecurityContext securityContext - = (SecurityContext) session.getAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY); - Authentication auth = securityContext.getAuthentication(); - assertEquals(((User)auth.getPrincipal()).getDomain(), user.getDomain()); - } - - private User getUser() { - Collection authorities = new ArrayList<>(); - return new User("myusername", "mydomain", "secret", true, true, true, true, authorities); - } - -} +package com.baeldung.loginextrafields; + +import static org.junit.Assert.assertEquals; +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.redirectedUrlPattern; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import java.util.ArrayList; +import java.util.Collection; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.mock.web.MockHttpSession; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.web.context.HttpSessionSecurityContextRepository; +import org.springframework.test.context.junit.jupiter.web.SpringJUnitWebConfig; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MvcResult; +import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; + +import com.baeldung.loginextrafieldscustom.ExtraLoginFieldsApplication; +import com.baeldung.loginextrafieldscustom.User; + +@RunWith(SpringRunner.class) +@SpringJUnitWebConfig +@SpringBootTest(classes = ExtraLoginFieldsApplication.class) +public class LoginFieldsFullIntegrationTest extends AbstractExtraLoginFieldsIntegrationTest { + + @Test + public void givenAccessSecuredResource_whenAuthenticated_thenAuthHasExtraFields() throws Exception { + MockHttpServletRequestBuilder securedResourceAccess = get("/user/index"); + MvcResult unauthenticatedResult = mockMvc.perform(securedResourceAccess) + .andExpect(status().is3xxRedirection()) + .andReturn(); + + MockHttpSession session = (MockHttpSession) unauthenticatedResult.getRequest() + .getSession(); + String loginUrl = unauthenticatedResult.getResponse() + .getRedirectedUrl(); + + User user = getUser(); + + mockMvc.perform(post(loginUrl) + .param("username", user.getUsername()) + .param("password", user.getPassword()) + .param("domain", user.getDomain()) + .session(session) + .with(csrf())) + .andExpect(status().is3xxRedirection()) + .andExpect(redirectedUrlPattern("**/user/index")) + .andReturn(); + + mockMvc.perform(securedResourceAccess.session(session)) + .andExpect(status().isOk()); + + SecurityContext securityContext + = (SecurityContext) session.getAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY); + Authentication auth = securityContext.getAuthentication(); + assertEquals(((User)auth.getPrincipal()).getDomain(), user.getDomain()); + } + + private User getUser() { + Collection authorities = new ArrayList<>(); + return new User("myusername", "mydomain", "secret", true, true, true, true, authorities); + } + +} diff --git a/spring-security-modules/spring-5-security/src/test/java/com/baeldung/loginextrafields/LoginFieldsSimpleIntegrationTest.java b/spring-security-modules/spring-security-web-login/src/test/java/com/baeldung/loginextrafields/LoginFieldsSimpleIntegrationTest.java similarity index 97% rename from spring-security-modules/spring-5-security/src/test/java/com/baeldung/loginextrafields/LoginFieldsSimpleIntegrationTest.java rename to spring-security-modules/spring-security-web-login/src/test/java/com/baeldung/loginextrafields/LoginFieldsSimpleIntegrationTest.java index 63167b04fa..2348afeb84 100644 --- a/spring-security-modules/spring-5-security/src/test/java/com/baeldung/loginextrafields/LoginFieldsSimpleIntegrationTest.java +++ b/spring-security-modules/spring-security-web-login/src/test/java/com/baeldung/loginextrafields/LoginFieldsSimpleIntegrationTest.java @@ -1,72 +1,72 @@ -package com.baeldung.loginextrafields; - -import static org.junit.Assert.assertEquals; -import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.redirectedUrlPattern; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -import java.util.ArrayList; -import java.util.Collection; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.mock.web.MockHttpSession; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.context.SecurityContext; -import org.springframework.security.web.context.HttpSessionSecurityContextRepository; -import org.springframework.test.context.junit.jupiter.web.SpringJUnitWebConfig; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.test.web.servlet.MvcResult; -import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; - -import com.baeldung.loginextrafieldssimple.ExtraLoginFieldsApplication; -import com.baeldung.loginextrafieldssimple.User; - -@RunWith(SpringRunner.class) -@SpringJUnitWebConfig -@SpringBootTest(classes = ExtraLoginFieldsApplication.class) -public class LoginFieldsSimpleIntegrationTest extends AbstractExtraLoginFieldsIntegrationTest { - - @Test - public void givenAccessSecuredResource_whenAuthenticated_thenAuthHasExtraFields() throws Exception { - MockHttpServletRequestBuilder securedResourceAccess = get("/user/index"); - MvcResult unauthenticatedResult = mockMvc.perform(securedResourceAccess) - .andExpect(status().is3xxRedirection()) - .andReturn(); - - MockHttpSession session = (MockHttpSession) unauthenticatedResult.getRequest() - .getSession(); - String loginUrl = unauthenticatedResult.getResponse() - .getRedirectedUrl(); - - User user = getUser(); - - mockMvc.perform(post(loginUrl) - .param("username", user.getUsername()) - .param("password", user.getPassword()) - .param("domain", user.getDomain()) - .session(session) - .with(csrf())) - .andExpect(status().is3xxRedirection()) - .andExpect(redirectedUrlPattern("**/user/index")) - .andReturn(); - - mockMvc.perform(securedResourceAccess.session(session)) - .andExpect(status().isOk()); - - SecurityContext securityContext - = (SecurityContext) session.getAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY); - Authentication auth = securityContext.getAuthentication(); - assertEquals(((User)auth.getPrincipal()).getDomain(), user.getDomain()); - } - - private User getUser() { - Collection authorities = new ArrayList<>(); - return new User("myusername", "mydomain", "secret", true, true, true, true, authorities); - } - -} +package com.baeldung.loginextrafields; + +import static org.junit.Assert.assertEquals; +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.redirectedUrlPattern; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import java.util.ArrayList; +import java.util.Collection; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.mock.web.MockHttpSession; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.web.context.HttpSessionSecurityContextRepository; +import org.springframework.test.context.junit.jupiter.web.SpringJUnitWebConfig; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MvcResult; +import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; + +import com.baeldung.loginextrafieldssimple.ExtraLoginFieldsApplication; +import com.baeldung.loginextrafieldssimple.User; + +@RunWith(SpringRunner.class) +@SpringJUnitWebConfig +@SpringBootTest(classes = ExtraLoginFieldsApplication.class) +public class LoginFieldsSimpleIntegrationTest extends AbstractExtraLoginFieldsIntegrationTest { + + @Test + public void givenAccessSecuredResource_whenAuthenticated_thenAuthHasExtraFields() throws Exception { + MockHttpServletRequestBuilder securedResourceAccess = get("/user/index"); + MvcResult unauthenticatedResult = mockMvc.perform(securedResourceAccess) + .andExpect(status().is3xxRedirection()) + .andReturn(); + + MockHttpSession session = (MockHttpSession) unauthenticatedResult.getRequest() + .getSession(); + String loginUrl = unauthenticatedResult.getResponse() + .getRedirectedUrl(); + + User user = getUser(); + + mockMvc.perform(post(loginUrl) + .param("username", user.getUsername()) + .param("password", user.getPassword()) + .param("domain", user.getDomain()) + .session(session) + .with(csrf())) + .andExpect(status().is3xxRedirection()) + .andExpect(redirectedUrlPattern("**/user/index")) + .andReturn(); + + mockMvc.perform(securedResourceAccess.session(session)) + .andExpect(status().isOk()); + + SecurityContext securityContext + = (SecurityContext) session.getAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY); + Authentication auth = securityContext.getAuthentication(); + assertEquals(((User)auth.getPrincipal()).getDomain(), user.getDomain()); + } + + private User getUser() { + Collection authorities = new ArrayList<>(); + return new User("myusername", "mydomain", "secret", true, true, true, true, authorities); + } + +}