|
|
@@ -1,19 +1,48 @@
|
|
|
package pl.sudra.configuration;
|
|
|
|
|
|
+import jakarta.annotation.Resource;
|
|
|
import org.springframework.context.annotation.Bean;
|
|
|
import org.springframework.context.annotation.Configuration;
|
|
|
+import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
|
|
|
+import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
|
|
|
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
|
|
|
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.core.userdetails.UserDetails;
|
|
|
+import org.springframework.security.core.userdetails.UserDetailsService;
|
|
|
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
|
|
|
+import org.springframework.security.crypto.factory.PasswordEncoderFactories;
|
|
|
+import org.springframework.security.crypto.password.NoOpPasswordEncoder;
|
|
|
+import org.springframework.security.crypto.password.PasswordEncoder;
|
|
|
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
|
|
|
import org.springframework.security.web.SecurityFilterChain;
|
|
|
+import org.springframework.security.web.csrf.CsrfFilter;
|
|
|
+import org.springframework.web.filter.CharacterEncodingFilter;
|
|
|
|
|
|
@Configuration
|
|
|
@EnableWebSecurity
|
|
|
-@EnableMethodSecurity
|
|
|
+@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
|
|
|
public class SecurityConfiguration {
|
|
|
+ @Resource(name = "myAppUserDetailsService")
|
|
|
+ private UserDetailsService userDetailsService;
|
|
|
+
|
|
|
+ @Bean
|
|
|
+ public PasswordEncoder passwordEncoder() {
|
|
|
+ return new BCryptPasswordEncoder();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Bean
|
|
|
+ DaoAuthenticationProvider authProvider() {
|
|
|
+ DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
|
|
|
+ // for database users
|
|
|
+ authProvider.setUserDetailsService(userDetailsService);
|
|
|
+ authProvider.setPasswordEncoder(passwordEncoder());
|
|
|
+ // for in-memory users
|
|
|
+ // authProvider.setUserDetailsService(userDetailsService());
|
|
|
+ return authProvider;
|
|
|
+ }
|
|
|
+
|
|
|
@Bean
|
|
|
public InMemoryUserDetailsManager userDetailsService() {
|
|
|
UserDetails user = User.withDefaultPasswordEncoder()
|
|
|
@@ -36,9 +65,15 @@ public class SecurityConfiguration {
|
|
|
|
|
|
@Bean
|
|
|
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
|
|
|
+ CharacterEncodingFilter filter = new CharacterEncodingFilter();
|
|
|
+ filter.setEncoding("UTF-8");
|
|
|
+ filter.setForceEncoding(true);
|
|
|
+ http.addFilterBefore(filter, CsrfFilter.class);
|
|
|
+
|
|
|
http
|
|
|
.authorizeHttpRequests((authz) -> authz
|
|
|
.requestMatchers("/appUsers*").hasRole("ADMIN")
|
|
|
+ .requestMatchers("/appUserRole*").hasRole("ADMIN")
|
|
|
.requestMatchers("/exampleOne").hasAuthority("ROLE_USER")
|
|
|
.requestMatchers("/exampleTwo").hasAnyAuthority("ROLE_STUDENT", "ROLE_ADMIN")
|
|
|
.requestMatchers("/exampleThree").hasRole("STUDENT")
|