From f4b27f397f56016c086eb030b1f7012ad0a8fda5 Mon Sep 17 00:00:00 2001 From: sandip singh Date: Thu, 31 Oct 2019 22:57:59 +0530 Subject: [PATCH 1/5] BAEL-3283 BAEL-3283 Added a new module describing an example of Spring MVC Themes. --- pom.xml | 5 +- spring-mvc-themes/pom.xml | 119 ++++++++++++++++++ .../com/baeldung/config/DataSourceConfig.java | 48 +++++++ .../com/baeldung/config/InitSecurity.java | 6 + .../com/baeldung/config/SecurityConfig.java | 57 +++++++++ .../com/baeldung/config/ThemeMVCConfig.java | 61 +++++++++ .../com/baeldung/config/WebInitializer.java | 28 +++++ .../baeldung/controllers/AppController.java | 13 ++ .../com/baeldung/domain/UserPreference.java | 30 +++++ .../repository/UserPreferenceRepository.java | 7 ++ .../resolver/UserPreferenceThemeResolver.java | 88 +++++++++++++ .../src/main/resources/dark.properties | 2 + .../src/main/resources/dark_en_US.properties | 2 + .../src/main/resources/db/sql/create-db.sql | 17 +++ .../src/main/resources/db/sql/insert-data.sql | 6 + .../src/main/resources/light.properties | 2 + .../src/main/resources/light_en_US.properties | 2 + .../src/main/resources/themes/black.css | 8 ++ .../src/main/resources/themes/white.css | 8 ++ .../src/main/webapp/WEB-INF/index.jsp | 46 +++++++ 20 files changed, 554 insertions(+), 1 deletion(-) create mode 100644 spring-mvc-themes/pom.xml create mode 100644 spring-mvc-themes/src/main/java/com/baeldung/config/DataSourceConfig.java create mode 100644 spring-mvc-themes/src/main/java/com/baeldung/config/InitSecurity.java create mode 100644 spring-mvc-themes/src/main/java/com/baeldung/config/SecurityConfig.java create mode 100644 spring-mvc-themes/src/main/java/com/baeldung/config/ThemeMVCConfig.java create mode 100644 spring-mvc-themes/src/main/java/com/baeldung/config/WebInitializer.java create mode 100644 spring-mvc-themes/src/main/java/com/baeldung/controllers/AppController.java create mode 100644 spring-mvc-themes/src/main/java/com/baeldung/domain/UserPreference.java create mode 100644 spring-mvc-themes/src/main/java/com/baeldung/repository/UserPreferenceRepository.java create mode 100644 spring-mvc-themes/src/main/java/com/baeldung/theme/resolver/UserPreferenceThemeResolver.java create mode 100644 spring-mvc-themes/src/main/resources/dark.properties create mode 100644 spring-mvc-themes/src/main/resources/dark_en_US.properties create mode 100644 spring-mvc-themes/src/main/resources/db/sql/create-db.sql create mode 100644 spring-mvc-themes/src/main/resources/db/sql/insert-data.sql create mode 100644 spring-mvc-themes/src/main/resources/light.properties create mode 100644 spring-mvc-themes/src/main/resources/light_en_US.properties create mode 100644 spring-mvc-themes/src/main/resources/themes/black.css create mode 100644 spring-mvc-themes/src/main/resources/themes/white.css create mode 100644 spring-mvc-themes/src/main/webapp/WEB-INF/index.jsp diff --git a/pom.xml b/pom.xml index 79e5194ee8..a5614961d7 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,8 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT - parent-modules + + parent-modules pom @@ -745,6 +746,7 @@ spring-mvc-kotlin spring-mvc-simple spring-mvc-simple-2 + spring-mvc-themes spring-mvc-velocity spring-mvc-webflow spring-mvc-xml @@ -1457,6 +1459,7 @@ spring-mvc-kotlin spring-mvc-simple spring-mvc-simple-2 + spring-mvc-themes spring-mvc-velocity spring-mvc-webflow spring-mvc-xml diff --git a/spring-mvc-themes/pom.xml b/spring-mvc-themes/pom.xml new file mode 100644 index 0000000000..450e44b1d8 --- /dev/null +++ b/spring-mvc-themes/pom.xml @@ -0,0 +1,119 @@ + + + 4.0.0 + spring-mvc-themes + war + spring-mvc-themes + + + com.baeldung + parent-spring-5 + 0.0.1-SNAPSHOT + ../parent-spring-5 + + + + + 1.8 + 2.3.2-b02 + 4.0.0 + 5.1.6.RELEASE + 2.1.10.RELEASE + 2.2.2 + 2.5.0 + 5.2.17.Final + enter-location-of-server + + + + + org.springframework + spring-webmvc + ${spring.version} + + + org.springframework + spring-context + ${spring.version} + + + javax.servlet + javax.servlet-api + ${javax.servlet-api.version} + + + javax.servlet.jsp + javax.servlet.jsp-api + ${javax.servlet.jsp-api.version} + + + javax.servlet + jstl + ${jstl.version} + + + org.springframework.data + spring-data-jpa + ${spring.data.version} + + + org.hibernate + hibernate-core + ${hibernate.version} + + + + org.hsqldb + hsqldb + ${hsqldb.version} + + + + org.springframework.security + spring-security-web + ${spring.security.version} + + + + org.springframework.security + spring-security-config + ${spring.security.version} + + + + org.springframework.security + spring-security-taglibs + ${spring.security.version} + + + + + + spring-mvc-theme + + + org.apache.maven.plugins + maven-compiler-plugin + 2.0.2 + + ${java.version} + ${java.version} + + + + + org.apache.maven.plugins + maven-war-plugin + ${maven-war-plugin.version} + + src/main/webapp + spring-mvc-theme + false + ${deploy-path} + + + + + \ No newline at end of file diff --git a/spring-mvc-themes/src/main/java/com/baeldung/config/DataSourceConfig.java b/spring-mvc-themes/src/main/java/com/baeldung/config/DataSourceConfig.java new file mode 100644 index 0000000000..ea74a8176e --- /dev/null +++ b/spring-mvc-themes/src/main/java/com/baeldung/config/DataSourceConfig.java @@ -0,0 +1,48 @@ +package com.baeldung.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor; +import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; +import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; +import org.springframework.orm.jpa.JpaTransactionManager; +import org.springframework.orm.jpa.JpaVendorAdapter; +import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; +import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; +import org.springframework.transaction.PlatformTransactionManager; + +import javax.persistence.EntityManagerFactory; +import javax.sql.DataSource; + +@EnableJpaRepositories(basePackages = "com.baeldung") +public class DataSourceConfig { + @Bean + public DataSource dataSource() { + EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder(); + return builder.setType(EmbeddedDatabaseType.HSQL) + .addScripts("db/sql/create-db.sql", "db/sql/insert-data.sql") + .build(); + } + + @Bean + public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) { + LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); + em.setDataSource(dataSource); + em.setPackagesToScan("com.baeldung.domain"); + JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); + em.setJpaVendorAdapter(vendorAdapter); + return em; + } + + @Bean + public PlatformTransactionManager transactionManager(EntityManagerFactory emf) { + JpaTransactionManager transactionManager = new JpaTransactionManager(); + transactionManager.setEntityManagerFactory(emf); + return transactionManager; + } + + @Bean + public PersistenceExceptionTranslationPostProcessor exceptionTranslation(){ + return new PersistenceExceptionTranslationPostProcessor(); + } +} diff --git a/spring-mvc-themes/src/main/java/com/baeldung/config/InitSecurity.java b/spring-mvc-themes/src/main/java/com/baeldung/config/InitSecurity.java new file mode 100644 index 0000000000..2bf659f476 --- /dev/null +++ b/spring-mvc-themes/src/main/java/com/baeldung/config/InitSecurity.java @@ -0,0 +1,6 @@ +package com.baeldung.config; + +import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer; + +public class InitSecurity extends AbstractSecurityWebApplicationInitializer { +} diff --git a/spring-mvc-themes/src/main/java/com/baeldung/config/SecurityConfig.java b/spring-mvc-themes/src/main/java/com/baeldung/config/SecurityConfig.java new file mode 100644 index 0000000000..4d96d04ce9 --- /dev/null +++ b/spring-mvc-themes/src/main/java/com/baeldung/config/SecurityConfig.java @@ -0,0 +1,57 @@ +package com.baeldung.config; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +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.builders.WebSecurity; +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 javax.sql.DataSource; + +@EnableWebSecurity +public class SecurityConfig extends WebSecurityConfigurerAdapter { + + @Autowired + DataSource dataSource; + + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } + + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception { + auth.jdbcAuthentication() + .passwordEncoder(passwordEncoder()) + .dataSource(dataSource); + } + + @Override + protected void configure(HttpSecurity http) throws Exception { + + http + .csrf() + .disable() + .authorizeRequests() + .antMatchers("/anonymous*").anonymous() + .antMatchers("/login*").permitAll() + .anyRequest().authenticated() + .and() + .formLogin() + .and() + .logout() + .logoutUrl("/logout.do") + .invalidateHttpSession(true) + .clearAuthentication(true); + } + + @Override + public void configure(WebSecurity web) throws Exception { + web.ignoring().antMatchers("/themes/**"); + } + +} diff --git a/spring-mvc-themes/src/main/java/com/baeldung/config/ThemeMVCConfig.java b/spring-mvc-themes/src/main/java/com/baeldung/config/ThemeMVCConfig.java new file mode 100644 index 0000000000..35d513fad0 --- /dev/null +++ b/spring-mvc-themes/src/main/java/com/baeldung/config/ThemeMVCConfig.java @@ -0,0 +1,61 @@ +package com.baeldung.config; + +import com.baeldung.theme.resolver.UserPreferenceThemeResolver; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.ui.context.support.ResourceBundleThemeSource; +import org.springframework.web.servlet.ThemeResolver; +import org.springframework.web.servlet.config.annotation.*; +import org.springframework.web.servlet.theme.ThemeChangeInterceptor; + +@Configuration +@ComponentScan(basePackages="com.baeldung") +@EnableWebMvc +public class ThemeMVCConfig implements WebMvcConfigurer { + + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + registry.addResourceHandler("/themes/**").addResourceLocations("classpath:/themes/"); + } + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(themeChangeInterceptor()); + } + + @Bean + public ThemeChangeInterceptor themeChangeInterceptor() { + ThemeChangeInterceptor interceptor = new ThemeChangeInterceptor(); + interceptor.setParamName("theme"); + return interceptor; + } + + @Bean + public ResourceBundleThemeSource resourceBundleThemeSource() { + ResourceBundleThemeSource themeSource = new ResourceBundleThemeSource(); + themeSource.setFallbackToSystemLocale(true); + return themeSource; + } + + @Bean +// @Profile("cookie") + public ThemeResolver themeResolver() { + UserPreferenceThemeResolver themeResolver = new UserPreferenceThemeResolver(); + themeResolver.setDefaultThemeName("light"); + return themeResolver; + } + +// @Bean +// @Profile("database") +// public ThemeResolver databaseThemeResolver() { +// UserPreferenceThemeResolver themeResolver = new UserPreferenceThemeResolver(); +// themeResolver.setDefaultThemeName("light"); +// return themeResolver; +// } + + @Override + public void configureViewResolvers(ViewResolverRegistry resolverRegistry) { + resolverRegistry.jsp(); + } +} diff --git a/spring-mvc-themes/src/main/java/com/baeldung/config/WebInitializer.java b/spring-mvc-themes/src/main/java/com/baeldung/config/WebInitializer.java new file mode 100644 index 0000000000..5516fb7b3c --- /dev/null +++ b/spring-mvc-themes/src/main/java/com/baeldung/config/WebInitializer.java @@ -0,0 +1,28 @@ +package com.baeldung.config; + +import org.springframework.web.WebApplicationInitializer; +import org.springframework.web.context.ContextLoaderListener; +import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; +import org.springframework.web.servlet.DispatcherServlet; + +import javax.servlet.ServletException; +import javax.servlet.ServletRegistration; + +public class WebInitializer implements WebApplicationInitializer { + @Override + public void onStartup(javax.servlet.ServletContext servletContext) throws ServletException { + AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); + context.register(DataSourceConfig.class); + context.register(ThemeMVCConfig.class); + + + servletContext.addListener(new ContextLoaderListener(context)); + servletContext.setInitParameter("spring.profiles.active", "database"); + + ServletRegistration.Dynamic servlet = servletContext.addServlet("dispatcher", new DispatcherServlet(context)); + + servlet.setLoadOnStartup(1); + servlet.addMapping("/"); + + } +} diff --git a/spring-mvc-themes/src/main/java/com/baeldung/controllers/AppController.java b/spring-mvc-themes/src/main/java/com/baeldung/controllers/AppController.java new file mode 100644 index 0000000000..31343492e1 --- /dev/null +++ b/spring-mvc-themes/src/main/java/com/baeldung/controllers/AppController.java @@ -0,0 +1,13 @@ +package com.baeldung.controllers; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class AppController { + + @RequestMapping("/") + public String home() { + return "index"; + } +} diff --git a/spring-mvc-themes/src/main/java/com/baeldung/domain/UserPreference.java b/spring-mvc-themes/src/main/java/com/baeldung/domain/UserPreference.java new file mode 100644 index 0000000000..81034de947 --- /dev/null +++ b/spring-mvc-themes/src/main/java/com/baeldung/domain/UserPreference.java @@ -0,0 +1,30 @@ +package com.baeldung.domain; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name = "preferences") +public class UserPreference { + @Id + private String username; + + private String theme; + + public String getTheme() { + return theme; + } + + public void setTheme(String theme) { + this.theme = theme; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } +} diff --git a/spring-mvc-themes/src/main/java/com/baeldung/repository/UserPreferenceRepository.java b/spring-mvc-themes/src/main/java/com/baeldung/repository/UserPreferenceRepository.java new file mode 100644 index 0000000000..77e5da0498 --- /dev/null +++ b/spring-mvc-themes/src/main/java/com/baeldung/repository/UserPreferenceRepository.java @@ -0,0 +1,7 @@ +package com.baeldung.repository; + +import com.baeldung.domain.UserPreference; +import org.springframework.data.repository.PagingAndSortingRepository; + +public interface UserPreferenceRepository extends PagingAndSortingRepository { +} diff --git a/spring-mvc-themes/src/main/java/com/baeldung/theme/resolver/UserPreferenceThemeResolver.java b/spring-mvc-themes/src/main/java/com/baeldung/theme/resolver/UserPreferenceThemeResolver.java new file mode 100644 index 0000000000..f4a3a7971e --- /dev/null +++ b/spring-mvc-themes/src/main/java/com/baeldung/theme/resolver/UserPreferenceThemeResolver.java @@ -0,0 +1,88 @@ +package com.baeldung.theme.resolver; + +import com.baeldung.domain.UserPreference; +import com.baeldung.repository.UserPreferenceRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.User; +import org.springframework.util.StringUtils; +import org.springframework.web.servlet.ThemeResolver; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class UserPreferenceThemeResolver implements ThemeResolver { + + public static final String THEME_REQUEST_ATTRIBUTE_NAME = UserPreferenceThemeResolver.class.getName() + ".THEME"; + + @Autowired(required = false) + Authentication authentication; + + @Autowired + UserPreferenceRepository userPreferenceRepository; + + private String defaultThemeName; + + public String getDefaultThemeName() { + return defaultThemeName; + } + + public void setDefaultThemeName(String defaultThemeName) { + this.defaultThemeName = defaultThemeName; + } + + @Override + public String resolveThemeName(HttpServletRequest request) { + String themeName = (String) request.getAttribute(THEME_REQUEST_ATTRIBUTE_NAME); + if (themeName != null) { + return themeName; + } + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + + if (authentication != null && authentication.isAuthenticated() && isNotAnonymous(authentication)) { + User user = (User) authentication.getPrincipal(); + UserPreference userPreference = userPreferenceRepository.findById(user.getUsername()).orElse(null); + + if (userPreference != null) { + themeName = userPreference.getTheme(); + } + } + + // Fall back to default theme. + if (themeName == null) { + themeName = getDefaultThemeName(); + } + request.setAttribute(THEME_REQUEST_ATTRIBUTE_NAME, themeName); + return themeName; + } + + private boolean isNotAnonymous(Authentication authentication) { + return !isAnonymous(authentication); + } + + private boolean isAnonymous(Authentication authentication) { + return authentication != null && authentication.getPrincipal() instanceof String && "anonymousUser".equals(authentication.getPrincipal()); + } + + @Override + public void setThemeName(HttpServletRequest request, HttpServletResponse response, String theme) { + + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + if (authentication != null && authentication.isAuthenticated() && isNotAnonymous(authentication)) { + request.setAttribute(THEME_REQUEST_ATTRIBUTE_NAME, theme); + User user = (User) authentication.getPrincipal(); + + UserPreference userPreference = userPreferenceRepository.findById(user.getUsername()).orElse(new UserPreference()); + + userPreference.setUsername(user.getUsername()); + userPreference.setTheme(StringUtils.hasText(theme) ? theme : null); + userPreferenceRepository.save(userPreference); + + } + + if (!StringUtils.hasText(theme)) { + request.setAttribute(THEME_REQUEST_ATTRIBUTE_NAME, getDefaultThemeName()); + } + } +} diff --git a/spring-mvc-themes/src/main/resources/dark.properties b/spring-mvc-themes/src/main/resources/dark.properties new file mode 100644 index 0000000000..c82264da75 --- /dev/null +++ b/spring-mvc-themes/src/main/resources/dark.properties @@ -0,0 +1,2 @@ +styleSheet=themes/black.css +background=black \ No newline at end of file diff --git a/spring-mvc-themes/src/main/resources/dark_en_US.properties b/spring-mvc-themes/src/main/resources/dark_en_US.properties new file mode 100644 index 0000000000..c82264da75 --- /dev/null +++ b/spring-mvc-themes/src/main/resources/dark_en_US.properties @@ -0,0 +1,2 @@ +styleSheet=themes/black.css +background=black \ No newline at end of file diff --git a/spring-mvc-themes/src/main/resources/db/sql/create-db.sql b/spring-mvc-themes/src/main/resources/db/sql/create-db.sql new file mode 100644 index 0000000000..0a6fd5ad59 --- /dev/null +++ b/spring-mvc-themes/src/main/resources/db/sql/create-db.sql @@ -0,0 +1,17 @@ +create table users ( + username varchar(50) not null primary key, + password varchar(256) not null, + enabled boolean not null +); + + +create table authorities ( + username varchar(50) not null, + authority varchar(50) not null +); + + +create table preferences ( + username varchar(50) not null, + theme varchar(50) +); \ No newline at end of file diff --git a/spring-mvc-themes/src/main/resources/db/sql/insert-data.sql b/spring-mvc-themes/src/main/resources/db/sql/insert-data.sql new file mode 100644 index 0000000000..310dcd00c7 --- /dev/null +++ b/spring-mvc-themes/src/main/resources/db/sql/insert-data.sql @@ -0,0 +1,6 @@ +insert into users values('john', '$2a$10$cjcbIX/aLe12PpGZ.vQfweLiB7K1QTC5enTk3oD0deCMdtj2Sx.im', 1); +insert into users values('admin', '$2a$10$cjcbIX/aLe12PpGZ.vQfweLiB7K1QTC5enTk3oD0deCMdtj2Sx.im', 1); + +insert into authorities values('sandip', 'USER'); +insert into authorities values('admin', 'USER'); +insert into authorities values('admin', 'ADMIN'); \ No newline at end of file diff --git a/spring-mvc-themes/src/main/resources/light.properties b/spring-mvc-themes/src/main/resources/light.properties new file mode 100644 index 0000000000..f6e0d10b4c --- /dev/null +++ b/spring-mvc-themes/src/main/resources/light.properties @@ -0,0 +1,2 @@ +styleSheet=themes/white.css +background=black \ No newline at end of file diff --git a/spring-mvc-themes/src/main/resources/light_en_US.properties b/spring-mvc-themes/src/main/resources/light_en_US.properties new file mode 100644 index 0000000000..f6e0d10b4c --- /dev/null +++ b/spring-mvc-themes/src/main/resources/light_en_US.properties @@ -0,0 +1,2 @@ +styleSheet=themes/white.css +background=black \ No newline at end of file diff --git a/spring-mvc-themes/src/main/resources/themes/black.css b/spring-mvc-themes/src/main/resources/themes/black.css new file mode 100644 index 0000000000..8a44cd969f --- /dev/null +++ b/spring-mvc-themes/src/main/resources/themes/black.css @@ -0,0 +1,8 @@ +body { + justify-content : center; + background-color : black; + color : white; + text-align : center; + margin-left : 15%; + margin-right : 15%; +} \ No newline at end of file diff --git a/spring-mvc-themes/src/main/resources/themes/white.css b/spring-mvc-themes/src/main/resources/themes/white.css new file mode 100644 index 0000000000..939bd1e4c9 --- /dev/null +++ b/spring-mvc-themes/src/main/resources/themes/white.css @@ -0,0 +1,8 @@ +body { + justify-content : center; + background-color : white; + color : black; + text-align : center; + margin-left : 15%; + margin-right : 15%; +} \ No newline at end of file diff --git a/spring-mvc-themes/src/main/webapp/WEB-INF/index.jsp b/spring-mvc-themes/src/main/webapp/WEB-INF/index.jsp new file mode 100644 index 0000000000..b36c21eb71 --- /dev/null +++ b/spring-mvc-themes/src/main/webapp/WEB-INF/index.jsp @@ -0,0 +1,46 @@ +<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib prefix="security" uri="http://www.springframework.org/security/tags" %> + + + + + Themed Application + + +
+

