diff --git a/2022-05/spring-25/.gitignore b/2022-05/spring-25/.gitignore
new file mode 100644
index 00000000..4ea52072
--- /dev/null
+++ b/2022-05/spring-25/.gitignore
@@ -0,0 +1,24 @@
+target/
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/build/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
diff --git a/2022-05/spring-25/classwork/pom.xml b/2022-05/spring-25/classwork/pom.xml
new file mode 100644
index 00000000..d6e02673
--- /dev/null
+++ b/2022-05/spring-25/classwork/pom.xml
@@ -0,0 +1,61 @@
+
+
+ 4.0.0
+
+ ru.otus
+ classwork
+ 1.0-SNAPSHOT
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.6.10
+
+
+
+ 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.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
diff --git a/2022-05/spring-25/src/main/java/ru/otus/spring/Main.java b/2022-05/spring-25/classwork/src/main/java/ru/otus/spring/Main.java
similarity index 100%
rename from 2022-05/spring-25/src/main/java/ru/otus/spring/Main.java
rename to 2022-05/spring-25/classwork/src/main/java/ru/otus/spring/Main.java
diff --git a/2022-05/spring-25/src/main/java/ru/otus/spring/rest/PagesController.java b/2022-05/spring-25/classwork/src/main/java/ru/otus/spring/controller/PagesController.java
similarity index 83%
rename from 2022-05/spring-25/src/main/java/ru/otus/spring/rest/PagesController.java
rename to 2022-05/spring-25/classwork/src/main/java/ru/otus/spring/controller/PagesController.java
index 1fa8da0c..293aa679 100644
--- a/2022-05/spring-25/src/main/java/ru/otus/spring/rest/PagesController.java
+++ b/2022-05/spring-25/classwork/src/main/java/ru/otus/spring/controller/PagesController.java
@@ -1,12 +1,9 @@
-package ru.otus.spring.rest;
+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.UserDetails;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
@Controller
public class PagesController {
diff --git a/2022-05/spring-25/src/main/java/ru/otus/spring/security/AnonimusUD.java b/2022-05/spring-25/classwork/src/main/java/ru/otus/spring/security/AnonimusUD.java
similarity index 100%
rename from 2022-05/spring-25/src/main/java/ru/otus/spring/security/AnonimusUD.java
rename to 2022-05/spring-25/classwork/src/main/java/ru/otus/spring/security/AnonimusUD.java
diff --git a/2022-05/spring-25/src/main/java/ru/otus/spring/security/SecurityConfiguration.java b/2022-05/spring-25/classwork/src/main/java/ru/otus/spring/security/SecurityConfiguration.java
similarity index 100%
rename from 2022-05/spring-25/src/main/java/ru/otus/spring/security/SecurityConfiguration.java
rename to 2022-05/spring-25/classwork/src/main/java/ru/otus/spring/security/SecurityConfiguration.java
diff --git a/2022-05/spring-25/src/main/java/ru/otus/spring/security/filter/MyOwnFilter.java b/2022-05/spring-25/classwork/src/main/java/ru/otus/spring/security/filter/MyOwnFilter.java
similarity index 100%
rename from 2022-05/spring-25/src/main/java/ru/otus/spring/security/filter/MyOwnFilter.java
rename to 2022-05/spring-25/classwork/src/main/java/ru/otus/spring/security/filter/MyOwnFilter.java
diff --git a/2022-05/spring-25/src/main/resources/application.yml b/2022-05/spring-25/classwork/src/main/resources/application.yml
similarity index 100%
rename from 2022-05/spring-25/src/main/resources/application.yml
rename to 2022-05/spring-25/classwork/src/main/resources/application.yml
diff --git a/2022-05/spring-25/src/main/resources/templates/authenticated.html b/2022-05/spring-25/classwork/src/main/resources/templates/authenticated.html
similarity index 100%
rename from 2022-05/spring-25/src/main/resources/templates/authenticated.html
rename to 2022-05/spring-25/classwork/src/main/resources/templates/authenticated.html
diff --git a/2022-05/spring-25/src/main/resources/templates/error.html b/2022-05/spring-25/classwork/src/main/resources/templates/error.html
similarity index 100%
rename from 2022-05/spring-25/src/main/resources/templates/error.html
rename to 2022-05/spring-25/classwork/src/main/resources/templates/error.html
diff --git a/2022-05/spring-25/src/main/resources/templates/index.html b/2022-05/spring-25/classwork/src/main/resources/templates/index.html
similarity index 100%
rename from 2022-05/spring-25/src/main/resources/templates/index.html
rename to 2022-05/spring-25/classwork/src/main/resources/templates/index.html
diff --git a/2022-05/spring-25/src/main/resources/templates/public.html b/2022-05/spring-25/classwork/src/main/resources/templates/public.html
similarity index 100%
rename from 2022-05/spring-25/src/main/resources/templates/public.html
rename to 2022-05/spring-25/classwork/src/main/resources/templates/public.html
diff --git a/2022-05/spring-25/src/main/resources/templates/success.html b/2022-05/spring-25/classwork/src/main/resources/templates/success.html
similarity index 100%
rename from 2022-05/spring-25/src/main/resources/templates/success.html
rename to 2022-05/spring-25/classwork/src/main/resources/templates/success.html
diff --git a/2022-05/spring-25/src/test/java/ru/otus/spring/rest/PagesControllerTest.java b/2022-05/spring-25/classwork/src/test/java/ru/otus/spring/controller/PagesControllerTest.java
similarity index 91%
rename from 2022-05/spring-25/src/test/java/ru/otus/spring/rest/PagesControllerTest.java
rename to 2022-05/spring-25/classwork/src/test/java/ru/otus/spring/controller/PagesControllerTest.java
index 3f84fa46..d6d1456c 100644
--- a/2022-05/spring-25/src/test/java/ru/otus/spring/rest/PagesControllerTest.java
+++ b/2022-05/spring-25/classwork/src/test/java/ru/otus/spring/controller/PagesControllerTest.java
@@ -1,4 +1,4 @@
-package ru.otus.spring.rest;
+package ru.otus.spring.controller;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@@ -7,7 +7,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.security.test.context.support.WithMockUser;
import org.springframework.test.context.junit.jupiter.SpringExtension;
-import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
diff --git a/2022-05/spring-25/pom.xml b/2022-05/spring-25/pom.xml
index 590e9bc8..552539aa 100644
--- a/2022-05/spring-25/pom.xml
+++ b/2022-05/spring-25/pom.xml
@@ -5,57 +5,16 @@
4.0.0
ru.otus
- spring-framework-23-auth
- 1.0-SNAPSHOT
+ spring-security-classwork
+ 1.0
-
- org.springframework.boot
- spring-boot-starter-parent
- 2.6.10
-
+ pom
-
- 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.springframework.boot
- spring-boot-maven-plugin
-
-
-
+
+ classwork
+ solution1
+ solution2
+ solution3
+ solution4
+
diff --git a/2022-05/spring-25/solution1/pom.xml b/2022-05/spring-25/solution1/pom.xml
new file mode 100644
index 00000000..76c1f7b2
--- /dev/null
+++ b/2022-05/spring-25/solution1/pom.xml
@@ -0,0 +1,61 @@
+
+
+ 4.0.0
+
+ ru.otus
+ solution1
+ 1.0-SNAPSHOT
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.6.10
+
+
+
+ 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.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
diff --git a/2022-05/spring-25/solution1/src/main/java/ru/otus/spring/Main.java b/2022-05/spring-25/solution1/src/main/java/ru/otus/spring/Main.java
new file mode 100644
index 00000000..5406a277
--- /dev/null
+++ b/2022-05/spring-25/solution1/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/2022-05/spring-25/solution1/src/main/java/ru/otus/spring/controller/PagesController.java b/2022-05/spring-25/solution1/src/main/java/ru/otus/spring/controller/PagesController.java
new file mode 100644
index 00000000..fbb05072
--- /dev/null
+++ b/2022-05/spring-25/solution1/src/main/java/ru/otus/spring/controller/PagesController.java
@@ -0,0 +1,34 @@
+package ru.otus.spring.controller;
+
+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";
+ }
+
+
+ @GetMapping("/error")
+ public String errorPage() {
+ return "error";
+ }
+}
diff --git a/2022-05/spring-25/solution1/src/main/java/ru/otus/spring/security/SecurityConfiguration.java b/2022-05/spring-25/solution1/src/main/java/ru/otus/spring/security/SecurityConfiguration.java
new file mode 100644
index 00000000..adfe6484
--- /dev/null
+++ b/2022-05/spring-25/solution1/src/main/java/ru/otus/spring/security/SecurityConfiguration.java
@@ -0,0 +1,46 @@
+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( "/" );
+ }
+
+ @Override
+ public void configure( HttpSecurity http ) throws Exception {
+ http.csrf().disable()
+ .authorizeRequests().antMatchers( "/public" ).permitAll()
+ .and()
+ .authorizeRequests().antMatchers( "/authenticated", "/success" ).authenticated()
+ .and()
+
+ .formLogin()
+ .defaultSuccessUrl("/success")
+ .failureForwardUrl("/error")
+ ;
+ }
+
+ @SuppressWarnings("deprecation")
+ @Bean
+ public PasswordEncoder passwordEncoder() {
+ return NoOpPasswordEncoder.getInstance();
+ }
+
+ @Autowired
+ public void configure( AuthenticationManagerBuilder auth ) throws Exception {
+ auth.inMemoryAuthentication()
+ .withUser( "admin" ).password( "password" ).roles( "ADMIN" );
+ }
+}
diff --git a/2022-05/spring-25/solution1/src/main/resources/application.yml b/2022-05/spring-25/solution1/src/main/resources/application.yml
new file mode 100644
index 00000000..0151c503
--- /dev/null
+++ b/2022-05/spring-25/solution1/src/main/resources/application.yml
@@ -0,0 +1,4 @@
+logging:
+ level:
+ root: error
+ org.springframework: error
\ No newline at end of file
diff --git a/2022-05/spring-25/solution1/src/main/resources/templates/authenticated.html b/2022-05/spring-25/solution1/src/main/resources/templates/authenticated.html
new file mode 100644
index 00000000..0d2043f0
--- /dev/null
+++ b/2022-05/spring-25/solution1/src/main/resources/templates/authenticated.html
@@ -0,0 +1,10 @@
+
+
+
+
+ Только для авторизованных
+
+
+Только для авторизованных
+
+
diff --git a/2022-05/spring-25/solution1/src/main/resources/templates/error.html b/2022-05/spring-25/solution1/src/main/resources/templates/error.html
new file mode 100644
index 00000000..ba4e50a2
--- /dev/null
+++ b/2022-05/spring-25/solution1/src/main/resources/templates/error.html
@@ -0,0 +1,10 @@
+
+
+
+
+ Упс...
+
+
+Что-то пошло не так. Печалька
+
+
diff --git a/2022-05/spring-25/solution1/src/main/resources/templates/index.html b/2022-05/spring-25/solution1/src/main/resources/templates/index.html
new file mode 100644
index 00000000..f2d1d1ae
--- /dev/null
+++ b/2022-05/spring-25/solution1/src/main/resources/templates/index.html
@@ -0,0 +1,12 @@
+
+
+
+
+ Главная страница
+
+
+/public
+
+/authenticated
+
+
diff --git a/2022-05/spring-25/solution1/src/main/resources/templates/public.html b/2022-05/spring-25/solution1/src/main/resources/templates/public.html
new file mode 100644
index 00000000..b9f93817
--- /dev/null
+++ b/2022-05/spring-25/solution1/src/main/resources/templates/public.html
@@ -0,0 +1,10 @@
+
+
+
+
+ Доступен всем
+
+
+Доступен всем
+
+
diff --git a/2022-05/spring-25/solution1/src/main/resources/templates/success.html b/2022-05/spring-25/solution1/src/main/resources/templates/success.html
new file mode 100644
index 00000000..58414c01
--- /dev/null
+++ b/2022-05/spring-25/solution1/src/main/resources/templates/success.html
@@ -0,0 +1,10 @@
+
+
+
+
+ Вы успешно вошли !
+
+
+Вы успешно вошли !
+
+
diff --git a/2022-05/spring-25/solution2/pom.xml b/2022-05/spring-25/solution2/pom.xml
new file mode 100644
index 00000000..fe4aa6b2
--- /dev/null
+++ b/2022-05/spring-25/solution2/pom.xml
@@ -0,0 +1,61 @@
+
+
+ 4.0.0
+
+ ru.otus
+ solution2
+ 1.0-SNAPSHOT
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.6.10
+
+
+
+ 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.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
diff --git a/2022-05/spring-25/solution2/src/main/java/ru/otus/spring/Main.java b/2022-05/spring-25/solution2/src/main/java/ru/otus/spring/Main.java
new file mode 100644
index 00000000..5406a277
--- /dev/null
+++ b/2022-05/spring-25/solution2/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/2022-05/spring-25/solution2/src/main/java/ru/otus/spring/controller/PagesController.java b/2022-05/spring-25/solution2/src/main/java/ru/otus/spring/controller/PagesController.java
new file mode 100644
index 00000000..fbb05072
--- /dev/null
+++ b/2022-05/spring-25/solution2/src/main/java/ru/otus/spring/controller/PagesController.java
@@ -0,0 +1,34 @@
+package ru.otus.spring.controller;
+
+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";
+ }
+
+
+ @GetMapping("/error")
+ public String errorPage() {
+ return "error";
+ }
+}
diff --git a/2022-05/spring-25/solution2/src/main/java/ru/otus/spring/security/SecurityConfiguration.java b/2022-05/spring-25/solution2/src/main/java/ru/otus/spring/security/SecurityConfiguration.java
new file mode 100644
index 00000000..56a18ac9
--- /dev/null
+++ b/2022-05/spring-25/solution2/src/main/java/ru/otus/spring/security/SecurityConfiguration.java
@@ -0,0 +1,45 @@
+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( "/" );
+ }
+
+ @Override
+ public void configure( HttpSecurity http ) throws Exception {
+ http.csrf().disable()
+ .authorizeRequests().antMatchers( "/public" ).permitAll()
+ .and()
+ .authorizeRequests().antMatchers( "/authenticated", "/success" ).authenticated()
+
+ .and()
+ .httpBasic()
+ .realmName("AnyRealm")
+ ;
+ }
+
+ @SuppressWarnings("deprecation")
+ @Bean
+ public PasswordEncoder passwordEncoder() {
+ return NoOpPasswordEncoder.getInstance();
+ }
+
+ @Autowired
+ public void configure( AuthenticationManagerBuilder auth ) throws Exception {
+ auth.inMemoryAuthentication()
+ .withUser( "admin" ).password( "password" ).roles( "ADMIN" );
+ }
+}
diff --git a/2022-05/spring-25/solution2/src/main/resources/application.yml b/2022-05/spring-25/solution2/src/main/resources/application.yml
new file mode 100644
index 00000000..0151c503
--- /dev/null
+++ b/2022-05/spring-25/solution2/src/main/resources/application.yml
@@ -0,0 +1,4 @@
+logging:
+ level:
+ root: error
+ org.springframework: error
\ No newline at end of file
diff --git a/2022-05/spring-25/solution2/src/main/resources/templates/authenticated.html b/2022-05/spring-25/solution2/src/main/resources/templates/authenticated.html
new file mode 100644
index 00000000..0d2043f0
--- /dev/null
+++ b/2022-05/spring-25/solution2/src/main/resources/templates/authenticated.html
@@ -0,0 +1,10 @@
+
+
+
+
+ Только для авторизованных
+
+
+Только для авторизованных
+
+
diff --git a/2022-05/spring-25/solution2/src/main/resources/templates/error.html b/2022-05/spring-25/solution2/src/main/resources/templates/error.html
new file mode 100644
index 00000000..ba4e50a2
--- /dev/null
+++ b/2022-05/spring-25/solution2/src/main/resources/templates/error.html
@@ -0,0 +1,10 @@
+
+
+
+
+ Упс...
+
+
+Что-то пошло не так. Печалька
+
+
diff --git a/2022-05/spring-25/solution2/src/main/resources/templates/index.html b/2022-05/spring-25/solution2/src/main/resources/templates/index.html
new file mode 100644
index 00000000..f2d1d1ae
--- /dev/null
+++ b/2022-05/spring-25/solution2/src/main/resources/templates/index.html
@@ -0,0 +1,12 @@
+
+
+
+
+ Главная страница
+
+
+/public
+
+/authenticated
+
+
diff --git a/2022-05/spring-25/solution2/src/main/resources/templates/public.html b/2022-05/spring-25/solution2/src/main/resources/templates/public.html
new file mode 100644
index 00000000..b9f93817
--- /dev/null
+++ b/2022-05/spring-25/solution2/src/main/resources/templates/public.html
@@ -0,0 +1,10 @@
+
+
+
+
+ Доступен всем
+
+
+Доступен всем
+
+
diff --git a/2022-05/spring-25/solution2/src/main/resources/templates/success.html b/2022-05/spring-25/solution2/src/main/resources/templates/success.html
new file mode 100644
index 00000000..58414c01
--- /dev/null
+++ b/2022-05/spring-25/solution2/src/main/resources/templates/success.html
@@ -0,0 +1,10 @@
+
+
+
+
+ Вы успешно вошли !
+
+
+Вы успешно вошли !
+
+
diff --git a/2022-05/spring-25/solution3/pom.xml b/2022-05/spring-25/solution3/pom.xml
new file mode 100644
index 00000000..1972999d
--- /dev/null
+++ b/2022-05/spring-25/solution3/pom.xml
@@ -0,0 +1,61 @@
+
+
+ 4.0.0
+
+ ru.otus
+ solution3
+ 1.0-SNAPSHOT
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.6.10
+
+
+
+ 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.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
diff --git a/2022-05/spring-25/solution3/src/main/java/ru/otus/spring/Main.java b/2022-05/spring-25/solution3/src/main/java/ru/otus/spring/Main.java
new file mode 100644
index 00000000..5406a277
--- /dev/null
+++ b/2022-05/spring-25/solution3/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/2022-05/spring-25/solution3/src/main/java/ru/otus/spring/controller/PagesController.java b/2022-05/spring-25/solution3/src/main/java/ru/otus/spring/controller/PagesController.java
new file mode 100644
index 00000000..5d40adf9
--- /dev/null
+++ b/2022-05/spring-25/solution3/src/main/java/ru/otus/spring/controller/PagesController.java
@@ -0,0 +1,43 @@
+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.UserDetails;
+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() {
+ SecurityContext securityContext = SecurityContextHolder.getContext();
+ Authentication authentication = securityContext.getAuthentication();
+ UserDetails principal = (UserDetails) authentication.getPrincipal();
+ System.out.println(principal.getUsername());
+ return "public";
+ }
+
+ @GetMapping("/authenticated")
+ public String authenticatedPage() {
+ SecurityContext securityContext = SecurityContextHolder.getContext();
+ return "authenticated";
+ }
+
+ @GetMapping("/success")
+ public String successPage() {
+ return "success";
+ }
+
+
+ @GetMapping("/error")
+ public String errorPage() {
+ return "error";
+ }
+}
diff --git a/2022-05/spring-25/solution3/src/main/java/ru/otus/spring/security/AnonimusUD.java b/2022-05/spring-25/solution3/src/main/java/ru/otus/spring/security/AnonimusUD.java
new file mode 100644
index 00000000..b7a31238
--- /dev/null
+++ b/2022-05/spring-25/solution3/src/main/java/ru/otus/spring/security/AnonimusUD.java
@@ -0,0 +1,43 @@
+package ru.otus.spring.security;
+
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.userdetails.UserDetails;
+
+import java.util.Collection;
+
+public class AnonimusUD implements UserDetails {
+ @Override
+ public Collection extends GrantedAuthority> getAuthorities() {
+ return null;
+ }
+
+ @Override
+ public String getPassword() {
+ return null;
+ }
+
+ @Override
+ public String getUsername() {
+ return "anonymous";
+ }
+
+ @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/2022-05/spring-25/solution3/src/main/java/ru/otus/spring/security/SecurityConfiguration.java b/2022-05/spring-25/solution3/src/main/java/ru/otus/spring/security/SecurityConfiguration.java
new file mode 100644
index 00000000..6a8bce49
--- /dev/null
+++ b/2022-05/spring-25/solution3/src/main/java/ru/otus/spring/security/SecurityConfiguration.java
@@ -0,0 +1,49 @@
+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.config.http.SessionCreationPolicy;
+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( "/" );
+ }
+
+ @Override
+ public void configure( HttpSecurity http ) throws Exception {
+ http.csrf().disable()
+ .authorizeRequests().antMatchers( "/public" ).anonymous()
+ .and()
+ .authorizeRequests().antMatchers( "/authenticated", "/success" ).authenticated()
+
+ .and()
+ // Включает Form-based аутентификацию
+ .formLogin()
+ .and()
+ .anonymous()
+ .principal(new AnonimusUD())
+ ;
+ }
+
+ @SuppressWarnings("deprecation")
+ @Bean
+ public PasswordEncoder passwordEncoder() {
+ return NoOpPasswordEncoder.getInstance();
+ }
+
+ @Autowired
+ public void configure( AuthenticationManagerBuilder auth ) throws Exception {
+ auth.inMemoryAuthentication()
+ .withUser( "admin" ).password( "password" ).roles( "ADMIN" );
+ }
+}
diff --git a/2022-05/spring-25/solution3/src/main/resources/application.yml b/2022-05/spring-25/solution3/src/main/resources/application.yml
new file mode 100644
index 00000000..0151c503
--- /dev/null
+++ b/2022-05/spring-25/solution3/src/main/resources/application.yml
@@ -0,0 +1,4 @@
+logging:
+ level:
+ root: error
+ org.springframework: error
\ No newline at end of file
diff --git a/2022-05/spring-25/solution3/src/main/resources/templates/authenticated.html b/2022-05/spring-25/solution3/src/main/resources/templates/authenticated.html
new file mode 100644
index 00000000..0d2043f0
--- /dev/null
+++ b/2022-05/spring-25/solution3/src/main/resources/templates/authenticated.html
@@ -0,0 +1,10 @@
+
+
+
+
+ Только для авторизованных
+
+
+Только для авторизованных
+
+
diff --git a/2022-05/spring-25/solution3/src/main/resources/templates/error.html b/2022-05/spring-25/solution3/src/main/resources/templates/error.html
new file mode 100644
index 00000000..ba4e50a2
--- /dev/null
+++ b/2022-05/spring-25/solution3/src/main/resources/templates/error.html
@@ -0,0 +1,10 @@
+
+
+
+
+ Упс...
+
+
+Что-то пошло не так. Печалька
+
+
diff --git a/2022-05/spring-25/solution3/src/main/resources/templates/index.html b/2022-05/spring-25/solution3/src/main/resources/templates/index.html
new file mode 100644
index 00000000..f2d1d1ae
--- /dev/null
+++ b/2022-05/spring-25/solution3/src/main/resources/templates/index.html
@@ -0,0 +1,12 @@
+
+
+
+
+ Главная страница
+
+
+/public
+
+/authenticated
+
+
diff --git a/2022-05/spring-25/solution3/src/main/resources/templates/public.html b/2022-05/spring-25/solution3/src/main/resources/templates/public.html
new file mode 100644
index 00000000..b9f93817
--- /dev/null
+++ b/2022-05/spring-25/solution3/src/main/resources/templates/public.html
@@ -0,0 +1,10 @@
+
+
+
+
+ Доступен всем
+
+
+Доступен всем
+
+
diff --git a/2022-05/spring-25/solution3/src/main/resources/templates/success.html b/2022-05/spring-25/solution3/src/main/resources/templates/success.html
new file mode 100644
index 00000000..58414c01
--- /dev/null
+++ b/2022-05/spring-25/solution3/src/main/resources/templates/success.html
@@ -0,0 +1,10 @@
+
+
+
+
+ Вы успешно вошли !
+
+
+Вы успешно вошли !
+
+
diff --git a/2022-05/spring-25/solution4/pom.xml b/2022-05/spring-25/solution4/pom.xml
new file mode 100644
index 00000000..dfac5e39
--- /dev/null
+++ b/2022-05/spring-25/solution4/pom.xml
@@ -0,0 +1,61 @@
+
+
+ 4.0.0
+
+ ru.otus
+ solution4
+ 1.0-SNAPSHOT
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.6.10
+
+
+
+ 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.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
diff --git a/2022-05/spring-25/solution4/src/main/java/ru/otus/spring/Main.java b/2022-05/spring-25/solution4/src/main/java/ru/otus/spring/Main.java
new file mode 100644
index 00000000..5406a277
--- /dev/null
+++ b/2022-05/spring-25/solution4/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/2022-05/spring-25/solution4/src/main/java/ru/otus/spring/controller/PagesController.java b/2022-05/spring-25/solution4/src/main/java/ru/otus/spring/controller/PagesController.java
new file mode 100644
index 00000000..5d40adf9
--- /dev/null
+++ b/2022-05/spring-25/solution4/src/main/java/ru/otus/spring/controller/PagesController.java
@@ -0,0 +1,43 @@
+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.UserDetails;
+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() {
+ SecurityContext securityContext = SecurityContextHolder.getContext();
+ Authentication authentication = securityContext.getAuthentication();
+ UserDetails principal = (UserDetails) authentication.getPrincipal();
+ System.out.println(principal.getUsername());
+ return "public";
+ }
+
+ @GetMapping("/authenticated")
+ public String authenticatedPage() {
+ SecurityContext securityContext = SecurityContextHolder.getContext();
+ return "authenticated";
+ }
+
+ @GetMapping("/success")
+ public String successPage() {
+ return "success";
+ }
+
+
+ @GetMapping("/error")
+ public String errorPage() {
+ return "error";
+ }
+}
diff --git a/2022-05/spring-25/solution4/src/main/java/ru/otus/spring/security/AnonimusUD.java b/2022-05/spring-25/solution4/src/main/java/ru/otus/spring/security/AnonimusUD.java
new file mode 100644
index 00000000..b7a31238
--- /dev/null
+++ b/2022-05/spring-25/solution4/src/main/java/ru/otus/spring/security/AnonimusUD.java
@@ -0,0 +1,43 @@
+package ru.otus.spring.security;
+
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.userdetails.UserDetails;
+
+import java.util.Collection;
+
+public class AnonimusUD implements UserDetails {
+ @Override
+ public Collection extends GrantedAuthority> getAuthorities() {
+ return null;
+ }
+
+ @Override
+ public String getPassword() {
+ return null;
+ }
+
+ @Override
+ public String getUsername() {
+ return "anonymous";
+ }
+
+ @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/2022-05/spring-25/solution4/src/main/java/ru/otus/spring/security/SecurityConfiguration.java b/2022-05/spring-25/solution4/src/main/java/ru/otus/spring/security/SecurityConfiguration.java
new file mode 100644
index 00000000..20b3aa6d
--- /dev/null
+++ b/2022-05/spring-25/solution4/src/main/java/ru/otus/spring/security/SecurityConfiguration.java
@@ -0,0 +1,51 @@
+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.config.http.SessionCreationPolicy;
+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( "/" );
+ }
+
+ @Override
+ public void configure( HttpSecurity http ) throws Exception {
+ http.csrf().disable()
+ .sessionManagement().sessionCreationPolicy( SessionCreationPolicy.STATELESS )
+ .and()
+ .authorizeRequests().antMatchers( "/public" ).anonymous()
+ .and()
+ .authorizeRequests().antMatchers( "/authenticated", "/success" ).authenticated()
+
+ .and()
+ .formLogin()
+ .and()
+ .anonymous().principal(new AnonimusUD())
+ .and()
+ .rememberMe().key("AnySecret").tokenValiditySeconds(60 * 30)
+ ;
+ }
+
+ @SuppressWarnings("deprecation")
+ @Bean
+ public PasswordEncoder passwordEncoder() {
+ return NoOpPasswordEncoder.getInstance();
+ }
+
+ @Autowired
+ public void configure( AuthenticationManagerBuilder auth ) throws Exception {
+ auth.inMemoryAuthentication()
+ .withUser( "admin" ).password( "password" ).roles( "ADMIN" );
+ }
+}
diff --git a/2022-05/spring-25/solution4/src/main/resources/application.yml b/2022-05/spring-25/solution4/src/main/resources/application.yml
new file mode 100644
index 00000000..0151c503
--- /dev/null
+++ b/2022-05/spring-25/solution4/src/main/resources/application.yml
@@ -0,0 +1,4 @@
+logging:
+ level:
+ root: error
+ org.springframework: error
\ No newline at end of file
diff --git a/2022-05/spring-25/solution4/src/main/resources/templates/authenticated.html b/2022-05/spring-25/solution4/src/main/resources/templates/authenticated.html
new file mode 100644
index 00000000..0d2043f0
--- /dev/null
+++ b/2022-05/spring-25/solution4/src/main/resources/templates/authenticated.html
@@ -0,0 +1,10 @@
+
+
+
+
+ Только для авторизованных
+
+
+Только для авторизованных
+
+
diff --git a/2022-05/spring-25/solution4/src/main/resources/templates/error.html b/2022-05/spring-25/solution4/src/main/resources/templates/error.html
new file mode 100644
index 00000000..ba4e50a2
--- /dev/null
+++ b/2022-05/spring-25/solution4/src/main/resources/templates/error.html
@@ -0,0 +1,10 @@
+
+
+
+
+ Упс...
+
+
+Что-то пошло не так. Печалька
+
+
diff --git a/2022-05/spring-25/solution4/src/main/resources/templates/index.html b/2022-05/spring-25/solution4/src/main/resources/templates/index.html
new file mode 100644
index 00000000..f2d1d1ae
--- /dev/null
+++ b/2022-05/spring-25/solution4/src/main/resources/templates/index.html
@@ -0,0 +1,12 @@
+
+
+
+
+ Главная страница
+
+
+/public
+
+/authenticated
+
+
diff --git a/2022-05/spring-25/solution4/src/main/resources/templates/public.html b/2022-05/spring-25/solution4/src/main/resources/templates/public.html
new file mode 100644
index 00000000..b9f93817
--- /dev/null
+++ b/2022-05/spring-25/solution4/src/main/resources/templates/public.html
@@ -0,0 +1,10 @@
+
+
+
+
+ Доступен всем
+
+
+Доступен всем
+
+
diff --git a/2022-05/spring-25/solution4/src/main/resources/templates/success.html b/2022-05/spring-25/solution4/src/main/resources/templates/success.html
new file mode 100644
index 00000000..58414c01
--- /dev/null
+++ b/2022-05/spring-25/solution4/src/main/resources/templates/success.html
@@ -0,0 +1,10 @@
+
+
+
+
+ Вы успешно вошли !
+
+
+Вы успешно вошли !
+
+