diff --git a/sign-in/spring-mvc-normal/src/main/java/net/petrikainulainen/spring/social/signinmvc/config/SecurityContext.java b/sign-in/spring-mvc-normal/src/main/java/net/petrikainulainen/spring/social/signinmvc/config/SecurityContext.java index 749cba2..a7fa660 100644 --- a/sign-in/spring-mvc-normal/src/main/java/net/petrikainulainen/spring/social/signinmvc/config/SecurityContext.java +++ b/sign-in/spring-mvc-normal/src/main/java/net/petrikainulainen/spring/social/signinmvc/config/SecurityContext.java @@ -1,10 +1,13 @@ package net.petrikainulainen.spring.social.signinmvc.config; +import javax.sql.DataSource; + +import net.petrikainulainen.spring.social.signinmvc.security.service.CustomPersistentTokenBasedRememberMeServices; import net.petrikainulainen.spring.social.signinmvc.security.service.RepositoryUserDetailsService; import net.petrikainulainen.spring.social.signinmvc.security.service.SimpleSocialUserDetailsService; import net.petrikainulainen.spring.social.signinmvc.user.repository.UserRepository; + import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; @@ -15,6 +18,8 @@ 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.rememberme.JdbcTokenRepositoryImpl; +import org.springframework.security.web.authentication.rememberme.PersistentTokenRepository; import org.springframework.social.security.SocialUserDetailsService; import org.springframework.social.security.SpringSocialConfigurer; @@ -27,6 +32,10 @@ public class SecurityContext extends WebSecurityConfigurerAdapter { @Autowired private UserRepository userRepository; + + + @Autowired + DataSource dataSource; @Override public void configure(WebSecurity web) throws Exception { @@ -63,6 +72,11 @@ protected void configure(HttpSecurity http) throws Exception { ).permitAll() //The rest of the our application is protected. .antMatchers("/**").hasRole("USER") + //Adds the CustomPersistentTokenBasedRememberMeServices. + .and() + .rememberMe() + .key("myRememberMeKey") + .rememberMeServices(customPersistentTokenBasedRememberMeServices()) //Adds the SocialAuthenticationFilter to Spring Security's filter chain. .and() .apply(new SpringSocialConfigurer()); @@ -103,4 +117,27 @@ public SocialUserDetailsService socialUserDetailsService() { public UserDetailsService userDetailsService() { return new RepositoryUserDetailsService(userRepository); } + + /** + * This bean is the custom persistent token-based remember me service which handles persistent remember + * using browser cookie for both regular login and social login. + */ + @Bean + public CustomPersistentTokenBasedRememberMeServices customPersistentTokenBasedRememberMeServices(){ + CustomPersistentTokenBasedRememberMeServices rememberMeServices = new CustomPersistentTokenBasedRememberMeServices("myRememberMeKey", userDetailsService(), persistentTokenRepository()); + rememberMeServices.setParameter("rememberme"); + rememberMeServices.setTokenValiditySeconds(1209600); + return rememberMeServices; + } + + /** + * This bean is the JDBC token repository for remember me services. + */ + @Bean + public PersistentTokenRepository persistentTokenRepository() { + JdbcTokenRepositoryImpl db = new JdbcTokenRepositoryImpl(); + db.setCreateTableOnStartup(false); + db.setDataSource(dataSource); + return db; + } } diff --git a/sign-in/spring-mvc-normal/src/main/java/net/petrikainulainen/spring/social/signinmvc/security/service/CustomPersistentTokenBasedRememberMeServices.java b/sign-in/spring-mvc-normal/src/main/java/net/petrikainulainen/spring/social/signinmvc/security/service/CustomPersistentTokenBasedRememberMeServices.java new file mode 100644 index 0000000..9ef3a84 --- /dev/null +++ b/sign-in/spring-mvc-normal/src/main/java/net/petrikainulainen/spring/social/signinmvc/security/service/CustomPersistentTokenBasedRememberMeServices.java @@ -0,0 +1,39 @@ +package net.petrikainulainen.spring.social.signinmvc.security.service; + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.web.authentication.rememberme.PersistentTokenBasedRememberMeServices; +import org.springframework.security.web.authentication.rememberme.PersistentTokenRepository; + +/** + * This class handles rememberMeRequested decision only. + * This rememberMeRequested returns original results for regular(id/password) login but returns always 'true' for social login. + * @author Hosang Jeon + */ +public class CustomPersistentTokenBasedRememberMeServices extends + PersistentTokenBasedRememberMeServices { + + public CustomPersistentTokenBasedRememberMeServices(String key, + UserDetailsService userDetailsService, + PersistentTokenRepository tokenRepository) { + super(key, userDetailsService, tokenRepository); + } + + @Override + protected boolean rememberMeRequested(HttpServletRequest request, + String parameter) { + + String isRegularLogin = request.getParameter("isRegularLogin"); + + // Regular Login + if (isRegularLogin != null && "true".equals(isRegularLogin)) { + return super.rememberMeRequested(request, parameter); + } + // Social Login + else{ + // returns always 'true' for social login. + return true; + } + } +} diff --git a/sign-in/spring-mvc-normal/src/main/resources/exampleApplicationContext-security.xml b/sign-in/spring-mvc-normal/src/main/resources/exampleApplicationContext-security.xml index 4a14949..3ad98ae 100644 --- a/sign-in/spring-mvc-normal/src/main/resources/exampleApplicationContext-security.xml +++ b/sign-in/spring-mvc-normal/src/main/resources/exampleApplicationContext-security.xml @@ -33,6 +33,9 @@ + + + @@ -67,7 +70,30 @@ + + + + + + + + + + + + + + + + +