Themed Application

+
+
+
+

Spring MVC Theme Demo

+ +

User :

+
+
+
+

+ Change Theme +

+
+ +
+
+ +
+
+ +
+
+ + + + From 988655875b95fca70220f17bcafe1f99fab035c3 Mon Sep 17 00:00:00 2001 From: sandip singh Date: Tue, 5 Nov 2019 21:08:56 +0530 Subject: [PATCH 2/5] BAEL-3283 - Refactored the code as per review comments. --- .../com/baeldung/config/DataSourceConfig.java | 8 +-- .../com/baeldung/config/ThemeMVCConfig.java | 8 --- .../resolver/UserPreferenceThemeResolver.java | 58 +++++++------------ .../src/main/resources/db/sql/insert-data.sql | 2 +- 4 files changed, 25 insertions(+), 51 deletions(-) diff --git a/spring-mvc-themes/src/main/java/com/baeldung/config/DataSourceConfig.java b/spring-mvc-themes/src/main/java/com/baeldung/config/DataSourceConfig.java index ea74a8176e..ff47bd7047 100644 --- a/spring-mvc-themes/src/main/java/com/baeldung/config/DataSourceConfig.java +++ b/spring-mvc-themes/src/main/java/com/baeldung/config/DataSourceConfig.java @@ -6,7 +6,6 @@ import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; import org.springframework.orm.jpa.JpaTransactionManager; -import org.springframework.orm.jpa.JpaVendorAdapter; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; import org.springframework.transaction.PlatformTransactionManager; @@ -29,16 +28,13 @@ public class DataSourceConfig { LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); em.setDataSource(dataSource); em.setPackagesToScan("com.baeldung.domain"); - JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(); - em.setJpaVendorAdapter(vendorAdapter); + em.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); return em; } @Bean public PlatformTransactionManager transactionManager(EntityManagerFactory emf) { - JpaTransactionManager transactionManager = new JpaTransactionManager(); - transactionManager.setEntityManagerFactory(emf); - return transactionManager; + return new JpaTransactionManager(emf); } @Bean diff --git a/spring-mvc-themes/src/main/java/com/baeldung/config/ThemeMVCConfig.java b/spring-mvc-themes/src/main/java/com/baeldung/config/ThemeMVCConfig.java index 35d513fad0..86f6f54195 100644 --- a/spring-mvc-themes/src/main/java/com/baeldung/config/ThemeMVCConfig.java +++ b/spring-mvc-themes/src/main/java/com/baeldung/config/ThemeMVCConfig.java @@ -39,20 +39,12 @@ public class ThemeMVCConfig implements WebMvcConfigurer { } @Bean -// @Profile("cookie") public ThemeResolver themeResolver() { UserPreferenceThemeResolver themeResolver = new UserPreferenceThemeResolver(); themeResolver.setDefaultThemeName("light"); return themeResolver; } -// @Bean -// @Profile("database") -// public ThemeResolver databaseThemeResolver() { -// UserPreferenceThemeResolver themeResolver = new UserPreferenceThemeResolver(); -// themeResolver.setDefaultThemeName("light"); -// return themeResolver; -// } @Override public void configureViewResolvers(ViewResolverRegistry resolverRegistry) { diff --git a/spring-mvc-themes/src/main/java/com/baeldung/theme/resolver/UserPreferenceThemeResolver.java b/spring-mvc-themes/src/main/java/com/baeldung/theme/resolver/UserPreferenceThemeResolver.java index f4a3a7971e..4c59734d41 100644 --- a/spring-mvc-themes/src/main/java/com/baeldung/theme/resolver/UserPreferenceThemeResolver.java +++ b/spring-mvc-themes/src/main/java/com/baeldung/theme/resolver/UserPreferenceThemeResolver.java @@ -11,6 +11,7 @@ import org.springframework.web.servlet.ThemeResolver; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import java.util.Optional; public class UserPreferenceThemeResolver implements ThemeResolver { @@ -34,55 +35,40 @@ public class UserPreferenceThemeResolver implements ThemeResolver { @Override public String resolveThemeName(HttpServletRequest request) { - String themeName = (String) request.getAttribute(THEME_REQUEST_ATTRIBUTE_NAME); - if (themeName != null) { - return themeName; - } - Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); - - if (authentication != null && authentication.isAuthenticated() && isNotAnonymous(authentication)) { - User user = (User) authentication.getPrincipal(); - UserPreference userPreference = userPreferenceRepository.findById(user.getUsername()).orElse(null); - - if (userPreference != null) { - themeName = userPreference.getTheme(); - } - } - - // Fall back to default theme. - if (themeName == null) { - themeName = getDefaultThemeName(); - } + String themeName = findThemeFromRequest(request).orElse(findUserPreferredTheme().orElse(getDefaultThemeName())); request.setAttribute(THEME_REQUEST_ATTRIBUTE_NAME, themeName); return themeName; } - private boolean isNotAnonymous(Authentication authentication) { - return !isAnonymous(authentication); + private Optional findUserPreferredTheme() { + Authentication authentication = SecurityContextHolder.getContext() + .getAuthentication(); + UserPreference userPreference = getUserPreference(authentication).orElse(new UserPreference()); + return Optional.ofNullable(userPreference.getTheme()); } - private boolean isAnonymous(Authentication authentication) { - return authentication != null && authentication.getPrincipal() instanceof String && "anonymousUser".equals(authentication.getPrincipal()); + private Optional findThemeFromRequest(HttpServletRequest request) { + return Optional.ofNullable((String) request.getAttribute(THEME_REQUEST_ATTRIBUTE_NAME)); + } + + private Optional getUserPreference(Authentication authentication) { + return isAuthenticated(authentication) ? userPreferenceRepository.findById(((User) authentication.getPrincipal()).getUsername()) : Optional.empty(); + } + + private boolean isAuthenticated(Authentication authentication) { + return authentication != null && authentication.isAuthenticated(); } @Override public void setThemeName(HttpServletRequest request, HttpServletResponse response, String theme) { - - Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); - if (authentication != null && authentication.isAuthenticated() && isNotAnonymous(authentication)) { + Authentication authentication = SecurityContextHolder.getContext() + .getAuthentication(); + if (isAuthenticated(authentication)) { request.setAttribute(THEME_REQUEST_ATTRIBUTE_NAME, theme); - User user = (User) authentication.getPrincipal(); - - UserPreference userPreference = userPreferenceRepository.findById(user.getUsername()).orElse(new UserPreference()); - - userPreference.setUsername(user.getUsername()); + UserPreference userPreference = getUserPreference(authentication).orElse(new UserPreference()); + userPreference.setUsername(((User) authentication.getPrincipal()).getUsername()); userPreference.setTheme(StringUtils.hasText(theme) ? theme : null); userPreferenceRepository.save(userPreference); - - } - - if (!StringUtils.hasText(theme)) { - request.setAttribute(THEME_REQUEST_ATTRIBUTE_NAME, getDefaultThemeName()); } } } diff --git a/spring-mvc-themes/src/main/resources/db/sql/insert-data.sql b/spring-mvc-themes/src/main/resources/db/sql/insert-data.sql index 310dcd00c7..7ddf684d9a 100644 --- a/spring-mvc-themes/src/main/resources/db/sql/insert-data.sql +++ b/spring-mvc-themes/src/main/resources/db/sql/insert-data.sql @@ -1,6 +1,6 @@ insert into users values('john', '$2a$10$cjcbIX/aLe12PpGZ.vQfweLiB7K1QTC5enTk3oD0deCMdtj2Sx.im', 1); insert into users values('admin', '$2a$10$cjcbIX/aLe12PpGZ.vQfweLiB7K1QTC5enTk3oD0deCMdtj2Sx.im', 1); -insert into authorities values('sandip', 'USER'); +insert into authorities values('john', 'USER'); insert into authorities values('admin', 'USER'); insert into authorities values('admin', 'ADMIN'); \ No newline at end of file From fea1b6bf8a2775b63b642e5664fbfbd9823f1856 Mon Sep 17 00:00:00 2001 From: sandip singh Date: Mon, 18 Nov 2019 19:36:11 +0530 Subject: [PATCH 3/5] BAEL-3283 - Refactored the code as per review comments. --- pom.xml | 4 ++-- {spring-mvc-themes => spring-mvc-views}/pom.xml | 3 ++- .../src/main/java/com/baeldung/config/DataSourceConfig.java | 0 .../src/main/java/com/baeldung/config/InitSecurity.java | 0 .../src/main/java/com/baeldung/config/SecurityConfig.java | 0 .../src/main/java/com/baeldung/config/ThemeMVCConfig.java | 0 .../src/main/java/com/baeldung/config/WebInitializer.java | 0 .../src/main/java/com/baeldung/controllers/AppController.java | 0 .../src/main/java/com/baeldung/domain/UserPreference.java | 0 .../com/baeldung/repository/UserPreferenceRepository.java | 0 .../baeldung/theme/resolver/UserPreferenceThemeResolver.java | 0 .../src/main/resources/dark.properties | 0 .../src/main/resources/dark_en_US.properties | 0 .../src/main/resources/db/sql/create-db.sql | 0 .../src/main/resources/db/sql/insert-data.sql | 0 .../src/main/resources/light.properties | 0 .../src/main/resources/light_en_US.properties | 0 .../src/main/resources/themes/black.css | 0 .../src/main/resources/themes/white.css | 0 .../src/main/webapp/WEB-INF/index.jsp | 0 20 files changed, 4 insertions(+), 3 deletions(-) rename {spring-mvc-themes => spring-mvc-views}/pom.xml (97%) rename {spring-mvc-themes => spring-mvc-views}/src/main/java/com/baeldung/config/DataSourceConfig.java (100%) rename {spring-mvc-themes => spring-mvc-views}/src/main/java/com/baeldung/config/InitSecurity.java (100%) rename {spring-mvc-themes => spring-mvc-views}/src/main/java/com/baeldung/config/SecurityConfig.java (100%) rename {spring-mvc-themes => spring-mvc-views}/src/main/java/com/baeldung/config/ThemeMVCConfig.java (100%) rename {spring-mvc-themes => spring-mvc-views}/src/main/java/com/baeldung/config/WebInitializer.java (100%) rename {spring-mvc-themes => spring-mvc-views}/src/main/java/com/baeldung/controllers/AppController.java (100%) rename {spring-mvc-themes => spring-mvc-views}/src/main/java/com/baeldung/domain/UserPreference.java (100%) rename {spring-mvc-themes => spring-mvc-views}/src/main/java/com/baeldung/repository/UserPreferenceRepository.java (100%) rename {spring-mvc-themes => spring-mvc-views}/src/main/java/com/baeldung/theme/resolver/UserPreferenceThemeResolver.java (100%) rename {spring-mvc-themes => spring-mvc-views}/src/main/resources/dark.properties (100%) rename {spring-mvc-themes => spring-mvc-views}/src/main/resources/dark_en_US.properties (100%) rename {spring-mvc-themes => spring-mvc-views}/src/main/resources/db/sql/create-db.sql (100%) rename {spring-mvc-themes => spring-mvc-views}/src/main/resources/db/sql/insert-data.sql (100%) rename {spring-mvc-themes => spring-mvc-views}/src/main/resources/light.properties (100%) rename {spring-mvc-themes => spring-mvc-views}/src/main/resources/light_en_US.properties (100%) rename {spring-mvc-themes => spring-mvc-views}/src/main/resources/themes/black.css (100%) rename {spring-mvc-themes => spring-mvc-views}/src/main/resources/themes/white.css (100%) rename {spring-mvc-themes => spring-mvc-views}/src/main/webapp/WEB-INF/index.jsp (100%) diff --git a/pom.xml b/pom.xml index 948164973d..b5867cecb6 100644 --- a/pom.xml +++ b/pom.xml @@ -773,7 +773,7 @@ spring-mvc-kotlin spring-mvc-simple spring-mvc-simple-2 - spring-mvc-themes + spring-mvc-views spring-mvc-velocity spring-mvc-webflow spring-mvc-xml @@ -1514,7 +1514,7 @@ spring-mvc-kotlin spring-mvc-simple spring-mvc-simple-2 - spring-mvc-themes + spring-mvc-views spring-mvc-velocity spring-mvc-webflow spring-mvc-xml diff --git a/spring-mvc-themes/pom.xml b/spring-mvc-views/pom.xml similarity index 97% rename from spring-mvc-themes/pom.xml rename to spring-mvc-views/pom.xml index 450e44b1d8..60ba41f534 100644 --- a/spring-mvc-themes/pom.xml +++ b/spring-mvc-views/pom.xml @@ -19,7 +19,8 @@ 1.8 2.3.2-b02 4.0.0 - 5.1.6.RELEASE + 5.2.1.RELEASE + 5.2.1.RELEASE 2.1.10.RELEASE 2.2.2 2.5.0 diff --git a/spring-mvc-themes/src/main/java/com/baeldung/config/DataSourceConfig.java b/spring-mvc-views/src/main/java/com/baeldung/config/DataSourceConfig.java similarity index 100% rename from spring-mvc-themes/src/main/java/com/baeldung/config/DataSourceConfig.java rename to spring-mvc-views/src/main/java/com/baeldung/config/DataSourceConfig.java diff --git a/spring-mvc-themes/src/main/java/com/baeldung/config/InitSecurity.java b/spring-mvc-views/src/main/java/com/baeldung/config/InitSecurity.java similarity index 100% rename from spring-mvc-themes/src/main/java/com/baeldung/config/InitSecurity.java rename to spring-mvc-views/src/main/java/com/baeldung/config/InitSecurity.java diff --git a/spring-mvc-themes/src/main/java/com/baeldung/config/SecurityConfig.java b/spring-mvc-views/src/main/java/com/baeldung/config/SecurityConfig.java similarity index 100% rename from spring-mvc-themes/src/main/java/com/baeldung/config/SecurityConfig.java rename to spring-mvc-views/src/main/java/com/baeldung/config/SecurityConfig.java diff --git a/spring-mvc-themes/src/main/java/com/baeldung/config/ThemeMVCConfig.java b/spring-mvc-views/src/main/java/com/baeldung/config/ThemeMVCConfig.java similarity index 100% rename from spring-mvc-themes/src/main/java/com/baeldung/config/ThemeMVCConfig.java rename to spring-mvc-views/src/main/java/com/baeldung/config/ThemeMVCConfig.java diff --git a/spring-mvc-themes/src/main/java/com/baeldung/config/WebInitializer.java b/spring-mvc-views/src/main/java/com/baeldung/config/WebInitializer.java similarity index 100% rename from spring-mvc-themes/src/main/java/com/baeldung/config/WebInitializer.java rename to spring-mvc-views/src/main/java/com/baeldung/config/WebInitializer.java diff --git a/spring-mvc-themes/src/main/java/com/baeldung/controllers/AppController.java b/spring-mvc-views/src/main/java/com/baeldung/controllers/AppController.java similarity index 100% rename from spring-mvc-themes/src/main/java/com/baeldung/controllers/AppController.java rename to spring-mvc-views/src/main/java/com/baeldung/controllers/AppController.java diff --git a/spring-mvc-themes/src/main/java/com/baeldung/domain/UserPreference.java b/spring-mvc-views/src/main/java/com/baeldung/domain/UserPreference.java similarity index 100% rename from spring-mvc-themes/src/main/java/com/baeldung/domain/UserPreference.java rename to spring-mvc-views/src/main/java/com/baeldung/domain/UserPreference.java diff --git a/spring-mvc-themes/src/main/java/com/baeldung/repository/UserPreferenceRepository.java b/spring-mvc-views/src/main/java/com/baeldung/repository/UserPreferenceRepository.java similarity index 100% rename from spring-mvc-themes/src/main/java/com/baeldung/repository/UserPreferenceRepository.java rename to spring-mvc-views/src/main/java/com/baeldung/repository/UserPreferenceRepository.java diff --git a/spring-mvc-themes/src/main/java/com/baeldung/theme/resolver/UserPreferenceThemeResolver.java b/spring-mvc-views/src/main/java/com/baeldung/theme/resolver/UserPreferenceThemeResolver.java similarity index 100% rename from spring-mvc-themes/src/main/java/com/baeldung/theme/resolver/UserPreferenceThemeResolver.java rename to spring-mvc-views/src/main/java/com/baeldung/theme/resolver/UserPreferenceThemeResolver.java diff --git a/spring-mvc-themes/src/main/resources/dark.properties b/spring-mvc-views/src/main/resources/dark.properties similarity index 100% rename from spring-mvc-themes/src/main/resources/dark.properties rename to spring-mvc-views/src/main/resources/dark.properties diff --git a/spring-mvc-themes/src/main/resources/dark_en_US.properties b/spring-mvc-views/src/main/resources/dark_en_US.properties similarity index 100% rename from spring-mvc-themes/src/main/resources/dark_en_US.properties rename to spring-mvc-views/src/main/resources/dark_en_US.properties diff --git a/spring-mvc-themes/src/main/resources/db/sql/create-db.sql b/spring-mvc-views/src/main/resources/db/sql/create-db.sql similarity index 100% rename from spring-mvc-themes/src/main/resources/db/sql/create-db.sql rename to spring-mvc-views/src/main/resources/db/sql/create-db.sql diff --git a/spring-mvc-themes/src/main/resources/db/sql/insert-data.sql b/spring-mvc-views/src/main/resources/db/sql/insert-data.sql similarity index 100% rename from spring-mvc-themes/src/main/resources/db/sql/insert-data.sql rename to spring-mvc-views/src/main/resources/db/sql/insert-data.sql diff --git a/spring-mvc-themes/src/main/resources/light.properties b/spring-mvc-views/src/main/resources/light.properties similarity index 100% rename from spring-mvc-themes/src/main/resources/light.properties rename to spring-mvc-views/src/main/resources/light.properties diff --git a/spring-mvc-themes/src/main/resources/light_en_US.properties b/spring-mvc-views/src/main/resources/light_en_US.properties similarity index 100% rename from spring-mvc-themes/src/main/resources/light_en_US.properties rename to spring-mvc-views/src/main/resources/light_en_US.properties diff --git a/spring-mvc-themes/src/main/resources/themes/black.css b/spring-mvc-views/src/main/resources/themes/black.css similarity index 100% rename from spring-mvc-themes/src/main/resources/themes/black.css rename to spring-mvc-views/src/main/resources/themes/black.css diff --git a/spring-mvc-themes/src/main/resources/themes/white.css b/spring-mvc-views/src/main/resources/themes/white.css similarity index 100% rename from spring-mvc-themes/src/main/resources/themes/white.css rename to spring-mvc-views/src/main/resources/themes/white.css diff --git a/spring-mvc-themes/src/main/webapp/WEB-INF/index.jsp b/spring-mvc-views/src/main/webapp/WEB-INF/index.jsp similarity index 100% rename from spring-mvc-themes/src/main/webapp/WEB-INF/index.jsp rename to spring-mvc-views/src/main/webapp/WEB-INF/index.jsp From dc36ed9759c2ee43cf34d6e68003627801ad1064 Mon Sep 17 00:00:00 2001 From: sandip singh Date: Mon, 18 Nov 2019 20:42:29 +0530 Subject: [PATCH 4/5] BAEL-3283 - Fixed the pom.xml to have the latest dependencies --- spring-mvc-views/pom.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/spring-mvc-views/pom.xml b/spring-mvc-views/pom.xml index 60ba41f534..97666e1741 100644 --- a/spring-mvc-views/pom.xml +++ b/spring-mvc-views/pom.xml @@ -3,7 +3,7 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - spring-mvc-themes + spring-mvc-views war spring-mvc-themes @@ -17,14 +17,14 @@ 1.8 - 2.3.2-b02 - 4.0.0 + 2.3.3 + 4.0.1 5.2.1.RELEASE 5.2.1.RELEASE - 2.1.10.RELEASE + 2.2.2.RELEASE 2.2.2 2.5.0 - 5.2.17.Final + 5.4.9.Final enter-location-of-server @@ -110,7 +110,7 @@ ${maven-war-plugin.version} src/main/webapp - spring-mvc-theme + spring-mvc-views false ${deploy-path} From 8a604e3d5d5469a7cdac24afdbac53fd25a99a5a Mon Sep 17 00:00:00 2001 From: sandip singh Date: Wed, 27 Nov 2019 22:15:21 +0530 Subject: [PATCH 5/5] BAEL-3283 Corrected the indentation as per the review comments. --- pom.xml | 4 +-- spring-mvc-views/pom.xml | 2 +- .../com/baeldung/config/DataSourceConfig.java | 4 +-- .../com/baeldung/config/SecurityConfig.java | 31 +++++++++---------- 4 files changed, 20 insertions(+), 21 deletions(-) diff --git a/pom.xml b/pom.xml index b5867cecb6..2139a8aa0a 100644 --- a/pom.xml +++ b/pom.xml @@ -773,7 +773,7 @@ spring-mvc-kotlin spring-mvc-simple spring-mvc-simple-2 - spring-mvc-views + spring-mvc-views spring-mvc-velocity spring-mvc-webflow spring-mvc-xml @@ -1514,7 +1514,7 @@ spring-mvc-kotlin spring-mvc-simple spring-mvc-simple-2 - spring-mvc-views + spring-mvc-views spring-mvc-velocity spring-mvc-webflow spring-mvc-xml diff --git a/spring-mvc-views/pom.xml b/spring-mvc-views/pom.xml index 97666e1741..c3a3540fce 100644 --- a/spring-mvc-views/pom.xml +++ b/spring-mvc-views/pom.xml @@ -5,7 +5,7 @@ 4.0.0 spring-mvc-views war - spring-mvc-themes + spring-mvc-views com.baeldung diff --git a/spring-mvc-views/src/main/java/com/baeldung/config/DataSourceConfig.java b/spring-mvc-views/src/main/java/com/baeldung/config/DataSourceConfig.java index ff47bd7047..803c30f29d 100644 --- a/spring-mvc-views/src/main/java/com/baeldung/config/DataSourceConfig.java +++ b/spring-mvc-views/src/main/java/com/baeldung/config/DataSourceConfig.java @@ -19,8 +19,8 @@ public class DataSourceConfig { public DataSource dataSource() { EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder(); return builder.setType(EmbeddedDatabaseType.HSQL) - .addScripts("db/sql/create-db.sql", "db/sql/insert-data.sql") - .build(); + .addScripts("db/sql/create-db.sql", "db/sql/insert-data.sql") + .build(); } @Bean diff --git a/spring-mvc-views/src/main/java/com/baeldung/config/SecurityConfig.java b/spring-mvc-views/src/main/java/com/baeldung/config/SecurityConfig.java index 4d96d04ce9..2e0a413cf3 100644 --- a/spring-mvc-views/src/main/java/com/baeldung/config/SecurityConfig.java +++ b/spring-mvc-views/src/main/java/com/baeldung/config/SecurityConfig.java @@ -26,27 +26,26 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.jdbcAuthentication() - .passwordEncoder(passwordEncoder()) - .dataSource(dataSource); + .passwordEncoder(passwordEncoder()) + .dataSource(dataSource); } @Override protected void configure(HttpSecurity http) throws Exception { - http - .csrf() - .disable() - .authorizeRequests() - .antMatchers("/anonymous*").anonymous() - .antMatchers("/login*").permitAll() - .anyRequest().authenticated() - .and() - .formLogin() - .and() - .logout() - .logoutUrl("/logout.do") - .invalidateHttpSession(true) - .clearAuthentication(true); + http.csrf() + .disable() + .authorizeRequests() + .antMatchers("/anonymous*").anonymous() + .antMatchers("/login*").permitAll() + .anyRequest().authenticated() + .and() + .formLogin() + .and() + .logout() + .logoutUrl("/logout.do") + .invalidateHttpSession(true) + .clearAuthentication(true); } @Override