diff --git a/2020-08/spring-27/spring-27-exercise/src/test/java/ru/otus/spring/integration/MyMessageBuilder.java b/2020-08/spring-27/spring-27-exercise/src/test/java/ru/otus/spring/integration/MyMessageBuilder.java
new file mode 100644
index 00000000..55ce263b
--- /dev/null
+++ b/2020-08/spring-27/spring-27-exercise/src/test/java/ru/otus/spring/integration/MyMessageBuilder.java
@@ -0,0 +1,8 @@
+package ru.otus.spring.integration;
+
+import org.springframework.messaging.support.MessageBuilder;
+
+public class MyMessageBuilder {
+
+
+}
diff --git a/2020-11/spring-01/spring-01-solution/pom.xml b/2020-11/spring-01/spring-01-solution/pom.xml
index dcd7b0b1..a27f3bf5 100644
--- a/2020-11/spring-01/spring-01-solution/pom.xml
+++ b/2020-11/spring-01/spring-01-solution/pom.xml
@@ -11,7 +11,7 @@
11
11
- UTF-8
+ `UTF-8`
diff --git a/2020-11/spring-22/pom.xml b/2020-11/spring-22/pom.xml
new file mode 100644
index 00000000..69a0b0b4
--- /dev/null
+++ b/2020-11/spring-22/pom.xml
@@ -0,0 +1,53 @@
+
+
+ 4.0.0
+
+ ru.otus
+ spring-framework-22-spring-security-start
+ 1.0-SNAPSHOT
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.3.3.RELEASE
+
+
+
+ 11
+ 11
+ 11
+
+
+
+
+ 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/2020-11/spring-22/src/main/java/ru/otus/spring/Main.java b/2020-11/spring-22/src/main/java/ru/otus/spring/Main.java
new file mode 100644
index 00000000..5406a277
--- /dev/null
+++ b/2020-11/spring-22/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/2020-11/spring-22/src/main/java/ru/otus/spring/rest/PagesController.java b/2020-11/spring-22/src/main/java/ru/otus/spring/rest/PagesController.java
new file mode 100644
index 00000000..1bdf754e
--- /dev/null
+++ b/2020-11/spring-22/src/main/java/ru/otus/spring/rest/PagesController.java
@@ -0,0 +1,32 @@
+package ru.otus.spring.rest;
+
+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() {
+ return "public";
+ }
+
+ @GetMapping("/authenticated")
+ public String authenticatedPage() {
+ return "authenticated";
+ }
+
+ @GetMapping("/success")
+ public String successPage(){
+ return "success";
+ }
+}
diff --git a/2020-11/spring-22/src/main/java/ru/otus/spring/security/SecurityConfiguration.java b/2020-11/spring-22/src/main/java/ru/otus/spring/security/SecurityConfiguration.java
new file mode 100644
index 00000000..cd5b072b
--- /dev/null
+++ b/2020-11/spring-22/src/main/java/ru/otus/spring/security/SecurityConfiguration.java
@@ -0,0 +1,78 @@
+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.core.GrantedAuthority;
+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.password.NoOpPasswordEncoder;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.security.provisioning.InMemoryUserDetailsManager;
+
+import java.util.Collection;
+
+@EnableWebSecurity
+public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
+
+ @Override
+ public void configure(WebSecurity web) {
+ web.ignoring()
+ .antMatchers("/")
+ .antMatchers( "/static/**" );
+ }
+
+ @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()
+ .httpBasic()
+ .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/2020-11/spring-22/src/main/resources/application.yml b/2020-11/spring-22/src/main/resources/application.yml
new file mode 100644
index 00000000..e69de29b
diff --git a/2020-11/spring-22/src/main/resources/templates/authenticated.html b/2020-11/spring-22/src/main/resources/templates/authenticated.html
new file mode 100644
index 00000000..9f8b0d7e
--- /dev/null
+++ b/2020-11/spring-22/src/main/resources/templates/authenticated.html
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+Только для авторизованных
+
+
diff --git a/2020-11/spring-22/src/main/resources/templates/index.html b/2020-11/spring-22/src/main/resources/templates/index.html
new file mode 100644
index 00000000..f4d11090
--- /dev/null
+++ b/2020-11/spring-22/src/main/resources/templates/index.html
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+/public
+
+/authenticated
+
+
diff --git a/2020-11/spring-22/src/main/resources/templates/public.html b/2020-11/spring-22/src/main/resources/templates/public.html
new file mode 100644
index 00000000..77188469
--- /dev/null
+++ b/2020-11/spring-22/src/main/resources/templates/public.html
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+Доступен всем
+
+
diff --git a/2020-11/spring-22/src/main/resources/templates/success.html b/2020-11/spring-22/src/main/resources/templates/success.html
new file mode 100644
index 00000000..89db5f22
--- /dev/null
+++ b/2020-11/spring-22/src/main/resources/templates/success.html
@@ -0,0 +1,10 @@
+
+
+
+
+ Вы успешно вошли
+
+
+Вы успешно вошли
+
+