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 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+