diff --git a/2019-11/spring-21-start-SS/src/main/java/ru/otus/spring/security/SecurityConfiguration.java b/2019-11/spring-21-start-SS/src/main/java/ru/otus/spring/security/SecurityConfiguration.java
index ba03694d..d0f072b6 100644
--- a/2019-11/spring-21-start-SS/src/main/java/ru/otus/spring/security/SecurityConfiguration.java
+++ b/2019-11/spring-21-start-SS/src/main/java/ru/otus/spring/security/SecurityConfiguration.java
@@ -21,7 +21,6 @@ import java.util.Collection;
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
-
@Override
public void configure(WebSecurity web) {
web.ignoring()
@@ -73,6 +72,7 @@ public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
- .withUser("admin").password("password").roles("ADMIN");
+ .withUser("admin").password("password").roles("ADMIN")
+ ;
}
}
diff --git a/2019-11/spring-22-SS-auth/pom.xml b/2019-11/spring-22-SS-auth/pom.xml
new file mode 100644
index 00000000..74b6e9db
--- /dev/null
+++ b/2019-11/spring-22-SS-auth/pom.xml
@@ -0,0 +1,61 @@
+
+
+ 4.0.0
+
+ ru.otus
+ spring-framework-20
+ 1.0-SNAPSHOT
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.1.3.RELEASE
+
+
+
+ UTF-8
+ UTF-8
+ 1.8
+
+
+
+
+
+ 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/2019-11/spring-22-SS-auth/src/main/java/ru/otus/spring/Main.java b/2019-11/spring-22-SS-auth/src/main/java/ru/otus/spring/Main.java
new file mode 100644
index 00000000..5406a277
--- /dev/null
+++ b/2019-11/spring-22-SS-auth/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/2019-11/spring-22-SS-auth/src/main/java/ru/otus/spring/rest/PagesController.java b/2019-11/spring-22-SS-auth/src/main/java/ru/otus/spring/rest/PagesController.java
new file mode 100644
index 00000000..18ded522
--- /dev/null
+++ b/2019-11/spring-22-SS-auth/src/main/java/ru/otus/spring/rest/PagesController.java
@@ -0,0 +1,44 @@
+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() {
+ SecurityContext securityContext = SecurityContextHolder.getContext();
+ Authentication authentication = securityContext.getAuthentication();
+ System.out.println(authentication.getPrincipal());
+ return "public";
+ }
+
+ @GetMapping("/authenticated")
+ public String authenticatedPage() {
+ SecurityContext securityContext = SecurityContextHolder.getContext();
+ Authentication authentication = securityContext.getAuthentication();
+ UserDetails userDetails = (UserDetails) authentication.getPrincipal();
+ System.out.println(userDetails.getUsername());
+ return "authenticated";
+ }
+
+ @GetMapping("/success")
+ public String successPage() {
+ return "success";
+ }
+
+ @GetMapping("/error")
+ public String errorPage() {
+ return "error";
+ }
+}
diff --git a/2019-11/spring-22-SS-auth/src/main/java/ru/otus/spring/security/SecurityConfiguration.java b/2019-11/spring-22-SS-auth/src/main/java/ru/otus/spring/security/SecurityConfiguration.java
new file mode 100644
index 00000000..58d2bea6
--- /dev/null
+++ b/2019-11/spring-22-SS-auth/src/main/java/ru/otus/spring/security/SecurityConfiguration.java
@@ -0,0 +1,62 @@
+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;
+import org.springframework.security.web.session.ConcurrentSessionFilter;
+import ru.otus.spring.security.filter.MyOwnFilter;
+
+@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()
+ // По умолчанию SecurityContext хранится в сессии
+ // Это необходимо, чтобы он нигде не хранился
+ // и данные приходили каждый раз с запросом
+ .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
+ .and()
+ .authorizeRequests().antMatchers("/public").anonymous()
+ .and()
+ .authorizeRequests().antMatchers("/authenticated", "/success").authenticated()
+ .and().anonymous().authorities("ROLE_ANONYMOUS").principal("ya")
+ .and()
+ // Включает Form-based аутентификацию
+//
+ .formLogin()
+
+ .and().rememberMe()
+
+ ;
+ http.rememberMe()
+ .key("MyDirtySecret")
+ .tokenValiditySeconds(50000)
+ ;
+ }
+
+ @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/2019-11/spring-22-SS-auth/src/main/java/ru/otus/spring/security/filter/MyOwnFilter.java b/2019-11/spring-22-SS-auth/src/main/java/ru/otus/spring/security/filter/MyOwnFilter.java
new file mode 100644
index 00000000..46334d8c
--- /dev/null
+++ b/2019-11/spring-22-SS-auth/src/main/java/ru/otus/spring/security/filter/MyOwnFilter.java
@@ -0,0 +1,17 @@
+package ru.otus.spring.security.filter;
+
+import org.springframework.web.filter.GenericFilterBean;
+
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import java.io.IOException;
+
+public class MyOwnFilter extends GenericFilterBean {
+ @Override
+ public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
+ servletRequest.getParameterMap().put("SpecialValue", new String[]{"My dirty secret"});
+
+ }
+}
diff --git a/2019-11/spring-22-SS-auth/src/main/resources/templates/authenticated.html b/2019-11/spring-22-SS-auth/src/main/resources/templates/authenticated.html
new file mode 100644
index 00000000..0d2043f0
--- /dev/null
+++ b/2019-11/spring-22-SS-auth/src/main/resources/templates/authenticated.html
@@ -0,0 +1,10 @@
+
+
+
+
+ Только для авторизованных
+
+
+Только для авторизованных
+
+
diff --git a/2019-11/spring-22-SS-auth/src/main/resources/templates/error.html b/2019-11/spring-22-SS-auth/src/main/resources/templates/error.html
new file mode 100644
index 00000000..ba4e50a2
--- /dev/null
+++ b/2019-11/spring-22-SS-auth/src/main/resources/templates/error.html
@@ -0,0 +1,10 @@
+
+
+
+
+ Упс...
+
+
+Что-то пошло не так. Печалька
+
+
diff --git a/2019-11/spring-22-SS-auth/src/main/resources/templates/index.html b/2019-11/spring-22-SS-auth/src/main/resources/templates/index.html
new file mode 100644
index 00000000..f2d1d1ae
--- /dev/null
+++ b/2019-11/spring-22-SS-auth/src/main/resources/templates/index.html
@@ -0,0 +1,12 @@
+
+
+
+
+ Главная страница
+
+
+/public
+
+/authenticated
+
+
diff --git a/2019-11/spring-22-SS-auth/src/main/resources/templates/public.html b/2019-11/spring-22-SS-auth/src/main/resources/templates/public.html
new file mode 100644
index 00000000..b9f93817
--- /dev/null
+++ b/2019-11/spring-22-SS-auth/src/main/resources/templates/public.html
@@ -0,0 +1,10 @@
+
+
+
+
+ Доступен всем
+
+
+Доступен всем
+
+
diff --git a/2019-11/spring-22-SS-auth/src/main/resources/templates/success.html b/2019-11/spring-22-SS-auth/src/main/resources/templates/success.html
new file mode 100644
index 00000000..58414c01
--- /dev/null
+++ b/2019-11/spring-22-SS-auth/src/main/resources/templates/success.html
@@ -0,0 +1,10 @@
+
+
+
+
+ Вы успешно вошли !
+
+
+Вы успешно вошли !
+
+
diff --git a/2019-11/spring-22-SS-auth/src/test/java/ru/otus/spring/rest/PagesControllerTest.java b/2019-11/spring-22-SS-auth/src/test/java/ru/otus/spring/rest/PagesControllerTest.java
new file mode 100644
index 00000000..13a4e4f1
--- /dev/null
+++ b/2019-11/spring-22-SS-auth/src/test/java/ru/otus/spring/rest/PagesControllerTest.java
@@ -0,0 +1,30 @@
+package ru.otus.spring.rest;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+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.junit4.SpringRunner;
+import org.springframework.test.web.servlet.MockMvc;
+
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+@RunWith(SpringRunner.class)
+@WebMvcTest(PagesController.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());
+ }
+}