Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.Profile;
import org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler;
import org.springframework.security.access.expression.method.MethodSecurityExpressionHandler;
Expand All @@ -43,7 +42,6 @@
import com.vaadin.flow.spring.flowsecurity.data.UserInfo;
import com.vaadin.flow.spring.flowsecurity.service.UserInfoService;
import com.vaadin.flow.spring.flowsecurity.views.LoginView;
import com.vaadin.flow.spring.security.VaadinAwareSecurityContextHolderStrategyConfiguration;

import static com.vaadin.flow.spring.flowsecurity.service.UserInfoService.ROLE_ADMIN;
import static com.vaadin.flow.spring.security.VaadinSecurityConfigurer.vaadin;
Expand All @@ -52,7 +50,6 @@
@EnableMethodSecurity(prePostEnabled = false, jsr250Enabled = true, securedEnabled = true)
@Configuration
@Profile("default")
@Import(VaadinAwareSecurityContextHolderStrategyConfiguration.class)
public class SecurityConfig {

private final UserInfoService userInfoService;
Expand Down Expand Up @@ -85,8 +82,7 @@ public String getLogoutSuccessUrl() {
}

@Bean
SecurityFilterChain vaadinSecurityFilterChain(HttpSecurity http)
throws Exception {
SecurityFilterChain vaadinSecurityFilterChain(HttpSecurity http) {
http.authorizeHttpRequests(auth -> auth

.requestMatchers(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
Expand All @@ -41,14 +40,12 @@
import com.vaadin.flow.spring.flowsecurity.service.UserInfoService;
import com.vaadin.flow.spring.flowsecurity.views.LoginView;
import com.vaadin.flow.spring.security.NavigationAccessControlConfigurer;
import com.vaadin.flow.spring.security.VaadinAwareSecurityContextHolderStrategyConfiguration;

import static com.vaadin.flow.spring.flowsecurity.service.UserInfoService.ROLE_ADMIN;
import static com.vaadin.flow.spring.security.VaadinSecurityConfigurer.vaadin;

@EnableWebSecurity
@Configuration
@Import(VaadinAwareSecurityContextHolderStrategyConfiguration.class)
public class SecurityConfig {

@Autowired
Expand Down Expand Up @@ -97,8 +94,7 @@ public String getLogoutSuccessUrl() {
}

@Bean
SecurityFilterChain vaadinSecurityFilterChain(HttpSecurity http)
throws Exception {
SecurityFilterChain vaadinSecurityFilterChain(HttpSecurity http) {
http.authorizeHttpRequests(cfg -> cfg
.requestMatchers("/admin-only/**", "/admin")
.hasAnyRole(ROLE_ADMIN).requestMatchers("/private")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@
import com.vaadin.flow.spring.security.RequestUtil;
import com.vaadin.flow.spring.security.SpringAccessPathChecker;
import com.vaadin.flow.spring.security.UidlRedirectStrategy;
import com.vaadin.flow.spring.security.VaadinSavedRequestAwareAuthenticationSuccessHandler;

import static com.vaadin.flow.spring.flowsecurity.service.UserInfoService.ROLE_ADMIN;

Expand Down Expand Up @@ -153,7 +154,9 @@ public SecurityFilterChain webFilterChain(HttpSecurity http,
});

// Custom login page with form authentication
http.formLogin(cfg -> cfg.loginPage("/my/login/page").permitAll());
http.formLogin(cfg -> cfg.loginPage("/my/login/page").successHandler(
new VaadinSavedRequestAwareAuthenticationSuccessHandler())
.permitAll());
DefaultSecurityFilterChain filterChain = http.build();
// Test application uses AuthenticationContext, configure it with
// the logout handlers
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@
import org.hamcrest.CoreMatchers;
import org.hamcrest.MatcherAssert;
import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;
import org.openqa.selenium.WebDriver;

Expand Down Expand Up @@ -117,11 +116,6 @@ public void redirect_to_private_view_after_login() {
}

@Test
@Ignore("""
Requires VaadinAwareSecurityContextHolderStrategyConfiguration that
in a custom Spring Security configuration without Vaadin helpers might not be imported.
Leaving the test here just as a template in case of future improvements.
""")
public void redirect_to_private_view_after_navigation_and_login() {
open("");
navigateTo("private", false);
Expand Down Expand Up @@ -286,11 +280,6 @@ public void navigate_in_thread_without_access() {
}

@Test
@Ignore("""
Requires VaadinAwareSecurityContextHolderStrategyConfiguration that
in a custom Spring Security configuration without Vaadin helpers might not be imported.
Leaving the test here just as a template in case of future improvements.
""")
public void navigate_in_thread_with_access() {
open(LOGIN_PATH);
loginAdmin();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
package com.vaadin.flow.spring.flowsecurity;

import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;
import org.openqa.selenium.WebDriver;

Expand All @@ -28,11 +27,6 @@
public class UIAccessContextIT extends AbstractIT {

@Test
@Ignore("""
Requires VaadinAwareSecurityContextHolderStrategyConfiguration that
in a custom Spring Security configuration without Vaadin helpers might not be imported.
Leaving the test here just as a template in case of future improvements.
""")
public void securityContextSetForUIAccess() throws Exception {
String expectedUserBalance = "Hello John the User, your bank account balance is $10000.00.";
String expectedAdminBalance = "Hello Emma the Admin, your bank account balance is $200000.00.";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,25 +17,20 @@

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.Profile;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;

import com.vaadin.flow.spring.security.VaadinAwareSecurityContextHolderStrategyConfiguration;

import static com.vaadin.flow.spring.security.VaadinSecurityConfigurer.vaadin;

@EnableWebSecurity
@Configuration
@Profile("default")
@Import(VaadinAwareSecurityContextHolderStrategyConfiguration.class)
public class SecurityConfig {

@Bean
SecurityFilterChain vaadinSecurityFilterChain(HttpSecurity http)
throws Exception {
SecurityFilterChain vaadinSecurityFilterChain(HttpSecurity http) {
http.with(vaadin(), cfg -> {
});
return http.build();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,14 +25,13 @@

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DependsOn;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.Profile;
import org.springframework.http.HttpMethod;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolderStrategy;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
Expand All @@ -50,15 +49,13 @@
import com.vaadin.flow.spring.flowsecurity.service.UserInfoService;
import com.vaadin.flow.spring.flowsecurity.views.LoginView;
import com.vaadin.flow.spring.security.UidlRedirectStrategy;
import com.vaadin.flow.spring.security.VaadinAwareSecurityContextHolderStrategyConfiguration;

import static com.vaadin.flow.spring.flowsecurity.service.UserInfoService.ROLE_ADMIN;
import static com.vaadin.flow.spring.security.VaadinSecurityConfigurer.vaadin;

@EnableWebSecurity
@Configuration
@Profile("default")
@Import(VaadinAwareSecurityContextHolderStrategyConfiguration.class)
public class SecurityConfig {

private final UserInfoService userInfoService;
Expand Down Expand Up @@ -99,8 +96,7 @@ public String getLogoutSuccessUrl() {
}

@Bean
SecurityFilterChain vaadinSecurityFilterChain(HttpSecurity http)
throws Exception {
SecurityFilterChain vaadinSecurityFilterChain(HttpSecurity http) {
http.authorizeHttpRequests(auth -> auth
.requestMatchers("/admin-only/**").hasAnyRole(ROLE_ADMIN)
.requestMatchers("/public/**", "/error").permitAll()
Expand Down Expand Up @@ -171,9 +167,10 @@ public UserDetails loadUserByUsername(String username)
}

@Bean
@DependsOn("VaadinSecurityContextHolderStrategy")
public SwitchUserFilter switchUserFilter() {
public SwitchUserFilter switchUserFilter(
SecurityContextHolderStrategy securityContextHolderStrategy) {
SwitchUserFilter filter = new SwitchUserFilter();
filter.setSecurityContextHolderStrategy(securityContextHolderStrategy);
filter.setUserDetailsService(userDetailsService());
filter.setSwitchUserMatcher(PathPatternRequestMatcher
.pathPattern(HttpMethod.GET, "/impersonate"));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,25 +17,20 @@

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.Profile;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;

import com.vaadin.flow.spring.security.VaadinAwareSecurityContextHolderStrategyConfiguration;

import static com.vaadin.flow.spring.security.VaadinSecurityConfigurer.vaadin;

@EnableWebSecurity
@Configuration
@Profile("default")
@Import(VaadinAwareSecurityContextHolderStrategyConfiguration.class)
public class SecurityConfig {

@Bean
SecurityFilterChain vaadinSecurityFilterChain(HttpSecurity http)
throws Exception {
SecurityFilterChain vaadinSecurityFilterChain(HttpSecurity http) {
http.with(vaadin(), cfg -> cfg.loginView(LoginView.class));
return http.build();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,25 +17,20 @@

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.Profile;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;

import com.vaadin.flow.spring.security.VaadinAwareSecurityContextHolderStrategyConfiguration;

import static com.vaadin.flow.spring.security.VaadinSecurityConfigurer.vaadin;

@EnableWebSecurity
@Configuration
@Profile("default")
@Import(VaadinAwareSecurityContextHolderStrategyConfiguration.class)
public class SecurityConfig {

@Bean
SecurityFilterChain vaadinSecurityFilterChain(HttpSecurity http)
throws Exception {
SecurityFilterChain vaadinSecurityFilterChain(HttpSecurity http) {
http.with(vaadin(), cfg -> cfg.loginView(LoginView.class));
return http.build();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,17 @@
import java.util.List;
import java.util.Optional;

import org.springframework.beans.factory.SmartInitializingSingleton;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;
import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer;
import org.springframework.security.config.core.GrantedAuthorityDefaults;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.context.SecurityContextHolderStrategy;
import org.springframework.security.web.access.WebInvocationPrivilegeEvaluator;

import com.vaadin.flow.server.auth.AccessAnnotationChecker;
Expand All @@ -40,6 +43,7 @@
import com.vaadin.flow.spring.security.RequestUtil;
import com.vaadin.flow.spring.security.SpringAccessPathChecker;
import com.vaadin.flow.spring.security.SpringNavigationAccessControl;
import com.vaadin.flow.spring.security.VaadinAwareSecurityContextHolderStrategy;
import com.vaadin.flow.spring.security.VaadinDefaultRequestCache;
import com.vaadin.flow.spring.security.VaadinRolePrefixHolder;

Expand All @@ -49,7 +53,7 @@
* @author Vaadin Ltd
*
*/
@Configuration(proxyBeanMethods = false)
@AutoConfiguration
@ConditionalOnClass(WebSecurityCustomizer.class)
@EnableConfigurationProperties(VaadinConfigurationProperties.class)
public class SpringSecurityAutoConfiguration {
Expand Down Expand Up @@ -209,4 +213,16 @@ public VaadinRolePrefixHolder vaadinRolePrefixHolder(
AuthenticationContext authenticationContext() {
return new AuthenticationContext();
}

@Bean
@ConditionalOnMissingBean
SecurityContextHolderStrategy vaadinAwareSecurityContextHolderStrategy() {
return new VaadinAwareSecurityContextHolderStrategy();
}

@Bean
SmartInitializingSingleton securityContextHolderStrategyInitializer(
SecurityContextHolderStrategy strategy) {
return () -> SecurityContextHolder.setContextHolderStrategy(strategy);
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,6 @@ protected Stream<String> getExcludedPatterns() {
"com\\.vaadin\\.flow\\.spring\\.security\\.AuthenticationContext",
"com\\.vaadin\\.flow\\.spring\\.security\\.NavigationAccessControlConfigurer",
"com\\.vaadin\\.flow\\.spring\\.security\\.VaadinAwareSecurityContextHolderStrategy",
"com\\.vaadin\\.flow\\.spring\\.security\\.VaadinAwareSecurityContextHolderStrategyConfiguration",
"com\\.vaadin\\.flow\\.spring\\.security\\.VaadinSecurityConfigurer",
"com\\.vaadin\\.flow\\.spring\\.security\\.VaadinSecurityConfigurer(\\$.*)?",
"com\\.vaadin\\.flow\\.spring\\.security\\.VaadinDefaultRequestCache",
Expand Down
Loading
Loading