mirror of
https://github.com/OtusTeam/Spring.git
synced 2026-05-30 10:50:42 +00:00
примеры к занятию
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>ru.otus</groupId>
|
||||
<artifactId>classwork</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
|
||||
<parent>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-parent</artifactId>
|
||||
<version>3.2.5</version>
|
||||
</parent>
|
||||
|
||||
<properties>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||
<java.version>17</java.version>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<!-- Spring MVC -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-web</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-thymeleaf</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- Spring Security -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-security</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- Test -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
</dependency>
|
||||
<!-- For Spring Security testing -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.security</groupId>
|
||||
<artifactId>spring-security-test</artifactId>
|
||||
<version>${spring-security.version}</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
+40
@@ -0,0 +1,40 @@
|
||||
package ru.otus.spring.controller;
|
||||
|
||||
import org.springframework.security.core.context.SecurityContext;
|
||||
import org.springframework.security.core.context.SecurityContextHolder;
|
||||
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();
|
||||
return "authenticated";
|
||||
}
|
||||
|
||||
@GetMapping("/success")
|
||||
public String successPage() {
|
||||
return "success";
|
||||
}
|
||||
|
||||
|
||||
@GetMapping("/error")
|
||||
public String errorPage() {
|
||||
return "error";
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
+56
@@ -0,0 +1,56 @@
|
||||
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 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()
|
||||
)
|
||||
.formLogin( Customizer.withDefaults() );
|
||||
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 );
|
||||
|
||||
}
|
||||
}
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
package ru.otus.spring.security.filter;
|
||||
|
||||
import jakarta.servlet.FilterChain;
|
||||
import jakarta.servlet.ServletException;
|
||||
import jakarta.servlet.ServletRequest;
|
||||
import jakarta.servlet.ServletResponse;
|
||||
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 {
|
||||
servletRequest.getParameterMap().put( "SpecialValue", new String[]{ "My dirty secret" } );
|
||||
filterChain.doFilter( servletRequest, servletResponse );
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,99 @@
|
||||
# Программа JS Dev -> Java Dev
|
||||
|
||||
## Первые шаги в Java
|
||||
|
||||
### 1. Java HelloWorld
|
||||
- История языка
|
||||
- Основные концепции языка
|
||||
- Экосистема, установка. Какую версию выбрать?
|
||||
- Типы данных. Примитивы/классы
|
||||
- Hello World. Сборка и запуск приложений на Java
|
||||
|
||||
### 2. ООП в Java
|
||||
- ООП
|
||||
- Классы, поля и методы
|
||||
- Модификаторы доступа.
|
||||
- Специализированные конструкции классов (интерфейс, enum)
|
||||
- аритектура на основе ООП
|
||||
- исключения
|
||||
|
||||
### 3. Практическая Java. ДЗ
|
||||
- IDE
|
||||
- Code Convention
|
||||
- Инструменты сборки (maven)
|
||||
- Тестирование
|
||||
|
||||
### 4. Generics. Collections
|
||||
|
||||
### 5. Аннотации. Lombok
|
||||
|
||||
### 6. Сборщик мусора, Java в Докер. ДЗ
|
||||
- Управление памятью
|
||||
- Основы Docker
|
||||
- Java в Docker (особенно память)
|
||||
|
||||
### 7. Многопоточность в Java
|
||||
- Проблематика
|
||||
- Создание потоков
|
||||
- JMM
|
||||
- Управление потоками
|
||||
|
||||
### 8. Функциональное программирование в Java
|
||||
- Лямбда функции
|
||||
- Функциональное программирование
|
||||
- Streams
|
||||
- Optional
|
||||
|
||||
## SQL БД
|
||||
|
||||
### 9. Основы реляционных БД. SQL
|
||||
- Концепция и архитектура реляционных БД
|
||||
- SQL. Основные приемы
|
||||
|
||||
### 10. Java-SQLDB. ORM. ДЗ
|
||||
- SQL запросы в java (JDBC)
|
||||
- ORM. Hibernate
|
||||
|
||||
## Прикладная Java
|
||||
|
||||
### 11. Архитектура приложение (SOLID, Dependency Injection)
|
||||
- понятия Inversion of Control (IoC) и Dependency Injection (DI);
|
||||
- Что такое Spring
|
||||
|
||||
### 12. Spring Framework. Основы
|
||||
- Создание приложений с помощью Spring
|
||||
- Spring Boot
|
||||
- Конфигурация
|
||||
|
||||
### 13. Spring Framework. DB
|
||||
- Spring JDBC
|
||||
- Spring JPA
|
||||
- Магия Spring Data JPA
|
||||
- Тестирование
|
||||
|
||||
### 14. Spring WEB (REST). ДЗ
|
||||
- Spring WEB
|
||||
- REST API
|
||||
- OpenAPI
|
||||
- Тестирование
|
||||
|
||||
### 15. Spring Security
|
||||
- Архитектура
|
||||
- Аутентификация
|
||||
- Авторизация
|
||||
- Тестирование
|
||||
|
||||
### 16. Spring Kafka
|
||||
- Архитектура Kafka
|
||||
- Интеграция Spring-приложения и Kafka
|
||||
- Тестирование
|
||||
|
||||
### 17. Интеграционное тестирование ДЗ
|
||||
- Идеология
|
||||
- Gherkin, Cucumber
|
||||
- Selenium
|
||||
- Test Containers
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
logging:
|
||||
level:
|
||||
root: error
|
||||
org.springframework: error
|
||||
@@ -0,0 +1,10 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8"/>
|
||||
<title>Только для авторизованных</title>
|
||||
</head>
|
||||
<body>
|
||||
Только для авторизованных
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,10 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8"/>
|
||||
<title>Упс...</title>
|
||||
</head>
|
||||
<body>
|
||||
Что-то пошло не так. Печалька
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,12 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" xmlns:th="http://www.thymeleaf.org">
|
||||
<head>
|
||||
<meta charset="UTF-8"/>
|
||||
<title>Главная страница</title>
|
||||
</head>
|
||||
<body>
|
||||
<a th:href="@{public}">/public</a>
|
||||
<br>
|
||||
<a th:href="@{authenticated}">/authenticated</a>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,10 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8"/>
|
||||
<title>Доступен всем</title>
|
||||
</head>
|
||||
<body>
|
||||
Доступен всем
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,10 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8"/>
|
||||
<title>Вы успешно вошли !</title>
|
||||
</head>
|
||||
<body>
|
||||
Вы успешно вошли !
|
||||
</body>
|
||||
</html>
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
package ru.otus.spring.controller;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.extension.ExtendWith;
|
||||
|
||||
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.web.servlet.MockMvc;
|
||||
|
||||
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
|
||||
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
|
||||
|
||||
@ExtendWith(SpringExtension.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());
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user