diff --git a/2024-05/spring-23/2.7-style/pom.xml b/2024-05/spring-23/2.7-style/pom.xml
new file mode 100644
index 00000000..25baa882
--- /dev/null
+++ b/2024-05/spring-23/2.7-style/pom.xml
@@ -0,0 +1,53 @@
+
+
+ 4.0.0
+
+ ru.otus
+ spring-framework-23-ss-start
+ 1.0-SNAPSHOT
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.7.8
+
+
+
+ 17
+ 17
+ 17
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ org.springframework.boot
+ spring-boot-starter-thymeleaf
+
+
+
+ org.springframework.boot
+ spring-boot-starter-security
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
diff --git a/2024-05/spring-23/2.7-style/src/main/java/ru/otus/spring/Main.java b/2024-05/spring-23/2.7-style/src/main/java/ru/otus/spring/Main.java
new file mode 100644
index 00000000..95fa70ed
--- /dev/null
+++ b/2024-05/spring-23/2.7-style/src/main/java/ru/otus/spring/Main.java
@@ -0,0 +1,12 @@
+package ru.otus.spring;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class Main {
+
+ public static void main( String[] args ) {
+ SpringApplication.run( Main.class );
+ }
+}
diff --git a/2024-05/spring-23/2.7-style/src/main/java/ru/otus/spring/rest/PagesController.java b/2024-05/spring-23/2.7-style/src/main/java/ru/otus/spring/rest/PagesController.java
new file mode 100644
index 00000000..47321812
--- /dev/null
+++ b/2024-05/spring-23/2.7-style/src/main/java/ru/otus/spring/rest/PagesController.java
@@ -0,0 +1,28 @@
+package ru.otus.spring.rest;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+
+@Controller
+public class PagesController {
+
+ @GetMapping("/")
+ public String indexPage() {
+ return "index";
+ }
+
+ @GetMapping("/public")
+ public String publicPage() {
+ return "public";
+ }
+
+ @GetMapping("/authenticated")
+ public String authenticatedPage() {
+ return "authenticated";
+ }
+
+ @GetMapping("/success")
+ public String successPage() {
+ return "success";
+ }
+}
diff --git a/2024-05/spring-23/2.7-style/src/main/java/ru/otus/spring/security/SecurityConfiguration.java b/2024-05/spring-23/2.7-style/src/main/java/ru/otus/spring/security/SecurityConfiguration.java
new file mode 100644
index 00000000..a708cc22
--- /dev/null
+++ b/2024-05/spring-23/2.7-style/src/main/java/ru/otus/spring/security/SecurityConfiguration.java
@@ -0,0 +1,49 @@
+package ru.otus.spring.security;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+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.crypto.password.NoOpPasswordEncoder;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.security.provisioning.InMemoryUserDetailsManager;
+import org.springframework.security.web.SecurityFilterChain;
+
+@Configuration
+@EnableWebSecurity
+public class SecurityConfiguration {
+
+ @Bean
+ public SecurityFilterChain securityFilterChain( HttpSecurity http ) throws Exception {
+ http
+ .csrf().disable()
+ .authorizeHttpRequests( ( authorize ) -> authorize
+ .antMatchers( "/public" ).permitAll()
+ .antMatchers( "/authenticated" ).authenticated()
+ .anyRequest().permitAll()
+ )
+ .httpBasic();
+ return http.build();
+ }
+
+
+ @Bean
+ public PasswordEncoder passwordEncoder() {
+// return new BCryptPasswordEncoder(10);
+ return NoOpPasswordEncoder.getInstance();
+
+ }
+
+ @Bean
+ public InMemoryUserDetailsManager userDetailsService() {
+ UserDetails user = User
+ .builder()
+ .username( "user" )
+ .password( "password" )
+ .roles( "USER" )
+ .build();
+ return new InMemoryUserDetailsManager( user );
+ }
+}
diff --git a/2024-05/spring-23/2.7-style/src/main/resources/application.yml b/2024-05/spring-23/2.7-style/src/main/resources/application.yml
new file mode 100644
index 00000000..e69de29b
diff --git a/2024-05/spring-23/2.7-style/src/main/resources/templates/authenticated.html b/2024-05/spring-23/2.7-style/src/main/resources/templates/authenticated.html
new file mode 100644
index 00000000..9f8b0d7e
--- /dev/null
+++ b/2024-05/spring-23/2.7-style/src/main/resources/templates/authenticated.html
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+Только для авторизованных
+
+
diff --git a/2024-05/spring-23/2.7-style/src/main/resources/templates/index.html b/2024-05/spring-23/2.7-style/src/main/resources/templates/index.html
new file mode 100644
index 00000000..f4d11090
--- /dev/null
+++ b/2024-05/spring-23/2.7-style/src/main/resources/templates/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+/public
+
+/authenticated
+
+
diff --git a/2024-05/spring-23/2.7-style/src/main/resources/templates/public.html b/2024-05/spring-23/2.7-style/src/main/resources/templates/public.html
new file mode 100644
index 00000000..77188469
--- /dev/null
+++ b/2024-05/spring-23/2.7-style/src/main/resources/templates/public.html
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+Доступен всем
+
+
diff --git a/2024-05/spring-23/2.7-style/src/main/resources/templates/success.html b/2024-05/spring-23/2.7-style/src/main/resources/templates/success.html
new file mode 100644
index 00000000..89db5f22
--- /dev/null
+++ b/2024-05/spring-23/2.7-style/src/main/resources/templates/success.html
@@ -0,0 +1,10 @@
+
+
+
+
+ Вы успешно вошли
+
+
+Вы успешно вошли
+
+
diff --git a/2024-05/spring-23/3.x-style/pom.xml b/2024-05/spring-23/3.x-style/pom.xml
new file mode 100644
index 00000000..27319eb8
--- /dev/null
+++ b/2024-05/spring-23/3.x-style/pom.xml
@@ -0,0 +1,53 @@
+
+
+ 4.0.0
+
+ ru.otus
+ spring-framework-23-ss-start
+ 1.0-SNAPSHOT
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 3.2.5
+
+
+
+ 17
+ 17
+ 17
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ org.springframework.boot
+ spring-boot-starter-thymeleaf
+
+
+
+ org.springframework.boot
+ spring-boot-starter-security
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
diff --git a/2024-05/spring-23/3.x-style/src/main/java/ru/otus/spring/Main.java b/2024-05/spring-23/3.x-style/src/main/java/ru/otus/spring/Main.java
new file mode 100644
index 00000000..3a3edb94
--- /dev/null
+++ b/2024-05/spring-23/3.x-style/src/main/java/ru/otus/spring/Main.java
@@ -0,0 +1,13 @@
+package ru.otus.spring;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class Main {
+
+ public static void main( String[] args ) {
+ SpringApplication.run( Main.class );
+ // http://localhost:8080/
+ }
+}
diff --git a/2024-05/spring-23/3.x-style/src/main/java/ru/otus/spring/rest/PagesController.java b/2024-05/spring-23/3.x-style/src/main/java/ru/otus/spring/rest/PagesController.java
new file mode 100644
index 00000000..47321812
--- /dev/null
+++ b/2024-05/spring-23/3.x-style/src/main/java/ru/otus/spring/rest/PagesController.java
@@ -0,0 +1,28 @@
+package ru.otus.spring.rest;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+
+@Controller
+public class PagesController {
+
+ @GetMapping("/")
+ public String indexPage() {
+ return "index";
+ }
+
+ @GetMapping("/public")
+ public String publicPage() {
+ return "public";
+ }
+
+ @GetMapping("/authenticated")
+ public String authenticatedPage() {
+ return "authenticated";
+ }
+
+ @GetMapping("/success")
+ public String successPage() {
+ return "success";
+ }
+}
diff --git a/2024-05/spring-23/3.x-style/src/main/java/ru/otus/spring/security/SecurityConfiguration.java b/2024-05/spring-23/3.x-style/src/main/java/ru/otus/spring/security/SecurityConfiguration.java
new file mode 100644
index 00000000..86c8904f
--- /dev/null
+++ b/2024-05/spring-23/3.x-style/src/main/java/ru/otus/spring/security/SecurityConfiguration.java
@@ -0,0 +1,52 @@
+package ru.otus.spring.security;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.config.Customizer;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
+import org.springframework.security.core.userdetails.User;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+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;
+
+@Configuration
+@EnableWebSecurity
+public class SecurityConfiguration {
+
+ @Bean
+ public SecurityFilterChain securityFilterChain( HttpSecurity http ) throws Exception {
+ http
+ .csrf(AbstractHttpConfigurer::disable)
+ .authorizeHttpRequests( ( authorize ) -> authorize
+ .requestMatchers( "/public" ).permitAll()
+ .requestMatchers( "/authenticated" ).authenticated()
+ .anyRequest().permitAll()
+ )
+ .httpBasic(Customizer.withDefaults());
+ return http.build();
+ }
+
+
+ @Bean
+ public PasswordEncoder passwordEncoder() {
+ return new BCryptPasswordEncoder(10);
+ // return NoOpPasswordEncoder.getInstance();
+
+ }
+
+ @Bean
+ public InMemoryUserDetailsManager userDetailsService() {
+ UserDetails user = User
+ .builder()
+ .username( "user" )
+ .password( "password" )
+ .roles( "USER" )
+ .build();
+ return new InMemoryUserDetailsManager( user );
+ }
+}
diff --git a/2024-05/spring-23/3.x-style/src/main/resources/application.yml b/2024-05/spring-23/3.x-style/src/main/resources/application.yml
new file mode 100644
index 00000000..e69de29b
diff --git a/2024-05/spring-23/3.x-style/src/main/resources/templates/authenticated.html b/2024-05/spring-23/3.x-style/src/main/resources/templates/authenticated.html
new file mode 100644
index 00000000..9f8b0d7e
--- /dev/null
+++ b/2024-05/spring-23/3.x-style/src/main/resources/templates/authenticated.html
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+Только для авторизованных
+
+
diff --git a/2024-05/spring-23/3.x-style/src/main/resources/templates/index.html b/2024-05/spring-23/3.x-style/src/main/resources/templates/index.html
new file mode 100644
index 00000000..f4d11090
--- /dev/null
+++ b/2024-05/spring-23/3.x-style/src/main/resources/templates/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+/public
+
+/authenticated
+
+
diff --git a/2024-05/spring-23/3.x-style/src/main/resources/templates/public.html b/2024-05/spring-23/3.x-style/src/main/resources/templates/public.html
new file mode 100644
index 00000000..77188469
--- /dev/null
+++ b/2024-05/spring-23/3.x-style/src/main/resources/templates/public.html
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+Доступен всем
+
+
diff --git a/2024-05/spring-23/3.x-style/src/main/resources/templates/success.html b/2024-05/spring-23/3.x-style/src/main/resources/templates/success.html
new file mode 100644
index 00000000..89db5f22
--- /dev/null
+++ b/2024-05/spring-23/3.x-style/src/main/resources/templates/success.html
@@ -0,0 +1,10 @@
+
+
+
+
+ Вы успешно вошли
+
+
+Вы успешно вошли
+
+
diff --git a/2024-05/spring-23/old-style/pom.xml b/2024-05/spring-23/old-style/pom.xml
new file mode 100644
index 00000000..d0b19bbc
--- /dev/null
+++ b/2024-05/spring-23/old-style/pom.xml
@@ -0,0 +1,53 @@
+
+
+ 4.0.0
+
+ ru.otus
+ spring-framework-23-spring-security-3x-start
+ 1.0-SNAPSHOT
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.7.8
+
+
+
+ 17
+ 17
+ 17
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ org.springframework.boot
+ spring-boot-starter-thymeleaf
+
+
+
+ org.springframework.boot
+ spring-boot-starter-security
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
diff --git a/2024-05/spring-23/old-style/src/main/java/ru/otus/spring/Main.java b/2024-05/spring-23/old-style/src/main/java/ru/otus/spring/Main.java
new file mode 100644
index 00000000..95fa70ed
--- /dev/null
+++ b/2024-05/spring-23/old-style/src/main/java/ru/otus/spring/Main.java
@@ -0,0 +1,12 @@
+package ru.otus.spring;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class Main {
+
+ public static void main( String[] args ) {
+ SpringApplication.run( Main.class );
+ }
+}
diff --git a/2024-05/spring-23/old-style/src/main/java/ru/otus/spring/rest/PagesController.java b/2024-05/spring-23/old-style/src/main/java/ru/otus/spring/rest/PagesController.java
new file mode 100644
index 00000000..47321812
--- /dev/null
+++ b/2024-05/spring-23/old-style/src/main/java/ru/otus/spring/rest/PagesController.java
@@ -0,0 +1,28 @@
+package ru.otus.spring.rest;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+
+@Controller
+public class PagesController {
+
+ @GetMapping("/")
+ public String indexPage() {
+ return "index";
+ }
+
+ @GetMapping("/public")
+ public String publicPage() {
+ return "public";
+ }
+
+ @GetMapping("/authenticated")
+ public String authenticatedPage() {
+ return "authenticated";
+ }
+
+ @GetMapping("/success")
+ public String successPage() {
+ return "success";
+ }
+}
diff --git a/2024-05/spring-23/old-style/src/main/java/ru/otus/spring/security/SecurityConfiguration.java b/2024-05/spring-23/old-style/src/main/java/ru/otus/spring/security/SecurityConfiguration.java
new file mode 100644
index 00000000..89ef82be
--- /dev/null
+++ b/2024-05/spring-23/old-style/src/main/java/ru/otus/spring/security/SecurityConfiguration.java
@@ -0,0 +1,70 @@
+package ru.otus.spring.security;
+
+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.password.NoOpPasswordEncoder;
+import org.springframework.security.crypto.password.PasswordEncoder;
+
+@EnableWebSecurity
+public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
+
+ @Override
+ public void configure( WebSecurity web ) {
+ web.ignoring()
+ .antMatchers( "/" )
+ .antMatchers( "/static/**" ); // You are asking Spring Security to ignore Ant [pattern='/static/**']. This is not recommended -- please use permitAll via HttpSecurity#authorizeHttpRequests instead.
+ }
+
+ @Override
+ public void configure( HttpSecurity http ) throws Exception {
+ http.csrf().disable()
+ // По умолчанию SecurityContext хранится в сессии. Эта часть вырубает и каждый запросом приходитТ
+// .sessionManagement()
+// .sessionCreationPolicy(SessionCreationPolicy.ALWAYS)
+// .and()
+ .authorizeRequests()
+ .antMatchers( "/public/" ).anonymous()
+ .and()
+ .authorizeRequests()
+ .antMatchers( "/authenticated" ).authenticated()
+// .and()
+// .authorizeRequests().antMatchers("/public").authenticated()
+ .and()
+ .formLogin()
+ .and()
+ .anonymous()
+ .principal( "anonymous" )
+ .and()
+ .rememberMe().key( "Some secret" )
+ ;
+ }
+
+ @Bean
+ public PasswordEncoder passwordEncoder() {
+// return new BCryptPasswordEncoder(10);
+ return NoOpPasswordEncoder.getInstance();
+// return new PasswordEncoder() {
+// @Override
+// public String encode(CharSequence charSequence) {
+// return charSequence.toString();
+// }
+//
+// @Override
+// public boolean matches(CharSequence charSequence, String s) {
+// return charSequence.toString().equals(s);
+// }
+// };
+ }
+
+ @Autowired
+ public void configure( AuthenticationManagerBuilder auth ) throws Exception {
+ auth.inMemoryAuthentication()
+ .withUser( "admin" ).password( "password" ).roles( "ADMIN" )
+ ;
+ }
+}
diff --git a/2024-05/spring-23/old-style/src/main/resources/application.yml b/2024-05/spring-23/old-style/src/main/resources/application.yml
new file mode 100644
index 00000000..e69de29b
diff --git a/2024-05/spring-23/old-style/src/main/resources/templates/authenticated.html b/2024-05/spring-23/old-style/src/main/resources/templates/authenticated.html
new file mode 100644
index 00000000..9f8b0d7e
--- /dev/null
+++ b/2024-05/spring-23/old-style/src/main/resources/templates/authenticated.html
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+Только для авторизованных
+
+
diff --git a/2024-05/spring-23/old-style/src/main/resources/templates/index.html b/2024-05/spring-23/old-style/src/main/resources/templates/index.html
new file mode 100644
index 00000000..f4d11090
--- /dev/null
+++ b/2024-05/spring-23/old-style/src/main/resources/templates/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+/public
+
+/authenticated
+
+
diff --git a/2024-05/spring-23/old-style/src/main/resources/templates/public.html b/2024-05/spring-23/old-style/src/main/resources/templates/public.html
new file mode 100644
index 00000000..77188469
--- /dev/null
+++ b/2024-05/spring-23/old-style/src/main/resources/templates/public.html
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+Доступен всем
+
+
diff --git a/2024-05/spring-23/old-style/src/main/resources/templates/success.html b/2024-05/spring-23/old-style/src/main/resources/templates/success.html
new file mode 100644
index 00000000..89db5f22
--- /dev/null
+++ b/2024-05/spring-23/old-style/src/main/resources/templates/success.html
@@ -0,0 +1,10 @@
+
+
+
+
+ Вы успешно вошли
+
+
+Вы успешно вошли
+
+
diff --git a/2024-05/spring-24/pom.xml b/2024-05/spring-24/pom.xml
new file mode 100644
index 00000000..79e1b7c3
--- /dev/null
+++ b/2024-05/spring-24/pom.xml
@@ -0,0 +1,69 @@
+
+
+ 4.0.0
+
+ ru.otus
+ classwork
+ 1.0-SNAPSHOT
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 3.3.0
+
+
+
+ UTF-8
+ UTF-8
+ 17
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-thymeleaf
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-security
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+
+
+
+ org.springframework.security
+ spring-security-test
+ ${spring-security.version}
+
+
+
+ org.projectlombok
+ lombok
+ ${lombok.version}
+ provided
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
diff --git a/2024-05/spring-24/src/main/java/ru/otus/spring/Main.java b/2024-05/spring-24/src/main/java/ru/otus/spring/Main.java
new file mode 100644
index 00000000..e8fdc91d
--- /dev/null
+++ b/2024-05/spring-24/src/main/java/ru/otus/spring/Main.java
@@ -0,0 +1,13 @@
+package ru.otus.spring;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class Main {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Main.class);
+ // http://localhost:8080/
+ }
+}
diff --git a/2024-05/spring-24/src/main/java/ru/otus/spring/controller/PagesController.java b/2024-05/spring-24/src/main/java/ru/otus/spring/controller/PagesController.java
new file mode 100644
index 00000000..3137eb02
--- /dev/null
+++ b/2024-05/spring-24/src/main/java/ru/otus/spring/controller/PagesController.java
@@ -0,0 +1,55 @@
+package ru.otus.spring.controller;
+
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContext;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.security.core.userdetails.User;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import ru.otus.spring.security.AnonimusUD;
+
+@Controller
+public class PagesController {
+
+ @GetMapping("/")
+ public String indexPage() {
+ return "index";
+ }
+
+ @GetMapping("/public")
+ public String publicPage(/*@RequestParam(name = "SpecialValue") String specialValue, Model model*/) {
+// model.addAttribute("secret", specialValue);
+ SecurityContext securityContext = SecurityContextHolder.getContext();
+ Authentication authentication = securityContext.getAuthentication();
+ System.out.println(((AnonimusUD)authentication.getPrincipal()).getUsername());
+ return "public";
+ }
+
+ @GetMapping("/authenticated")
+ public String authenticatedPage(Model model) {
+ SecurityContext securityContext = SecurityContextHolder.getContext();
+ User user = (User) securityContext.getAuthentication().getPrincipal();
+ model.addAttribute("userName", user.getUsername());
+ return "authenticated";
+ }
+
+ @GetMapping("/success")
+ public String successPage() {
+ return "success";
+ }
+
+ @GetMapping("/error")
+ public String errorPage(Model model) {
+ model.addAttribute("source", "errorPage");
+ return "error";
+ }
+
+ @PostMapping("/fail")
+ public String failPage(Model model) {
+ model.addAttribute("source", "failPage");
+ return "error";
+ }
+}
diff --git a/2024-05/spring-24/src/main/java/ru/otus/spring/security/AnonimusUD.java b/2024-05/spring-24/src/main/java/ru/otus/spring/security/AnonimusUD.java
new file mode 100644
index 00000000..79871401
--- /dev/null
+++ b/2024-05/spring-24/src/main/java/ru/otus/spring/security/AnonimusUD.java
@@ -0,0 +1,45 @@
+package ru.otus.spring.security;
+
+import lombok.Data;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.userdetails.UserDetails;
+
+import java.util.Collection;
+
+@Data
+public class AnonimusUD implements UserDetails {
+ @Override
+ public Collection extends GrantedAuthority> getAuthorities() {
+ return null;
+ }
+
+ @Override
+ public String getPassword() {
+ return null;
+ }
+
+ @Override
+ public String getUsername() {
+ return "Oleg";
+ }
+
+ @Override
+ public boolean isAccountNonExpired() {
+ return true;
+ }
+
+ @Override
+ public boolean isAccountNonLocked() {
+ return true;
+ }
+
+ @Override
+ public boolean isCredentialsNonExpired() {
+ return true;
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return true;
+ }
+}
diff --git a/2024-05/spring-24/src/main/java/ru/otus/spring/security/SecurityConfiguration.java b/2024-05/spring-24/src/main/java/ru/otus/spring/security/SecurityConfiguration.java
new file mode 100644
index 00000000..51b5b5a2
--- /dev/null
+++ b/2024-05/spring-24/src/main/java/ru/otus/spring/security/SecurityConfiguration.java
@@ -0,0 +1,70 @@
+package ru.otus.spring.security;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.config.Customizer;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
+import org.springframework.security.config.http.SessionCreationPolicy;
+import org.springframework.security.core.userdetails.User;
+import org.springframework.security.core.userdetails.UserDetails;
+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.access.intercept.AuthorizationFilter;
+import ru.otus.spring.security.filter.MyOwnFilter;
+
+import java.util.ArrayList;
+
+@EnableWebSecurity
+@Configuration
+public class SecurityConfiguration {
+
+ @Bean
+ public SecurityFilterChain securityFilterChain(HttpSecurity http)
+ throws Exception {
+ http
+ .csrf(AbstractHttpConfigurer::disable)
+ .sessionManagement((session) -> session
+ .sessionCreationPolicy(SessionCreationPolicy.ALWAYS))
+ .authorizeHttpRequests((authorize) -> authorize
+ .requestMatchers("/").permitAll()
+ .requestMatchers("/public").permitAll()
+ .requestMatchers("/authenticated", "/success").authenticated()
+ .anyRequest().permitAll()
+ )
+// .anonymous(a -> a.principal(new AnonimusUD()).authorities("ROLE_ANONYMOUS"))
+// .addFilterAfter(new MyOwnFilter(), AuthorizationFilter.class)
+// .httpBasic(Customizer.withDefaults())
+ .formLogin(Customizer.withDefaults())
+/*
+ .formLogin(fm -> fm.defaultSuccessUrl("/success")
+ .failureForwardUrl("/fail")
+ )
+*/
+ .rememberMe(rm -> rm.key("AnyKey")
+ .tokenValiditySeconds(600))
+ ;
+ return http.build();
+ }
+
+ @SuppressWarnings("deprecation")
+ @Bean
+ public PasswordEncoder passwordEncoder() {
+ return NoOpPasswordEncoder.getInstance();
+ }
+
+ @Bean
+ public InMemoryUserDetailsManager userDetailsService() {
+ UserDetails user = User
+ .builder()
+ .username("user")
+ .password("password")
+ .roles("USER")
+ .build();
+ return new InMemoryUserDetailsManager(user);
+
+ }
+}
diff --git a/2024-05/spring-24/src/main/java/ru/otus/spring/security/filter/MyOwnFilter.java b/2024-05/spring-24/src/main/java/ru/otus/spring/security/filter/MyOwnFilter.java
new file mode 100644
index 00000000..2b81609f
--- /dev/null
+++ b/2024-05/spring-24/src/main/java/ru/otus/spring/security/filter/MyOwnFilter.java
@@ -0,0 +1,30 @@
+package ru.otus.spring.security.filter;
+
+import jakarta.servlet.FilterChain;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequestWrapper;
+import org.springframework.web.filter.GenericFilterBean;
+
+import java.io.IOException;
+
+public class MyOwnFilter extends GenericFilterBean {
+ @Override
+ public void doFilter(ServletRequest servletRequest,
+ ServletResponse servletResponse,
+ FilterChain filterChain) throws IOException, ServletException {
+ var requestWrapper = new HttpServletRequestWrapper((HttpServletRequest) servletRequest) {
+ @Override
+ public String[] getParameterValues(String name) {
+ if ("SpecialValue".equals(name)) {
+ return new String[]{"My dirty secret"};
+ }
+ return super.getParameterValues(name);
+ }
+ };
+
+ filterChain.doFilter(requestWrapper, servletResponse);
+ }
+}
diff --git a/2024-05/spring-24/src/main/resources/application.yml b/2024-05/spring-24/src/main/resources/application.yml
new file mode 100644
index 00000000..d07e4971
--- /dev/null
+++ b/2024-05/spring-24/src/main/resources/application.yml
@@ -0,0 +1,4 @@
+logging:
+ level:
+ root: error
+ org.springframework: info
\ No newline at end of file
diff --git a/2024-05/spring-24/src/main/resources/templates/authenticated.html b/2024-05/spring-24/src/main/resources/templates/authenticated.html
new file mode 100644
index 00000000..62f1eb0d
--- /dev/null
+++ b/2024-05/spring-24/src/main/resources/templates/authenticated.html
@@ -0,0 +1,10 @@
+
+
+
+
+ Только для авторизованных
+
+
+Только для авторизованных. Вы как раз такой)
+
+
diff --git a/2024-05/spring-24/src/main/resources/templates/error.html b/2024-05/spring-24/src/main/resources/templates/error.html
new file mode 100644
index 00000000..41a3f8e2
--- /dev/null
+++ b/2024-05/spring-24/src/main/resources/templates/error.html
@@ -0,0 +1,11 @@
+
+
+
+
+ Упс...
+
+
+Что-то пошло не так. Печалька
+Источник: Неизвестен
+
+
diff --git a/2024-05/spring-24/src/main/resources/templates/index.html b/2024-05/spring-24/src/main/resources/templates/index.html
new file mode 100644
index 00000000..f2d1d1ae
--- /dev/null
+++ b/2024-05/spring-24/src/main/resources/templates/index.html
@@ -0,0 +1,12 @@
+
+
+
+
+ Главная страница
+
+
+/public
+
+/authenticated
+
+
diff --git a/2024-05/spring-24/src/main/resources/templates/public.html b/2024-05/spring-24/src/main/resources/templates/public.html
new file mode 100644
index 00000000..58fca813
--- /dev/null
+++ b/2024-05/spring-24/src/main/resources/templates/public.html
@@ -0,0 +1,10 @@
+
+
+
+
+ Доступен всем
+
+
+Доступен всем, но есть секрет: Нет секрета
+
+
diff --git a/2024-05/spring-24/src/main/resources/templates/success.html b/2024-05/spring-24/src/main/resources/templates/success.html
new file mode 100644
index 00000000..58414c01
--- /dev/null
+++ b/2024-05/spring-24/src/main/resources/templates/success.html
@@ -0,0 +1,10 @@
+
+
+
+
+ Вы успешно вошли !
+
+
+Вы успешно вошли !
+
+
diff --git a/2024-05/spring-24/src/test/java/ru/otus/spring/controller/PagesControllerTest.java b/2024-05/spring-24/src/test/java/ru/otus/spring/controller/PagesControllerTest.java
new file mode 100644
index 00000000..62b6a274
--- /dev/null
+++ b/2024-05/spring-24/src/test/java/ru/otus/spring/controller/PagesControllerTest.java
@@ -0,0 +1,30 @@
+package ru.otus.spring.controller;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
+import org.springframework.context.annotation.Import;
+import org.springframework.security.test.context.support.WithMockUser;
+import org.springframework.test.web.servlet.MockMvc;
+import ru.otus.spring.security.SecurityConfiguration;
+
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+@WebMvcTest(PagesController.class)
+@Import(SecurityConfiguration.class)
+public class PagesControllerTest {
+
+ @Autowired
+ private MockMvc mockMvc;
+
+ @WithMockUser(
+ username = "admin",
+ authorities = {"ROLE_ADMIN"}
+ )
+ @Test
+ public void testAuthenticatedOnAdmin() throws Exception {
+ mockMvc.perform(get("/authenticated"))
+ .andExpect(status().isOk());
+ }
+}