From dba6c708a2cf9e2e8dbe52e8e40c2837e4f749dc Mon Sep 17 00:00:00 2001 From: kataus Date: Fri, 28 Feb 2020 19:08:49 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D1=80=D0=B8=D0=BC=D0=B5=D1=80=20=D0=BA?= =?UTF-8?q?=2024=20=D0=B7=D0=B0=D0=BD=D1=8F=D1=82=D0=B8=D1=8E=20(Spring=20?= =?UTF-8?q?Security=20-=20WebFlux)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2019-11/spring-24-SS-ACL/pom.xml | 2 +- 2019-11/spring-24-WebFlux/pom.xml | 72 +++++++++++++++++++ .../src/main/java/ru/otus/spring/Main.java | 22 ++++++ .../main/java/ru/otus/spring/data/Person.java | 41 +++++++++++ .../ru/otus/spring/data/PersonRepository.java | 11 +++ .../ru/otus/spring/rest/PersonController.java | 34 +++++++++ .../security/SecurityConfiguration.java | 47 ++++++++++++ .../main/resources/static/authenticated.html | 9 +++ .../src/main/resources/static/index.html | 11 +++ .../src/main/resources/static/public.html | 9 +++ 10 files changed, 257 insertions(+), 1 deletion(-) create mode 100644 2019-11/spring-24-WebFlux/pom.xml create mode 100644 2019-11/spring-24-WebFlux/src/main/java/ru/otus/spring/Main.java create mode 100644 2019-11/spring-24-WebFlux/src/main/java/ru/otus/spring/data/Person.java create mode 100644 2019-11/spring-24-WebFlux/src/main/java/ru/otus/spring/data/PersonRepository.java create mode 100644 2019-11/spring-24-WebFlux/src/main/java/ru/otus/spring/rest/PersonController.java create mode 100644 2019-11/spring-24-WebFlux/src/main/java/ru/otus/spring/security/SecurityConfiguration.java create mode 100644 2019-11/spring-24-WebFlux/src/main/resources/static/authenticated.html create mode 100644 2019-11/spring-24-WebFlux/src/main/resources/static/index.html create mode 100644 2019-11/spring-24-WebFlux/src/main/resources/static/public.html diff --git a/2019-11/spring-24-SS-ACL/pom.xml b/2019-11/spring-24-SS-ACL/pom.xml index 49358ba4..3dc8c0d2 100644 --- a/2019-11/spring-24-SS-ACL/pom.xml +++ b/2019-11/spring-24-SS-ACL/pom.xml @@ -5,7 +5,7 @@ 4.0.0 ru.otus - spring-framework-22-acl + spring-framework-24-acl 1.0-SNAPSHOT diff --git a/2019-11/spring-24-WebFlux/pom.xml b/2019-11/spring-24-WebFlux/pom.xml new file mode 100644 index 00000000..418cc62f --- /dev/null +++ b/2019-11/spring-24-WebFlux/pom.xml @@ -0,0 +1,72 @@ + + + 4.0.0 + + ru.otus + spring-framework-24-webflux + 1.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-parent + 2.0.5.RELEASE + + + + + org.springframework.boot + spring-boot-starter-webflux + + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + + org.springframework.security + spring-security-core + + + org.springframework.security + spring-security-config + + + org.springframework.security + spring-security-web + + + org.springframework.security + spring-security-webflux + 5.0.0.M5 + + + + org.springframework.boot + spring-boot-starter-data-mongodb-reactive + + + + de.flapdoodle.embed + de.flapdoodle.embed.mongo + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + + spring-milestone + http://repo.spring.io/milestone + + + diff --git a/2019-11/spring-24-WebFlux/src/main/java/ru/otus/spring/Main.java b/2019-11/spring-24-WebFlux/src/main/java/ru/otus/spring/Main.java new file mode 100644 index 00000000..490b4b3a --- /dev/null +++ b/2019-11/spring-24-WebFlux/src/main/java/ru/otus/spring/Main.java @@ -0,0 +1,22 @@ +package ru.otus.spring; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.core.io.ClassPathResource; +import org.springframework.web.reactive.function.server.RouterFunction; +import org.springframework.web.reactive.function.server.RouterFunctions; +import org.springframework.web.reactive.function.server.ServerResponse; + +@SpringBootApplication +public class Main { + + public static void main(String[] args) { + SpringApplication.run(Main.class); + } + + @Bean + RouterFunction staticResourceRouter() { + return RouterFunctions.resources("/**.html", new ClassPathResource("static/")); + } +} diff --git a/2019-11/spring-24-WebFlux/src/main/java/ru/otus/spring/data/Person.java b/2019-11/spring-24-WebFlux/src/main/java/ru/otus/spring/data/Person.java new file mode 100644 index 00000000..067c0b64 --- /dev/null +++ b/2019-11/spring-24-WebFlux/src/main/java/ru/otus/spring/data/Person.java @@ -0,0 +1,41 @@ +package ru.otus.spring.data; + +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.mapping.Document; + +@Document +public class Person { + + @Id + private String id; + + private String name; + + public Person() { + } + + public Person(String name) { + this.name = name; + } + + public Person(String id, String name) { + this.id = id; + this.name = name; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/2019-11/spring-24-WebFlux/src/main/java/ru/otus/spring/data/PersonRepository.java b/2019-11/spring-24-WebFlux/src/main/java/ru/otus/spring/data/PersonRepository.java new file mode 100644 index 00000000..2f1994d3 --- /dev/null +++ b/2019-11/spring-24-WebFlux/src/main/java/ru/otus/spring/data/PersonRepository.java @@ -0,0 +1,11 @@ +package ru.otus.spring.data; + +import org.springframework.data.mongodb.repository.ReactiveMongoRepository; +import org.springframework.stereotype.Repository; +import reactor.core.publisher.Mono; + +@Repository +public interface PersonRepository extends ReactiveMongoRepository { + + Mono findByName(String string); +} diff --git a/2019-11/spring-24-WebFlux/src/main/java/ru/otus/spring/rest/PersonController.java b/2019-11/spring-24-WebFlux/src/main/java/ru/otus/spring/rest/PersonController.java new file mode 100644 index 00000000..f1d4333c --- /dev/null +++ b/2019-11/spring-24-WebFlux/src/main/java/ru/otus/spring/rest/PersonController.java @@ -0,0 +1,34 @@ +package ru.otus.spring.rest; + +import org.springframework.web.bind.annotation.*; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; +import ru.otus.spring.data.Person; +import ru.otus.spring.data.PersonRepository; + +@RestController +public class PersonController { + + private final PersonRepository personRepository; + + public PersonController(PersonRepository personRepository) { + this.personRepository = personRepository; + } + + @GetMapping("/person") + public Flux getAll() { + return personRepository.findAll(); + } + + @GetMapping("/person/find") + public Mono find(@RequestParam("name") String name) { + return personRepository.findByName(name) + .cache(); + } + + + @PostMapping("/person") + public Mono savePerson(@RequestBody Person person) { + return personRepository.save(person); + } +} diff --git a/2019-11/spring-24-WebFlux/src/main/java/ru/otus/spring/security/SecurityConfiguration.java b/2019-11/spring-24-WebFlux/src/main/java/ru/otus/spring/security/SecurityConfiguration.java new file mode 100644 index 00000000..2ddf4e0e --- /dev/null +++ b/2019-11/spring-24-WebFlux/src/main/java/ru/otus/spring/security/SecurityConfiguration.java @@ -0,0 +1,47 @@ +package ru.otus.spring.security; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpMethod; +import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity; +import org.springframework.security.config.web.server.ServerHttpSecurity; +import org.springframework.security.core.userdetails.MapReactiveUserDetailsService; +import org.springframework.security.core.userdetails.ReactiveUserDetailsService; +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.web.server.SecurityWebFilterChain; + +@Configuration +@EnableWebFluxSecurity +public class SecurityConfiguration { + + @Bean + public SecurityWebFilterChain springWebFilterChain(ServerHttpSecurity http) { + return http + .authorizeExchange() + .pathMatchers(HttpMethod.GET, "/authenticated.html").hasRole("USER") + // anonymous + .anyExchange().permitAll() + .and() + .httpBasic() + .and() + .build(); + } + + @Bean + public PasswordEncoder passwordEncoder() { + return NoOpPasswordEncoder.getInstance(); + } + + @Bean + public ReactiveUserDetailsService userDetailsService() { + UserDetails user = User + .withUsername("user") + .password("password") + .roles("USER") + .build(); + return new MapReactiveUserDetailsService(user); + } +} diff --git a/2019-11/spring-24-WebFlux/src/main/resources/static/authenticated.html b/2019-11/spring-24-WebFlux/src/main/resources/static/authenticated.html new file mode 100644 index 00000000..e4756c01 --- /dev/null +++ b/2019-11/spring-24-WebFlux/src/main/resources/static/authenticated.html @@ -0,0 +1,9 @@ + + + + + + +Только для аторизованных + + diff --git a/2019-11/spring-24-WebFlux/src/main/resources/static/index.html b/2019-11/spring-24-WebFlux/src/main/resources/static/index.html new file mode 100644 index 00000000..a89ba331 --- /dev/null +++ b/2019-11/spring-24-WebFlux/src/main/resources/static/index.html @@ -0,0 +1,11 @@ + + + + + + +/public.html +
+/authenticated.html + + diff --git a/2019-11/spring-24-WebFlux/src/main/resources/static/public.html b/2019-11/spring-24-WebFlux/src/main/resources/static/public.html new file mode 100644 index 00000000..77188469 --- /dev/null +++ b/2019-11/spring-24-WebFlux/src/main/resources/static/public.html @@ -0,0 +1,9 @@ + + + + + + +Доступен всем + +