Skip to content

feat: Document VaadinSecurityConfigurer #4420

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 24 commits into from
Aug 6, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
4eeac97
feat: Document VaadinSecurityConfigurer
mshabarov Jul 3, 2025
385c25c
upgrade stateless example and add todos
mshabarov Jul 3, 2025
37ee7e5
Update more code examples to use VaadinSecurityConfigurer
tltv Jul 16, 2025
bf93a57
Update more code examples to use VaadinSecurityConfigurer
tltv Jul 17, 2025
0399228
Update more code examples to use VaadinSecurityConfigurer
tltv Jul 21, 2025
00d5f6e
Update more code examples to use VaadinSecurityConfigurer
tltv Jul 21, 2025
4186268
Update Upgrading from Vaadin 23 Guide
tltv Jul 22, 2025
0105465
Update hilla upgrade guide and rest of the examples
tltv Jul 22, 2025
e201e34
Updated for VaadinSecurityConfigurer
tltv Jul 22, 2025
3c0977b
Merge branch 'latest' into security-configurer-example
tltv Jul 22, 2025
b774043
Update articles/building-apps/security/add-logout/hilla.adoc
tltv Jul 23, 2025
b0dee38
Update articles/flow/security/enabling-security.adoc
tltv Jul 23, 2025
0d6e722
Update articles/hilla/lit/guides/security/spring-login.adoc
tltv Jul 23, 2025
790e536
Upgrade SecurityConfig example of JDBC authentication
tltv Jul 23, 2025
0551e35
Updated add-login article
tltv Jul 24, 2025
b7907ad
Add callout for import
tltv Jul 24, 2025
76a094b
Move VaadinSecurityConfigurer to separate page
tltv Jul 25, 2025
033ac39
Update LDAP auth example
tltv Jul 25, 2025
43c5693
Joined two notes
tltv Jul 28, 2025
646d7d3
Remove deprecated ant matchers from examples
tltv Jul 28, 2025
9af6fed
Update Multiple Filter Chains example
tltv Jul 30, 2025
99d1199
Merge branch 'latest' into security-configurer-example
mshabarov Aug 6, 2025
f86ad4b
change deprecation target from 24.8 to 24.9
mshabarov Aug 6, 2025
0ba73bc
a note about single vaadin security configurer
mshabarov Aug 6, 2025
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
128 changes: 122 additions & 6 deletions articles/building-apps/security/add-login/flow.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ public class LoginView extends Main implements BeforeEnterObserver {
private final LoginForm login;

public LoginView() {
addClassNames(LumoUtility.Display.FLEX, LumoUtility.JustifyContent.CENTER,
addClassNames(LumoUtility.Display.FLEX, LumoUtility.JustifyContent.CENTER,
LumoUtility.AlignItems.CENTER);
setSizeFull();
login = new LoginForm();
Expand Down Expand Up @@ -65,9 +65,37 @@ If your application's root package is `com.example.application`, place the login

To instruct Spring Security to use your login view, modify your security configuration:

.SecurityConfig.java
[.example]
--

.`SecurityConfig.java`
[source,java]
----
<source-info group="VaadinSecurityConfigurer"></source-info>
@EnableWebSecurity
@Configuration
@Import(VaadinAwareSecurityContextHolderStrategyConfiguration.class)
class SecurityConfig {

@Bean
SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
// Configure Vaadin's security using VaadinSecurityConfigurer
http.with(VaadinSecurityConfigurer.vaadin(), configurer -> {
// tag::snippet[]
configurer.loginView(LoginView.class);
// end::snippet[]
});

return http.build();
}
...
}
----

.`SecurityConfig.java`
[source,java]
----
<source-info group="VaadinWebSecurity (deprecated since V24.9)"></source-info>
@EnableWebSecurity
@Configuration
class SecurityConfig extends VaadinWebSecurity {
Expand All @@ -83,6 +111,8 @@ class SecurityConfig extends VaadinWebSecurity {
}
----

--

Now, when a user tries to access the application, they'll be redirected to the login page.

[IMPORTANT]
Expand Down Expand Up @@ -130,9 +160,62 @@ Create a new package: [packagename]`[application package].security`

Inside this package, create a [classname]`SecurityConfig` class:

.SecurityConfig.class
[.example]
--

.`SecurityConfig.java`
[source,java]
----
<source-info group="VaadinSecurityConfigurer"></source-info>
import com.vaadin.flow.spring.security.VaadinSecurityConfigurer;
import org.slf4j.LoggerFactory;
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.userdetails.User;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.provisioning.UserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;
import com.vaadin.flow.spring.security.VaadinAwareSecurityContextHolderStrategyConfiguration;

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

@Bean
SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
// Configure Vaadin's security using VaadinSecurityConfigurer
http.with(VaadinSecurityConfigurer.vaadin(), configurer -> {
configurer.loginView(LoginView.class);
});

return http.build();
}

@Bean
public UserDetailsManager userDetailsManager() {
LoggerFactory.getLogger(SecurityConfig.class)
.warn("Using in-memory user details manager!");
var user = User.withUsername("user")
.password("{noop}user")
.roles("USER")
.build();
var admin = User.withUsername("admin")
.password("{noop}admin")
.roles("ADMIN")
.build();
return new InMemoryUserDetailsManager(user, admin);
}
}
----

.`SecurityConfig.java`
[source,java]
----
<source-info group="VaadinWebSecurity (deprecated since V24.9)"></source-info>
import com.vaadin.flow.spring.security.VaadinWebSecurity;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
Expand Down Expand Up @@ -168,6 +251,9 @@ class SecurityConfig extends VaadinWebSecurity {
}
}
----

