Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 0 additions & 38 deletions module09/src/test/java/ru/sberbank/edu/AppTest.java

This file was deleted.

38 changes: 38 additions & 0 deletions module13/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/

### IntelliJ IDEA ###
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
.idea/libraries/
*.iws
*.iml
*.ipr

### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache

### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/

### VS Code ###
.vscode/

### Mac OS ###
.DS_Store
9 changes: 9 additions & 0 deletions module13/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# Module 13. Docker

### Требования:
Доработать ДЗ 12, добавить возможность запускать приложение в контейнере.

## Критерии приемки:

1. Для запуска приложения использовать Docker (docker-compose.yml).
2. В качестве бд использовать PostgreSQL (предпочтение) или любую другую бд.
27 changes: 27 additions & 0 deletions module13/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
version: '3.8'

services:
app:
build: .
ports:
- "8080:8080"
environment:
- SPRING_DATASOURCE_URL=jdbc:postgresql://db:5432/postgres
- SPRING_DATASOURCE_USERNAME=postgres
- SPRING_DATASOURCE_PASSWORD=mypassword
depends_on:
- db

db:
image: postgres:latest
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=mypassword
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data

volumes:
postgres_data:
4 changes: 4 additions & 0 deletions module13/dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
FROM openjdk:17-slim
COPY target/module13-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app.jar"]
65 changes: 65 additions & 0 deletions module13/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>ru.edu</groupId>
<artifactId>module13</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>module13</name>
<description>module13</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>

<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

</project>
13 changes: 13 additions & 0 deletions module13/src/main/java/ru/edu/module13/Application.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package ru.edu.module13;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}

}
60 changes: 60 additions & 0 deletions module13/src/main/java/ru/edu/module13/config/SecurityConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package ru.edu.module13.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
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.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
import ru.edu.module13.entity.Auth;
import ru.edu.module13.repository.AuthRepository;

import java.util.stream.Collectors;

@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Autowired
private AuthRepository authRepository;

@Bean
public UserDetailsService userDetailsService() {
return username -> {
Auth auth = authRepository.findByUsername(username);
if (auth == null) {
throw new UsernameNotFoundException("Пользователь " + username + " не найден.");
}
return new org.springframework.security.core.userdetails.User(
auth.getUsername(),
auth.getPassword(),
auth.getRoles().stream()
.map(role -> new SimpleGrantedAuthority(role.getName()))
.collect(Collectors.toList()));
};
}

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.csrf((csrf) -> csrf.disable())
.authorizeHttpRequests((authorize) -> authorize
.requestMatchers(HttpMethod.GET).hasAuthority("ROLE_USER")
.requestMatchers(HttpMethod.POST).hasAuthority("ROLE_ADMIN")
.anyRequest().authenticated())
.httpBasic(Customizer.withDefaults());

return http.build();
}

@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package ru.edu.module13.controller;

import org.springframework.web.bind.annotation.*;
import ru.edu.module13.entity.MyUser;
import ru.edu.module13.repository.MyUserRepository;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("/users")
public class UsersRestController {
private MyUserRepository myUserRepository;
public UsersRestController(MyUserRepository myUserRepository) {
this.myUserRepository = myUserRepository;
}

@GetMapping
public List<MyUser> getUsers() {
return myUserRepository.findAll();
}
@PostMapping
public MyUser createUser(@RequestBody MyUser user) {
return myUserRepository.save(user);
}
@PutMapping("/{id}")
public MyUser updateUser(@PathVariable Long id, @RequestBody MyUser myUserDetails) {
MyUser myUser = myUserRepository.findById(id).orElseThrow(() -> new RuntimeException("User not found with id " + id));

myUser.setName(myUserDetails.getName());
myUser.setAge(myUserDetails.getAge());
return myUserRepository.save(myUser);
}
@DeleteMapping("/{id}")
public Map<String, Boolean> deleteUser(@PathVariable Long id) {
MyUser myUser = myUserRepository.findById(id).orElseThrow(() -> new RuntimeException("User not found with id " + id));

myUserRepository.delete(myUser);
Map<String, Boolean> response = new HashMap<>();
response.put("deleted", Boolean.TRUE);
return response;
}
@GetMapping("/{id}")
public MyUser getUserById(@PathVariable Long id) {
return myUserRepository.findById(id).orElseThrow(() -> new RuntimeException("User not found with id " + id));
}

}
36 changes: 36 additions & 0 deletions module13/src/main/java/ru/edu/module13/entity/Auth.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package ru.edu.module13.entity;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.util.HashSet;
import java.util.Set;

@Entity
@Table(name = "auth")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Auth {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

private String username;
private String password;

@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinTable(
name = "auth_roles",
joinColumns = @JoinColumn(name = "auth_id"),
inverseJoinColumns = @JoinColumn(name = "role_id")
)
private Set<Role> roles = new HashSet<>();


}
21 changes: 21 additions & 0 deletions module13/src/main/java/ru/edu/module13/entity/MyUser.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package ru.edu.module13.entity;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class MyUser {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

private String name;
private Integer age;
}
23 changes: 23 additions & 0 deletions module13/src/main/java/ru/edu/module13/entity/Role.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package ru.edu.module13.entity;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Entity
@Table(name = "roles")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Role {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

private String name;


}
Loading