--

====


Expand Down Expand Up @@ -198,8 +284,8 @@ public class LoginView extends Main implements BeforeEnterObserver {
private final LoginForm login;

public LoginView() {
addClassNames(LumoUtility.Display.FLEX,
LumoUtility.JustifyContent.CENTER,
addClassNames(LumoUtility.Display.FLEX,
LumoUtility.JustifyContent.CENTER,
LumoUtility.AlignItems.CENTER);
setSizeFull();
login = new LoginForm();
Expand All @@ -226,9 +312,37 @@ public class LoginView extends Main implements BeforeEnterObserver {
====
Modify [classname]`SecurityConfig` to reference the `LoginView`:

.SecurityConfig.java
[.example]
--

.`SecurityConfig.java`
[source,java]
----
<source-info group="VaadinSecurityConfigurer"></source-info>
@EnableWebSecurity
@Configuration
@Import(VaadinAwareSecurityContextHolderStrategyConfiguration.class)
class SecurityConfig {

@Bean
SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
// Configure Vaadin's security using VaadinSecurityConfigurer
http.with(VaadinSecurityConfigurer.vaadin(), configurer -> {
// tag::snippet[]
configurer.loginView(LoginView.class);
// end::snippet[]
});

return http.build();
}
...
}
----

.`SecurityConfig.java`
[source,java]
----
<source-info group="VaadinWebSecurity (deprecated since V24.9)"></source-info>
@EnableWebSecurity
@Configuration
class SecurityConfig extends VaadinWebSecurity {
Expand All @@ -243,6 +357,8 @@ class SecurityConfig extends VaadinWebSecurity {
...
}
----

--
====


Expand Down
124 changes: 119 additions & 5 deletions articles/building-apps/security/add-login/hilla.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ Vaadin does not provide a built-in user information type, so you need to define
[source,java]
----
public record UserInfo(
@NonNull String name,
@NonNull String name,
@NonNull Collection<String> authorities
) {
}
Expand Down Expand Up @@ -155,9 +155,37 @@ Spring Security's *form login* mechanism automatically processes authentication

To instruct Spring Security to use your login view, modify your security configuration:

.SecurityConfig.java
[.example]
--

.`SecurityConfig.java`
[source,java]
----
<source-info group="VaadinSecurityConfigurer"></source-info>
@EnableWebSecurity
@Configuration
@Import(VaadinAwareSecurityContextHolderStrategyConfiguration.class)
class SecurityConfig {

@Bean
SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
// Configure Vaadin's security using VaadinSecurityConfigurer
http.with(VaadinSecurityConfigurer.vaadin(), configurer -> {
// tag::snippet[]
configurer.loginView("/login");
// end::snippet[]
});

return http.build();
}
...
}
----

.`SecurityConfig.java`
[source,java]
----
<source-info group="VaadinWebSecurity (deprecated since V24.9)"></source-info>
@EnableWebSecurity
@Configuration
class SecurityConfig extends VaadinWebSecurity {
Expand All @@ -173,6 +201,7 @@ class SecurityConfig extends VaadinWebSecurity {
}
----

--
Now, when a user tires to access a protected view, they'll be redirected to the login page.

[IMPORTANT]
Expand Down Expand Up @@ -220,9 +249,62 @@ Create a new package: [packagename]`[application package].security`

Inside this package, create a [classname]`SecurityConfig` class:

.SecurityConfig.class
[.example]
--

.`SecurityConfig.java`
[source,java]
----
<source-info group="VaadinSecurityConfigurer"></source-info>
import com.vaadin.flow.spring.security.VaadinSecurityConfigurer;
import com.vaadin.flow.spring.security.VaadinAwareSecurityContextHolderStrategyConfiguration;
import org.slf4j.LoggerFactory;
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.userdetails.User;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.provisioning.UserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;

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

@Bean
SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
// Configure Vaadin's security using VaadinSecurityConfigurer
http.with(VaadinSecurityConfigurer.vaadin(), configurer -> {
configurer.loginView("/login");
});

return http.build();
}

@Bean
public UserDetailsManager userDetailsManager() {
LoggerFactory.getLogger(SecurityConfig.class)
.warn("Using in-memory user details manager!");
var user = User.withUsername("user")
.password("{noop}user")
.roles("USER")
.build();
var admin = User.withUsername("admin")
.password("{noop}admin")
.roles("ADMIN")
.build();
return new InMemoryUserDetailsManager(user, admin);
}
}
----

.`SecurityConfig.java`
[source,java]
----
<source-info group="VaadinWebSecurity (deprecated since V24.9)"></source-info>
import com.vaadin.flow.spring.security.VaadinWebSecurity;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
Expand Down Expand Up @@ -258,6 +340,8 @@ class SecurityConfig extends VaadinWebSecurity {
}
}
----

--
====


Expand All @@ -274,7 +358,7 @@ Inside this package, create a [recordname]`UserInfo` record:
import org.jspecify.annotations.NonNull;
import java.util.Collection;

public record UserInfo(@NonNull String name,
public record UserInfo(@NonNull String name,
@NonNull Collection<String> authorities) {
}

Expand Down Expand Up @@ -390,9 +474,37 @@ export default function LoginView() {
====
Modify [classname]`SecurityConfig` to reference the new login view:

.SecurityConfig.java
[.example]
--

.`SecurityConfig.java`
[source,java]
----
<source-info group="VaadinSecurityConfigurer"></source-info>
@EnableWebSecurity
@Configuration
@Import(VaadinAwareSecurityContextHolderStrategyConfiguration.class)
class SecurityConfig {

@Bean
SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
// Configure Vaadin's security using VaadinSecurityConfigurer
http.with(VaadinSecurityConfigurer.vaadin(), configurer -> {
// tag::snippet[]
configurer.loginView("/login");
// end::snippet[]
});

return http.build();
}
...
}
----

.`SecurityConfig.java`
[source,java]
----
<source-info group="VaadinWebSecurity (deprecated since V24.9)"></source-info>
@EnableWebSecurity
@Configuration
class SecurityConfig extends VaadinWebSecurity {
Expand All @@ -407,6 +519,8 @@ class SecurityConfig extends VaadinWebSecurity {
...
}
----

--
====


Expand Down
Loading
Loading