From a6f28280f8932aa6060f41c25b635a141d780bfc Mon Sep 17 00:00:00 2001 From: Elena Radchenko Date: Mon, 4 Mar 2024 23:04:22 +0300 Subject: [PATCH 01/17] started work with Spring Security and some changes to files project --- backend/Dockerfile | 20 ++++---- backend/docker-compose.yaml | 14 +++--- backend/pom.xml | 5 ++ .../QuickProjectApp/dao/UserRepository.java | 3 +- .../QuickProjectApp/entity/Journal.java | 1 + .../QuickProjectApp/entity/Project.java | 1 + .../QuickProjectApp/entity/Queue.java | 1 + .../QuickProjectApp/entity/user/Role.java | 7 +++ .../entity/{ => user}/User.java | 46 +++++++++++++++++-- .../ProjectRoleRepositoyTest.java | 2 +- .../ProjectsRepositoyTest.java | 3 +- .../QuickProjectApp/UserRepositoyTest.java | 2 +- 12 files changed, 79 insertions(+), 26 deletions(-) create mode 100644 backend/src/main/java/com/QuickProject/QuickProjectApp/entity/user/Role.java rename backend/src/main/java/com/QuickProject/QuickProjectApp/entity/{ => user}/User.java (56%) diff --git a/backend/Dockerfile b/backend/Dockerfile index a19f59f..2392adf 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -1,11 +1,13 @@ -FROM openjdk:17.0.2-jdk-slim-buster -ARG JAR_FILE=target/*.jar -COPY ${JAR_FILE} app.jar -ENTRYPOINT ["java","-jar","/app.jar"] +# Stage 1: Сборка приложения +FROM maven:3.8.3-openjdk-17 AS build +WORKDIR /app +COPY pom.xml . +RUN mvn dependency:go-offline +COPY src/ /app/src/ +RUN mvn package -Dmaven.test.skip=true # Stage 2: Создание финального образа -#FROM openjdk:11 -#WORKDIR /app -#COPY --from=build /app/target/QuickProjectApp.jar /app/QuickProjectApp.jar -#CMD ["java", "-jar", "QuickProjectApp.jar"] - +FROM openjdk:17 +WORKDIR /app +COPY --from=build /app/target/QuickProjectApp-0.0.1-SNAPSHOT.jar /app/QuickProjectApp.jar +CMD ["java", "-jar", "QuickProjectApp.jar"] \ No newline at end of file diff --git a/backend/docker-compose.yaml b/backend/docker-compose.yaml index 9dc7bb2..2073675 100644 --- a/backend/docker-compose.yaml +++ b/backend/docker-compose.yaml @@ -2,20 +2,20 @@ version: '3.8' services: - dev_app: + pet_app: image: pet:dev - container_name: dev_app + container_name: pet_app build: context: . dockerfile: Dockerfile depends_on: - dev_db: + pet_db: condition: service_healthy links: - - dev_db + - pet_db environment: SPRING_PROFILES_ACTIVE: dev - SPRING_DATASOURCE_URL: jdbc:postgresql://dev_db:5432/pet + SPRING_DATASOURCE_URL: jdbc:postgresql://pet_db:5432/pet SPRING_DATASOURCE_USERNAME: ${DB_USERNAME} SPRING_DATASOURCE_PASSWORD: ${DB_PASSWORD} SPRING_PARENT_DIRECTORY: / @@ -25,9 +25,9 @@ services: volumes: - ${HOST_PARENT_DIRECTORY}:/pet - dev_db: + pet_db: image: postgres - container_name: dev_db + container_name: pet_db environment: POSTGRES_USER: ${DB_USERNAME} POSTGRES_PASSWORD: ${DB_PASSWORD} diff --git a/backend/pom.xml b/backend/pom.xml index 79e229d..04e732e 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -36,6 +36,11 @@ spring-boot-starter-data-rest + + org.springframework.boot + spring-boot-starter-security + + org.projectlombok lombok diff --git a/backend/src/main/java/com/QuickProject/QuickProjectApp/dao/UserRepository.java b/backend/src/main/java/com/QuickProject/QuickProjectApp/dao/UserRepository.java index 414d49e..85f0b72 100644 --- a/backend/src/main/java/com/QuickProject/QuickProjectApp/dao/UserRepository.java +++ b/backend/src/main/java/com/QuickProject/QuickProjectApp/dao/UserRepository.java @@ -1,10 +1,9 @@ package com.QuickProject.QuickProjectApp.dao; -import com.QuickProject.QuickProjectApp.entity.User; +import com.QuickProject.QuickProjectApp.entity.user.User; import org.springframework.dao.DataAccessException; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.rest.core.annotation.RepositoryRestResource; -import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; import java.util.List; diff --git a/backend/src/main/java/com/QuickProject/QuickProjectApp/entity/Journal.java b/backend/src/main/java/com/QuickProject/QuickProjectApp/entity/Journal.java index c05dd91..59ac76e 100644 --- a/backend/src/main/java/com/QuickProject/QuickProjectApp/entity/Journal.java +++ b/backend/src/main/java/com/QuickProject/QuickProjectApp/entity/Journal.java @@ -3,6 +3,7 @@ import java.time.LocalDateTime; import java.util.UUID; +import com.QuickProject.QuickProjectApp.entity.user.User; import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/backend/src/main/java/com/QuickProject/QuickProjectApp/entity/Project.java b/backend/src/main/java/com/QuickProject/QuickProjectApp/entity/Project.java index fa50c8a..d90304a 100644 --- a/backend/src/main/java/com/QuickProject/QuickProjectApp/entity/Project.java +++ b/backend/src/main/java/com/QuickProject/QuickProjectApp/entity/Project.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.UUID; +import com.QuickProject.QuickProjectApp.entity.user.User; import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/backend/src/main/java/com/QuickProject/QuickProjectApp/entity/Queue.java b/backend/src/main/java/com/QuickProject/QuickProjectApp/entity/Queue.java index 90c7871..fce1e45 100644 --- a/backend/src/main/java/com/QuickProject/QuickProjectApp/entity/Queue.java +++ b/backend/src/main/java/com/QuickProject/QuickProjectApp/entity/Queue.java @@ -2,6 +2,7 @@ import java.util.UUID; +import com.QuickProject.QuickProjectApp.entity.user.User; import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/backend/src/main/java/com/QuickProject/QuickProjectApp/entity/user/Role.java b/backend/src/main/java/com/QuickProject/QuickProjectApp/entity/user/Role.java new file mode 100644 index 0000000..f49fa3b --- /dev/null +++ b/backend/src/main/java/com/QuickProject/QuickProjectApp/entity/user/Role.java @@ -0,0 +1,7 @@ +package com.QuickProject.QuickProjectApp.entity.user; + +public enum Role { + + + +} diff --git a/backend/src/main/java/com/QuickProject/QuickProjectApp/entity/User.java b/backend/src/main/java/com/QuickProject/QuickProjectApp/entity/user/User.java similarity index 56% rename from backend/src/main/java/com/QuickProject/QuickProjectApp/entity/User.java rename to backend/src/main/java/com/QuickProject/QuickProjectApp/entity/user/User.java index a111dad..29c502f 100644 --- a/backend/src/main/java/com/QuickProject/QuickProjectApp/entity/User.java +++ b/backend/src/main/java/com/QuickProject/QuickProjectApp/entity/user/User.java @@ -1,32 +1,37 @@ -package com.QuickProject.QuickProjectApp.entity; +package com.QuickProject.QuickProjectApp.entity.user; +import com.QuickProject.QuickProjectApp.entity.Journal; +import com.QuickProject.QuickProjectApp.entity.Project; import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; import java.time.LocalDateTime; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.UUID; /** * Класс для работы с сущностью "user" -*/ + */ @Builder @AllArgsConstructor @NoArgsConstructor @Entity @Data @Table(name = "users") -public class User { +public class User implements UserDetails { @Id @Column(name = "id") private UUID id = UUID.randomUUID(); - @Column(name = "login") private String login; @@ -63,6 +68,9 @@ public class User { @Column(name = "photo") private byte[] photo; + @Enumerated(EnumType.STRING) + Role role; + @Builder.Default @OneToMany(mappedBy = "user") private List journal = new ArrayList<>(); @@ -70,4 +78,34 @@ public class User { @OneToOne(mappedBy = "creator") private Project project; + + @Override + public Collection getAuthorities() { + return List.of(new SimpleGrantedAuthority(role.name())); + } + + @Override + public String getUsername() { + return email; + } + + @Override + public boolean isAccountNonExpired() { + return true; + } + + @Override + public boolean isAccountNonLocked() { + return true; + } + + @Override + public boolean isCredentialsNonExpired() { + return true; + } + + @Override + public boolean isEnabled() { + return enable; + } } diff --git a/backend/src/test/java/com/QuickProject/QuickProjectApp/ProjectRoleRepositoyTest.java b/backend/src/test/java/com/QuickProject/QuickProjectApp/ProjectRoleRepositoyTest.java index ef55021..259920e 100644 --- a/backend/src/test/java/com/QuickProject/QuickProjectApp/ProjectRoleRepositoyTest.java +++ b/backend/src/test/java/com/QuickProject/QuickProjectApp/ProjectRoleRepositoyTest.java @@ -5,7 +5,7 @@ import com.QuickProject.QuickProjectApp.dao.UserRepository; import com.QuickProject.QuickProjectApp.entity.Project; import com.QuickProject.QuickProjectApp.entity.ProjectRole; -import com.QuickProject.QuickProjectApp.entity.User; +import com.QuickProject.QuickProjectApp.entity.user.User; import io.zonky.test.db.AutoConfigureEmbeddedDatabase; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; diff --git a/backend/src/test/java/com/QuickProject/QuickProjectApp/ProjectsRepositoyTest.java b/backend/src/test/java/com/QuickProject/QuickProjectApp/ProjectsRepositoyTest.java index 64ca741..cc4ecd7 100644 --- a/backend/src/test/java/com/QuickProject/QuickProjectApp/ProjectsRepositoyTest.java +++ b/backend/src/test/java/com/QuickProject/QuickProjectApp/ProjectsRepositoyTest.java @@ -3,14 +3,13 @@ import com.QuickProject.QuickProjectApp.dao.ProjectRepository; import com.QuickProject.QuickProjectApp.dao.UserRepository; import com.QuickProject.QuickProjectApp.entity.Project; -import com.QuickProject.QuickProjectApp.entity.User; +import com.QuickProject.QuickProjectApp.entity.user.User; import io.zonky.test.db.AutoConfigureEmbeddedDatabase; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import java.time.LocalDateTime; -import java.util.UUID; import static org.assertj.core.api.Assertions.assertThat; @DataJpaTest diff --git a/backend/src/test/java/com/QuickProject/QuickProjectApp/UserRepositoyTest.java b/backend/src/test/java/com/QuickProject/QuickProjectApp/UserRepositoyTest.java index 5818dc8..25d8ec4 100644 --- a/backend/src/test/java/com/QuickProject/QuickProjectApp/UserRepositoyTest.java +++ b/backend/src/test/java/com/QuickProject/QuickProjectApp/UserRepositoyTest.java @@ -1,7 +1,7 @@ package com.QuickProject.QuickProjectApp; import com.QuickProject.QuickProjectApp.dao.UserRepository; -import com.QuickProject.QuickProjectApp.entity.User; +import com.QuickProject.QuickProjectApp.entity.user.User; import io.zonky.test.db.AutoConfigureEmbeddedDatabase; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; From 52eb407dcf3a66f7631c169cc20a6c0d8ab8d257 Mon Sep 17 00:00:00 2001 From: Elena Radchenko Date: Mon, 4 Mar 2024 23:31:02 +0300 Subject: [PATCH 02/17] added Enum Role for user, added user details --- .../QuickProjectApp/dao/UserRepository.java | 2 +- .../QuickProjectApp/entity/user/Role.java | 4 +- .../QuickProjectApp/entity/user/User.java | 47 +++++++++++++++++-- .../ProjectRoleRepositoyTest.java | 2 +- .../ProjectsRepositoyTest.java | 3 +- .../QuickProjectApp/UserRepositoyTest.java | 2 +- 6 files changed, 49 insertions(+), 11 deletions(-) diff --git a/backend/src/main/java/com/QuickProject/QuickProjectApp/dao/UserRepository.java b/backend/src/main/java/com/QuickProject/QuickProjectApp/dao/UserRepository.java index f4854cb..5dbba63 100644 --- a/backend/src/main/java/com/QuickProject/QuickProjectApp/dao/UserRepository.java +++ b/backend/src/main/java/com/QuickProject/QuickProjectApp/dao/UserRepository.java @@ -1,6 +1,6 @@ package com.QuickProject.QuickProjectApp.dao; -import com.QuickProject.QuickProjectApp.entity.user.User; +import com.QuickProject.QuickProjectApp.entity.User; import org.springframework.dao.DataAccessException; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.rest.core.annotation.RepositoryRestResource; diff --git a/backend/src/main/java/com/QuickProject/QuickProjectApp/entity/user/Role.java b/backend/src/main/java/com/QuickProject/QuickProjectApp/entity/user/Role.java index f49fa3b..86f9654 100644 --- a/backend/src/main/java/com/QuickProject/QuickProjectApp/entity/user/Role.java +++ b/backend/src/main/java/com/QuickProject/QuickProjectApp/entity/user/Role.java @@ -1,7 +1,5 @@ package com.QuickProject.QuickProjectApp.entity.user; public enum Role { - - - + USER } diff --git a/backend/src/main/java/com/QuickProject/QuickProjectApp/entity/user/User.java b/backend/src/main/java/com/QuickProject/QuickProjectApp/entity/user/User.java index a111dad..89ee150 100644 --- a/backend/src/main/java/com/QuickProject/QuickProjectApp/entity/user/User.java +++ b/backend/src/main/java/com/QuickProject/QuickProjectApp/entity/user/User.java @@ -1,32 +1,37 @@ -package com.QuickProject.QuickProjectApp.entity; +package com.QuickProject.QuickProjectApp.entity.user; +import com.QuickProject.QuickProjectApp.entity.Journal; +import com.QuickProject.QuickProjectApp.entity.Project; import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; import java.time.LocalDateTime; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.UUID; /** * Класс для работы с сущностью "user" -*/ + */ @Builder @AllArgsConstructor @NoArgsConstructor @Entity @Data @Table(name = "users") -public class User { +public class User implements UserDetails { @Id @Column(name = "id") private UUID id = UUID.randomUUID(); - @Column(name = "login") private String login; @@ -45,6 +50,11 @@ public class User { @Column(name = "password") private String password; + @Column(name = "user_role") + @Enumerated(EnumType.STRING) + private Role role; + Role userRole = Role.USER; + @Column(name = "created_at") private LocalDateTime created_at; @@ -70,4 +80,33 @@ public class User { @OneToOne(mappedBy = "creator") private Project project; + @Override + public Collection getAuthorities() { + return List.of(new SimpleGrantedAuthority(role.name())); + } + + @Override + public String getUsername() { + return email; + } + + @Override + public boolean isAccountNonExpired() { + return false; + } + + @Override + public boolean isAccountNonLocked() { + return false; + } + + @Override + public boolean isCredentialsNonExpired() { + return false; + } + + @Override + public boolean isEnabled() { + return enable; + } } diff --git a/backend/src/test/java/com/QuickProject/QuickProjectApp/ProjectRoleRepositoyTest.java b/backend/src/test/java/com/QuickProject/QuickProjectApp/ProjectRoleRepositoyTest.java index 3536042..4679cb4 100644 --- a/backend/src/test/java/com/QuickProject/QuickProjectApp/ProjectRoleRepositoyTest.java +++ b/backend/src/test/java/com/QuickProject/QuickProjectApp/ProjectRoleRepositoyTest.java @@ -5,7 +5,7 @@ import com.QuickProject.QuickProjectApp.dao.UserRepository; import com.QuickProject.QuickProjectApp.entity.Project; import com.QuickProject.QuickProjectApp.entity.ProjectRole; -import com.QuickProject.QuickProjectApp.entity.user.User; +import com.QuickProject.QuickProjectApp.entity.User; import io.zonky.test.db.AutoConfigureEmbeddedDatabase; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; diff --git a/backend/src/test/java/com/QuickProject/QuickProjectApp/ProjectsRepositoyTest.java b/backend/src/test/java/com/QuickProject/QuickProjectApp/ProjectsRepositoyTest.java index ba8761b..67002ef 100644 --- a/backend/src/test/java/com/QuickProject/QuickProjectApp/ProjectsRepositoyTest.java +++ b/backend/src/test/java/com/QuickProject/QuickProjectApp/ProjectsRepositoyTest.java @@ -3,7 +3,7 @@ import com.QuickProject.QuickProjectApp.dao.ProjectRepository; import com.QuickProject.QuickProjectApp.dao.UserRepository; import com.QuickProject.QuickProjectApp.entity.Project; -import com.QuickProject.QuickProjectApp.entity.user.User; +import com.QuickProject.QuickProjectApp.entity.User; import io.zonky.test.db.AutoConfigureEmbeddedDatabase; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -12,6 +12,7 @@ import java.time.LocalDateTime; import static org.assertj.core.api.Assertions.assertThat; + @DataJpaTest @AutoConfigureEmbeddedDatabase(provider = AutoConfigureEmbeddedDatabase.DatabaseProvider.ZONKY) public class ProjectsRepositoyTest { diff --git a/backend/src/test/java/com/QuickProject/QuickProjectApp/UserRepositoyTest.java b/backend/src/test/java/com/QuickProject/QuickProjectApp/UserRepositoyTest.java index d0a5429..8ed6dad 100644 --- a/backend/src/test/java/com/QuickProject/QuickProjectApp/UserRepositoyTest.java +++ b/backend/src/test/java/com/QuickProject/QuickProjectApp/UserRepositoyTest.java @@ -1,7 +1,7 @@ package com.QuickProject.QuickProjectApp; import com.QuickProject.QuickProjectApp.dao.UserRepository; -import com.QuickProject.QuickProjectApp.entity.user.User; +import com.QuickProject.QuickProjectApp.entity.User; import io.zonky.test.db.AutoConfigureEmbeddedDatabase; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; From 02c5c6c8bec0eb6a8d5d9616157d0ec100baccd0 Mon Sep 17 00:00:00 2001 From: Elena Radchenko Date: Mon, 4 Mar 2024 23:35:16 +0300 Subject: [PATCH 03/17] added changes for name of folder --- .../QuickProject/QuickProjectApp/ProjectRoleRepositoyTest.java | 2 +- .../com/QuickProject/QuickProjectApp/ProjectsRepositoyTest.java | 2 +- .../com/QuickProject/QuickProjectApp/UserRepositoyTest.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/src/test/java/com/QuickProject/QuickProjectApp/ProjectRoleRepositoyTest.java b/backend/src/test/java/com/QuickProject/QuickProjectApp/ProjectRoleRepositoyTest.java index 4679cb4..3536042 100644 --- a/backend/src/test/java/com/QuickProject/QuickProjectApp/ProjectRoleRepositoyTest.java +++ b/backend/src/test/java/com/QuickProject/QuickProjectApp/ProjectRoleRepositoyTest.java @@ -5,7 +5,7 @@ import com.QuickProject.QuickProjectApp.dao.UserRepository; import com.QuickProject.QuickProjectApp.entity.Project; import com.QuickProject.QuickProjectApp.entity.ProjectRole; -import com.QuickProject.QuickProjectApp.entity.User; +import com.QuickProject.QuickProjectApp.entity.user.User; import io.zonky.test.db.AutoConfigureEmbeddedDatabase; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; diff --git a/backend/src/test/java/com/QuickProject/QuickProjectApp/ProjectsRepositoyTest.java b/backend/src/test/java/com/QuickProject/QuickProjectApp/ProjectsRepositoyTest.java index 67002ef..7a75a61 100644 --- a/backend/src/test/java/com/QuickProject/QuickProjectApp/ProjectsRepositoyTest.java +++ b/backend/src/test/java/com/QuickProject/QuickProjectApp/ProjectsRepositoyTest.java @@ -3,7 +3,7 @@ import com.QuickProject.QuickProjectApp.dao.ProjectRepository; import com.QuickProject.QuickProjectApp.dao.UserRepository; import com.QuickProject.QuickProjectApp.entity.Project; -import com.QuickProject.QuickProjectApp.entity.User; +import com.QuickProject.QuickProjectApp.entity.user.User; import io.zonky.test.db.AutoConfigureEmbeddedDatabase; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; diff --git a/backend/src/test/java/com/QuickProject/QuickProjectApp/UserRepositoyTest.java b/backend/src/test/java/com/QuickProject/QuickProjectApp/UserRepositoyTest.java index 8ed6dad..d0a5429 100644 --- a/backend/src/test/java/com/QuickProject/QuickProjectApp/UserRepositoyTest.java +++ b/backend/src/test/java/com/QuickProject/QuickProjectApp/UserRepositoyTest.java @@ -1,7 +1,7 @@ package com.QuickProject.QuickProjectApp; import com.QuickProject.QuickProjectApp.dao.UserRepository; -import com.QuickProject.QuickProjectApp.entity.User; +import com.QuickProject.QuickProjectApp.entity.user.User; import io.zonky.test.db.AutoConfigureEmbeddedDatabase; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; From 82e81d267845b4c993a45a22c2b32a2fcad96551 Mon Sep 17 00:00:00 2001 From: Elena Radchenko Date: Tue, 5 Mar 2024 00:13:03 +0300 Subject: [PATCH 04/17] started work with filter --- .../config/JwtAuthenticationFilter.java | 35 +++++++++++++++++++ .../QuickProjectApp/config/JwtService.java | 12 +++++++ 2 files changed, 47 insertions(+) create mode 100644 backend/src/main/java/com/QuickProject/QuickProjectApp/config/JwtAuthenticationFilter.java create mode 100644 backend/src/main/java/com/QuickProject/QuickProjectApp/config/JwtService.java diff --git a/backend/src/main/java/com/QuickProject/QuickProjectApp/config/JwtAuthenticationFilter.java b/backend/src/main/java/com/QuickProject/QuickProjectApp/config/JwtAuthenticationFilter.java new file mode 100644 index 0000000..7e2273d --- /dev/null +++ b/backend/src/main/java/com/QuickProject/QuickProjectApp/config/JwtAuthenticationFilter.java @@ -0,0 +1,35 @@ +package com.QuickProject.QuickProjectApp.config; + +import jakarta.annotation.Nonnull; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; + +import java.io.IOException; + +@Component +@RequiredArgsConstructor +public class JwtAuthenticationFilter extends OncePerRequestFilter { + + private final JwtService jwtService; + + @Override + protected void doFilterInternal(@Nonnull HttpServletRequest request, + @Nonnull HttpServletResponse response, + @Nonnull FilterChain filterChain + ) throws ServletException, IOException { + final String authHeader = request.getHeader("Authorization"); + final String jwt; + final String userEmail; + if (authHeader == null || !authHeader.startsWith("Bearer ")) { + filterChain.doFilter(request,response); + return; + } + jwt = authHeader.substring(7); + userEmail = jwtService.extractUsername(jwt); + } +} diff --git a/backend/src/main/java/com/QuickProject/QuickProjectApp/config/JwtService.java b/backend/src/main/java/com/QuickProject/QuickProjectApp/config/JwtService.java new file mode 100644 index 0000000..249ffe2 --- /dev/null +++ b/backend/src/main/java/com/QuickProject/QuickProjectApp/config/JwtService.java @@ -0,0 +1,12 @@ +package com.QuickProject.QuickProjectApp.config; + +import org.springframework.stereotype.Service; + +@Service +public class JwtService { + public String extractUsername(String token) { + + return null; + + } +} From 21eaf30d4c4e9bb391ce6d60ecae9e8d928fb13c Mon Sep 17 00:00:00 2001 From: Elena Radchenko Date: Mon, 11 Mar 2024 22:42:45 +0300 Subject: [PATCH 05/17] added necessary dependences to pom --- backend/pom.xml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/backend/pom.xml b/backend/pom.xml index 04e732e..056aad1 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -53,6 +53,24 @@ test + + io.jsonwebtoken + jjwt-api + 0.11.5 + + + + io.jsonwebtoken + jjwt-impl + 0.11.5 + + + + io.jsonwebtoken + jjwt-jackson + 0.11.5 + + org.flywaydb flyway-core From 62bba16ef67bd6504ce99c4f8a692f94da0ff1ff Mon Sep 17 00:00:00 2001 From: Elena Radchenko Date: Mon, 11 Mar 2024 22:43:38 +0300 Subject: [PATCH 06/17] changed entity "user". Added extra fileds --- .../QuickProject/QuickProjectApp/dao/UserRepository.java | 5 +++-- .../com/QuickProject/QuickProjectApp/entity/user/User.java | 6 +++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/backend/src/main/java/com/QuickProject/QuickProjectApp/dao/UserRepository.java b/backend/src/main/java/com/QuickProject/QuickProjectApp/dao/UserRepository.java index 5dbba63..acf1b74 100644 --- a/backend/src/main/java/com/QuickProject/QuickProjectApp/dao/UserRepository.java +++ b/backend/src/main/java/com/QuickProject/QuickProjectApp/dao/UserRepository.java @@ -1,12 +1,13 @@ package com.QuickProject.QuickProjectApp.dao; -import com.QuickProject.QuickProjectApp.entity.User; +import com.QuickProject.QuickProjectApp.entity.user.User; import org.springframework.dao.DataAccessException; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.rest.core.annotation.RepositoryRestResource; import org.springframework.transaction.annotation.Transactional; import java.util.List; +import java.util.Optional; import java.util.UUID; /** @@ -15,7 +16,7 @@ @RepositoryRestResource(path="users") public interface UserRepository extends JpaRepository { @Transactional(readOnly = true) - List findByEmail(String email) throws DataAccessException; + Optional findByEmail(String email) throws DataAccessException; } diff --git a/backend/src/main/java/com/QuickProject/QuickProjectApp/entity/user/User.java b/backend/src/main/java/com/QuickProject/QuickProjectApp/entity/user/User.java index 89ee150..2271bda 100644 --- a/backend/src/main/java/com/QuickProject/QuickProjectApp/entity/user/User.java +++ b/backend/src/main/java/com/QuickProject/QuickProjectApp/entity/user/User.java @@ -92,17 +92,17 @@ public String getUsername() { @Override public boolean isAccountNonExpired() { - return false; + return true; } @Override public boolean isAccountNonLocked() { - return false; + return true; } @Override public boolean isCredentialsNonExpired() { - return false; + return true; } @Override From 783f15ef822ec9ae273886c43c9e3501fa6eb6c8 Mon Sep 17 00:00:00 2001 From: Elena Radchenko Date: Mon, 11 Mar 2024 22:44:44 +0300 Subject: [PATCH 07/17] worked with filter and auth configuration --- .../src/main/java/auth/RegisterRequest.java | 20 ++++++ .../config/ApplicationConfig.java | 49 ++++++++++++++ .../config/JwtAuthenticationFilter.java | 34 ++++++++-- .../QuickProjectApp/config/JwtService.java | 64 ++++++++++++++++++- .../config/SecurityConfiguration.java | 42 ++++++++++++ 5 files changed, 204 insertions(+), 5 deletions(-) create mode 100644 backend/src/main/java/auth/RegisterRequest.java create mode 100644 backend/src/main/java/com/QuickProject/QuickProjectApp/config/ApplicationConfig.java create mode 100644 backend/src/main/java/com/QuickProject/QuickProjectApp/config/SecurityConfiguration.java diff --git a/backend/src/main/java/auth/RegisterRequest.java b/backend/src/main/java/auth/RegisterRequest.java new file mode 100644 index 0000000..7e88bed --- /dev/null +++ b/backend/src/main/java/auth/RegisterRequest.java @@ -0,0 +1,20 @@ +package auth; + + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class RegisterRequest { + + private String firstname; + + private String email; + + private String password; +} diff --git a/backend/src/main/java/com/QuickProject/QuickProjectApp/config/ApplicationConfig.java b/backend/src/main/java/com/QuickProject/QuickProjectApp/config/ApplicationConfig.java new file mode 100644 index 0000000..1d6aa7c --- /dev/null +++ b/backend/src/main/java/com/QuickProject/QuickProjectApp/config/ApplicationConfig.java @@ -0,0 +1,49 @@ +package com.QuickProject.QuickProjectApp.config; + +import com.QuickProject.QuickProjectApp.dao.UserRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Conditional; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.AuthenticationProvider; +import org.springframework.security.authentication.dao.DaoAuthenticationProvider; +import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration; +import org.springframework.security.config.ldap.LdapUserServiceBeanDefinitionParser; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.userdetails.UserDetails; +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; + +@Configuration +@RequiredArgsConstructor +public class ApplicationConfig { + + private final UserRepository repository; + + @Bean + public UserDetailsService userDetailsService() { + return username -> repository.findByEmail(username) + .orElseThrow(() -> new UsernameNotFoundException("User not found")); + } + + @Bean + public AuthenticationProvider authenticationProvider() { + DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider(); + authProvider.setUserDetailsService(userDetailsService()); + authProvider.setPasswordEncoder(passwordEncoder()); + return authProvider; + } + + @Bean + public AuthenticationManager authenticationManager(AuthenticationConfiguration configuration) throws Exception { + return configuration.getAuthenticationManager(); + } + + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } +} diff --git a/backend/src/main/java/com/QuickProject/QuickProjectApp/config/JwtAuthenticationFilter.java b/backend/src/main/java/com/QuickProject/QuickProjectApp/config/JwtAuthenticationFilter.java index 7e2273d..cb8d5fb 100644 --- a/backend/src/main/java/com/QuickProject/QuickProjectApp/config/JwtAuthenticationFilter.java +++ b/backend/src/main/java/com/QuickProject/QuickProjectApp/config/JwtAuthenticationFilter.java @@ -6,6 +6,12 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.context.SecurityContext; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; import org.springframework.stereotype.Component; import org.springframework.web.filter.OncePerRequestFilter; @@ -17,19 +23,39 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter { private final JwtService jwtService; + private final UserDetailsService userDetailsService; + @Override - protected void doFilterInternal(@Nonnull HttpServletRequest request, - @Nonnull HttpServletResponse response, - @Nonnull FilterChain filterChain + protected void doFilterInternal( + @Nonnull HttpServletRequest request, + @Nonnull HttpServletResponse response, + @Nonnull FilterChain filterChain ) throws ServletException, IOException { final String authHeader = request.getHeader("Authorization"); final String jwt; final String userEmail; if (authHeader == null || !authHeader.startsWith("Bearer ")) { - filterChain.doFilter(request,response); + filterChain.doFilter(request, response); return; } jwt = authHeader.substring(7); userEmail = jwtService.extractUsername(jwt); + if (userEmail != null && SecurityContextHolder.getContext().getAuthentication() == null) { + UserDetails userDetails = this.userDetailsService.loadUserByUsername(userEmail); + if (jwtService.isTokenValid(jwt, userDetails)) { + UsernamePasswordAuthenticationToken authToken = new UsernamePasswordAuthenticationToken( + userDetails, + null, + userDetails.getAuthorities() + ); + + authToken.setDetails( + new WebAuthenticationDetailsSource().buildDetails(request) + ); + + SecurityContextHolder.getContext().setAuthentication(authToken); + } + } + filterChain.doFilter(request, response); } } diff --git a/backend/src/main/java/com/QuickProject/QuickProjectApp/config/JwtService.java b/backend/src/main/java/com/QuickProject/QuickProjectApp/config/JwtService.java index 249ffe2..ae82cc0 100644 --- a/backend/src/main/java/com/QuickProject/QuickProjectApp/config/JwtService.java +++ b/backend/src/main/java/com/QuickProject/QuickProjectApp/config/JwtService.java @@ -1,12 +1,74 @@ package com.QuickProject.QuickProjectApp.config; +import io.jsonwebtoken.Claims; + +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; +import io.jsonwebtoken.io.Decoders; +import io.jsonwebtoken.security.Keys; +import org.springframework.security.core.userdetails.UserDetails; import org.springframework.stereotype.Service; +import java.security.Key; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.function.Function; + @Service public class JwtService { + private static final String SECRET_KEY = "96c8f1ee65af9fa52e8f7bf75bb308a866fbaca5db8ee702e911818224f40e77150fc6dcf5e6e03ececdf1631017f7194a2c7fb1fe58226e7bc743b8a7e8127c"; + public String extractUsername(String token) { + return extractClaims(token, Claims::getSubject); + } + + public String generateToken( + Map extraClaims, + UserDetails userDetails + ) { + return Jwts + .builder() + .setClaims(extraClaims) + .setSubject(userDetails.getUsername()) + .setIssuedAt(new Date(System.currentTimeMillis())) + .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 24)) + .signWith(getSignKey(), SignatureAlgorithm.HS256) + .compact(); + } + + public boolean isTokenValid(String token, UserDetails userDetails) { + final String username = extractUsername(token); + return username.equals(userDetails.getUsername()) && !isTokenExpired(token); + } - return null; + private boolean isTokenExpired(String token) { + return extractExpiration(token).before(new Date());} + + private Date extractExpiration(String token) { + return extractClaims(token, Claims::getExpiration); + } + + public T extractClaims(String token, Function claimsResolver) { + final Claims claims = extractAllClaims(token); + return claimsResolver.apply(claims); + } + + public String generateToken(UserDetails userDetails) { + return generateToken(new HashMap<>(), userDetails); + } + + private Claims extractAllClaims(String token) { + return Jwts + .parserBuilder() + .setSigningKey(getSignKey()) + .build() + .parseClaimsJws(token) + .getBody(); + } + private Key getSignKey() { + byte[] keyBytes = Decoders.BASE64.decode(SECRET_KEY); + return Keys.hmacShaKeyFor(keyBytes); } } diff --git a/backend/src/main/java/com/QuickProject/QuickProjectApp/config/SecurityConfiguration.java b/backend/src/main/java/com/QuickProject/QuickProjectApp/config/SecurityConfiguration.java new file mode 100644 index 0000000..756b9d1 --- /dev/null +++ b/backend/src/main/java/com/QuickProject/QuickProjectApp/config/SecurityConfiguration.java @@ -0,0 +1,42 @@ +package com.QuickProject.QuickProjectApp.config; + +import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.authentication.AuthenticationProvider; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; + +@Configuration +@EnableWebSecurity +@RequiredArgsConstructor +public class SecurityConfiguration { + + private final JwtAuthenticationFilter jwtAuthFilter; + private final AuthenticationProvider authenticationProvider; + + @Bean + public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { + + http + .csrf() + .disable() + .authorizeHttpRequests() + .requestMatchers("") + .permitAll() + .anyRequest() + .authenticated() + .and() + .sessionManagement() + .sessionCreationPolicy(SessionCreationPolicy.STATELESS) + .and() + .authenticationProvider(authenticationProvider) + .addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter.class); + + + return http.build(); + } +} From a07c33742358de8c57da27412a67fbc5844d346c Mon Sep 17 00:00:00 2001 From: Elena Radchenko Date: Mon, 11 Mar 2024 22:45:07 +0300 Subject: [PATCH 08/17] added new service --- .../java/auth/AuthenticationController.java | 32 +++++++++++++++++++ .../main/java/auth/AuthenticationRequest.java | 17 ++++++++++ .../java/auth/AuthenticationResponse.java | 15 +++++++++ .../main/java/auth/AuthenticationService.java | 21 ++++++++++++ 4 files changed, 85 insertions(+) create mode 100644 backend/src/main/java/auth/AuthenticationController.java create mode 100644 backend/src/main/java/auth/AuthenticationRequest.java create mode 100644 backend/src/main/java/auth/AuthenticationResponse.java create mode 100644 backend/src/main/java/auth/AuthenticationService.java diff --git a/backend/src/main/java/auth/AuthenticationController.java b/backend/src/main/java/auth/AuthenticationController.java new file mode 100644 index 0000000..70da72f --- /dev/null +++ b/backend/src/main/java/auth/AuthenticationController.java @@ -0,0 +1,32 @@ +package auth; + +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/auth") +@RequiredArgsConstructor +public class AuthenticationController { + + private final AuthenticationService service; + + @PostMapping("/register") + public ResponseEntity register( + @RequestBody RegisterRequest request + ) { + return ResponseEntity.ok(service.register(request)); + } + + + @PostMapping("/authenticate") + public ResponseEntity authenticate( + @RequestBody AuthenticationRequest request + ) { + return ResponseEntity.ok(service.authenticate(request)); + } + +} diff --git a/backend/src/main/java/auth/AuthenticationRequest.java b/backend/src/main/java/auth/AuthenticationRequest.java new file mode 100644 index 0000000..07b0ec6 --- /dev/null +++ b/backend/src/main/java/auth/AuthenticationRequest.java @@ -0,0 +1,17 @@ +package auth; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class AuthenticationRequest { + + private String email; + + private String password; +} diff --git a/backend/src/main/java/auth/AuthenticationResponse.java b/backend/src/main/java/auth/AuthenticationResponse.java new file mode 100644 index 0000000..3de5fbb --- /dev/null +++ b/backend/src/main/java/auth/AuthenticationResponse.java @@ -0,0 +1,15 @@ +package auth; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class AuthenticationResponse { + + private String token; +} diff --git a/backend/src/main/java/auth/AuthenticationService.java b/backend/src/main/java/auth/AuthenticationService.java new file mode 100644 index 0000000..ff40e79 --- /dev/null +++ b/backend/src/main/java/auth/AuthenticationService.java @@ -0,0 +1,21 @@ +package auth; + +import com.QuickProject.QuickProjectApp.dao.UserRepository; +import com.QuickProject.QuickProjectApp.entity.user.User; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class AuthenticationService { + + private final UserRepository repository; + public AuthenticationResponse register(RegisterRequest request) { +var user = User.builder() + . + } + + public AuthenticationResponse authenticate(AuthenticationRequest request) { + return null; + } +} From 600b31fbbb72d60a4a7adc32525ca11f23874b04 Mon Sep 17 00:00:00 2001 From: Elena Radchenko Date: Tue, 12 Mar 2024 00:12:55 +0300 Subject: [PATCH 09/17] added new endpoints - register and authenticate --- .../QuickProjectApp}/auth/AuthenticationController.java | 0 .../QuickProject/QuickProjectApp}/auth/AuthenticationRequest.java | 0 .../QuickProjectApp}/auth/AuthenticationResponse.java | 0 .../QuickProject/QuickProjectApp}/auth/AuthenticationService.java | 0 .../QuickProject/QuickProjectApp}/auth/RegisterRequest.java | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename backend/src/main/java/{ => com/QuickProject/QuickProjectApp}/auth/AuthenticationController.java (100%) rename backend/src/main/java/{ => com/QuickProject/QuickProjectApp}/auth/AuthenticationRequest.java (100%) rename backend/src/main/java/{ => com/QuickProject/QuickProjectApp}/auth/AuthenticationResponse.java (100%) rename backend/src/main/java/{ => com/QuickProject/QuickProjectApp}/auth/AuthenticationService.java (100%) rename backend/src/main/java/{ => com/QuickProject/QuickProjectApp}/auth/RegisterRequest.java (100%) diff --git a/backend/src/main/java/auth/AuthenticationController.java b/backend/src/main/java/com/QuickProject/QuickProjectApp/auth/AuthenticationController.java similarity index 100% rename from backend/src/main/java/auth/AuthenticationController.java rename to backend/src/main/java/com/QuickProject/QuickProjectApp/auth/AuthenticationController.java diff --git a/backend/src/main/java/auth/AuthenticationRequest.java b/backend/src/main/java/com/QuickProject/QuickProjectApp/auth/AuthenticationRequest.java similarity index 100% rename from backend/src/main/java/auth/AuthenticationRequest.java rename to backend/src/main/java/com/QuickProject/QuickProjectApp/auth/AuthenticationRequest.java diff --git a/backend/src/main/java/auth/AuthenticationResponse.java b/backend/src/main/java/com/QuickProject/QuickProjectApp/auth/AuthenticationResponse.java similarity index 100% rename from backend/src/main/java/auth/AuthenticationResponse.java rename to backend/src/main/java/com/QuickProject/QuickProjectApp/auth/AuthenticationResponse.java diff --git a/backend/src/main/java/auth/AuthenticationService.java b/backend/src/main/java/com/QuickProject/QuickProjectApp/auth/AuthenticationService.java similarity index 100% rename from backend/src/main/java/auth/AuthenticationService.java rename to backend/src/main/java/com/QuickProject/QuickProjectApp/auth/AuthenticationService.java diff --git a/backend/src/main/java/auth/RegisterRequest.java b/backend/src/main/java/com/QuickProject/QuickProjectApp/auth/RegisterRequest.java similarity index 100% rename from backend/src/main/java/auth/RegisterRequest.java rename to backend/src/main/java/com/QuickProject/QuickProjectApp/auth/RegisterRequest.java From 8e7e1ff3136085439a14a75852c3bb3fa42ec1bb Mon Sep 17 00:00:00 2001 From: Elena Radchenko Date: Tue, 12 Mar 2024 00:15:26 +0300 Subject: [PATCH 10/17] change folder and added methods for AuthenticationService --- backend/pom.xml | 17 ++------ .../auth/AuthenticationController.java | 2 +- .../auth/AuthenticationRequest.java | 2 +- .../auth/AuthenticationResponse.java | 2 +- .../auth/AuthenticationService.java | 39 +++++++++++++++++-- .../QuickProjectApp/auth/RegisterRequest.java | 4 +- .../config/SecurityConfiguration.java | 2 +- .../QuickProjectApp/entity/user/User.java | 5 +-- 8 files changed, 45 insertions(+), 28 deletions(-) diff --git a/backend/pom.xml b/backend/pom.xml index 056aad1..996728e 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -8,7 +8,8 @@ spring-boot-starter-parent 3.2.2 - + + com.QuickProject QuickProjectApp 0.0.1-SNAPSHOT @@ -31,11 +32,6 @@ spring-boot-starter-web - - org.springframework.boot - spring-boot-starter-data-rest - - org.springframework.boot spring-boot-starter-security @@ -77,12 +73,6 @@ 9.16.0 - - org.postgresql - postgresql - runtime - - org.springframework.boot spring-boot-starter-data-jpa @@ -92,11 +82,10 @@ spring-boot-starter-data-rest - org.postgresql postgresql - 42.7.1 + 42.7.2 diff --git a/backend/src/main/java/com/QuickProject/QuickProjectApp/auth/AuthenticationController.java b/backend/src/main/java/com/QuickProject/QuickProjectApp/auth/AuthenticationController.java index 70da72f..8be048f 100644 --- a/backend/src/main/java/com/QuickProject/QuickProjectApp/auth/AuthenticationController.java +++ b/backend/src/main/java/com/QuickProject/QuickProjectApp/auth/AuthenticationController.java @@ -1,4 +1,4 @@ -package auth; +package com.QuickProject.QuickProjectApp.auth; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; diff --git a/backend/src/main/java/com/QuickProject/QuickProjectApp/auth/AuthenticationRequest.java b/backend/src/main/java/com/QuickProject/QuickProjectApp/auth/AuthenticationRequest.java index 07b0ec6..32bd8eb 100644 --- a/backend/src/main/java/com/QuickProject/QuickProjectApp/auth/AuthenticationRequest.java +++ b/backend/src/main/java/com/QuickProject/QuickProjectApp/auth/AuthenticationRequest.java @@ -1,4 +1,4 @@ -package auth; +package com.QuickProject.QuickProjectApp.auth; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/backend/src/main/java/com/QuickProject/QuickProjectApp/auth/AuthenticationResponse.java b/backend/src/main/java/com/QuickProject/QuickProjectApp/auth/AuthenticationResponse.java index 3de5fbb..8e9c215 100644 --- a/backend/src/main/java/com/QuickProject/QuickProjectApp/auth/AuthenticationResponse.java +++ b/backend/src/main/java/com/QuickProject/QuickProjectApp/auth/AuthenticationResponse.java @@ -1,4 +1,4 @@ -package auth; +package com.QuickProject.QuickProjectApp.auth; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/backend/src/main/java/com/QuickProject/QuickProjectApp/auth/AuthenticationService.java b/backend/src/main/java/com/QuickProject/QuickProjectApp/auth/AuthenticationService.java index ff40e79..ce144a7 100644 --- a/backend/src/main/java/com/QuickProject/QuickProjectApp/auth/AuthenticationService.java +++ b/backend/src/main/java/com/QuickProject/QuickProjectApp/auth/AuthenticationService.java @@ -1,8 +1,13 @@ -package auth; +package com.QuickProject.QuickProjectApp.auth; +import com.QuickProject.QuickProjectApp.config.JwtService; import com.QuickProject.QuickProjectApp.dao.UserRepository; +import com.QuickProject.QuickProjectApp.entity.user.Role; import com.QuickProject.QuickProjectApp.entity.user.User; import lombok.RequiredArgsConstructor; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; @Service @@ -10,12 +15,38 @@ public class AuthenticationService { private final UserRepository repository; + + private final JwtService jwtService; + + private final PasswordEncoder passwordEncoder; + + private final AuthenticationManager authenticationManager; + public AuthenticationResponse register(RegisterRequest request) { -var user = User.builder() - . + var user = User.builder() + .nickname(request.getNickname()) + .email(request.getEmail()) + .password(passwordEncoder.encode(request.getPassword())) + .userRole(Role.USER) + .build(); + repository.save(user); + var jwtToken = jwtService.generateToken(user); + return AuthenticationResponse.builder() + .token(jwtToken) + .build(); } public AuthenticationResponse authenticate(AuthenticationRequest request) { - return null; + authenticationManager.authenticate( + new UsernamePasswordAuthenticationToken( + request.getEmail(), + request.getPassword() + ) + ); + var user = repository.findByEmail(request.getEmail()).orElseThrow(); + var jwtToken = jwtService.generateToken(user); + return AuthenticationResponse.builder() + .token(jwtToken) + .build(); } } diff --git a/backend/src/main/java/com/QuickProject/QuickProjectApp/auth/RegisterRequest.java b/backend/src/main/java/com/QuickProject/QuickProjectApp/auth/RegisterRequest.java index 7e88bed..bdf2905 100644 --- a/backend/src/main/java/com/QuickProject/QuickProjectApp/auth/RegisterRequest.java +++ b/backend/src/main/java/com/QuickProject/QuickProjectApp/auth/RegisterRequest.java @@ -1,4 +1,4 @@ -package auth; +package com.QuickProject.QuickProjectApp.auth; import lombok.AllArgsConstructor; @@ -12,7 +12,7 @@ @NoArgsConstructor public class RegisterRequest { - private String firstname; + private String nickname; private String email; diff --git a/backend/src/main/java/com/QuickProject/QuickProjectApp/config/SecurityConfiguration.java b/backend/src/main/java/com/QuickProject/QuickProjectApp/config/SecurityConfiguration.java index 756b9d1..4063893 100644 --- a/backend/src/main/java/com/QuickProject/QuickProjectApp/config/SecurityConfiguration.java +++ b/backend/src/main/java/com/QuickProject/QuickProjectApp/config/SecurityConfiguration.java @@ -25,7 +25,7 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti .csrf() .disable() .authorizeHttpRequests() - .requestMatchers("") + .requestMatchers("/api/auth/**") .permitAll() .anyRequest() .authenticated() diff --git a/backend/src/main/java/com/QuickProject/QuickProjectApp/entity/user/User.java b/backend/src/main/java/com/QuickProject/QuickProjectApp/entity/user/User.java index 2271bda..dae6cd8 100644 --- a/backend/src/main/java/com/QuickProject/QuickProjectApp/entity/user/User.java +++ b/backend/src/main/java/com/QuickProject/QuickProjectApp/entity/user/User.java @@ -31,10 +31,7 @@ public class User implements UserDetails { @Id @Column(name = "id") private UUID id = UUID.randomUUID(); - - @Column(name = "login") - private String login; - + @Column(name = "nickname") private String nickname; From e068d2f68beea608308a693e17ccfbefd426b09b Mon Sep 17 00:00:00 2001 From: Elena Radchenko Date: Tue, 12 Mar 2024 00:24:33 +0300 Subject: [PATCH 11/17] added correction to Dockerfile --- backend/Dockerfile | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/backend/Dockerfile b/backend/Dockerfile index d9eef7e..d83eca3 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -1,4 +1,3 @@ -# Stage 1: Сборка приложения FROM maven:3.8.3-openjdk-17 AS build WORKDIR /app COPY pom.xml . @@ -7,8 +6,7 @@ COPY src/ /app/src/ RUN mvn package -Dmaven.test.skip=true # Stage 2: Создание финального образа -#FROM openjdk:11 -#WORKDIR /app -#COPY --from=build /app/target/QuickProjectApp.jar /app/QuickProjectApp.jar -#CMD ["java", "-jar", "QuickProjectApp.jar"] - +FROM openjdk:17 +WORKDIR /app +COPY --from=build /app/target/QuickProjectApp-0.0.1-SNAPSHOT.jar /app/QuickProjectApp.jar +CMD ["java", "-jar", "QuickProjectApp.jar"] \ No newline at end of file From 47126545cc473fc40a68d94f7be6fdf4d96b5476 Mon Sep 17 00:00:00 2001 From: Aleksey Lugovoy Date: Wed, 13 Mar 2024 22:52:33 +0300 Subject: [PATCH 12/17] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BF=D0=BE=D0=BB=D0=B5=20user=5Frole=20=D0=B2=20?= =?UTF-8?q?=D1=82=D0=B0=D0=B1=D0=BB=D0=B8=D1=86=D1=83=20users?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../QuickProjectApp/auth/AuthenticationService.java | 2 +- .../com/QuickProject/QuickProjectApp/entity/user/User.java | 3 ++- backend/src/main/resources/db/migration/V1__Init.sql | 3 +++ .../com/QuickProject/QuickProjectApp/UserRepositoyTest.java | 2 +- 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/backend/src/main/java/com/QuickProject/QuickProjectApp/auth/AuthenticationService.java b/backend/src/main/java/com/QuickProject/QuickProjectApp/auth/AuthenticationService.java index ce144a7..a9b1414 100644 --- a/backend/src/main/java/com/QuickProject/QuickProjectApp/auth/AuthenticationService.java +++ b/backend/src/main/java/com/QuickProject/QuickProjectApp/auth/AuthenticationService.java @@ -27,7 +27,7 @@ public AuthenticationResponse register(RegisterRequest request) { .nickname(request.getNickname()) .email(request.getEmail()) .password(passwordEncoder.encode(request.getPassword())) - .userRole(Role.USER) + .anotherRole(Role.USER) .build(); repository.save(user); var jwtToken = jwtService.generateToken(user); diff --git a/backend/src/main/java/com/QuickProject/QuickProjectApp/entity/user/User.java b/backend/src/main/java/com/QuickProject/QuickProjectApp/entity/user/User.java index dae6cd8..6cedc63 100644 --- a/backend/src/main/java/com/QuickProject/QuickProjectApp/entity/user/User.java +++ b/backend/src/main/java/com/QuickProject/QuickProjectApp/entity/user/User.java @@ -50,7 +50,8 @@ public class User implements UserDetails { @Column(name = "user_role") @Enumerated(EnumType.STRING) private Role role; - Role userRole = Role.USER; + + Role anotherRole = Role.USER; @Column(name = "created_at") private LocalDateTime created_at; diff --git a/backend/src/main/resources/db/migration/V1__Init.sql b/backend/src/main/resources/db/migration/V1__Init.sql index fe858bb..11def93 100644 --- a/backend/src/main/resources/db/migration/V1__Init.sql +++ b/backend/src/main/resources/db/migration/V1__Init.sql @@ -1,3 +1,5 @@ +CREATE TYPE role AS ENUM ('USER', 'ADMIN'); + create table if not exists users ( id uuid not null primary key, @@ -9,6 +11,7 @@ create table if not exists users created_at timestamp not null, enable boolean not null default true, project_role varchar(300), + user_role role, photo bytea ); diff --git a/backend/src/test/java/com/QuickProject/QuickProjectApp/UserRepositoyTest.java b/backend/src/test/java/com/QuickProject/QuickProjectApp/UserRepositoyTest.java index d0a5429..bac54eb 100644 --- a/backend/src/test/java/com/QuickProject/QuickProjectApp/UserRepositoyTest.java +++ b/backend/src/test/java/com/QuickProject/QuickProjectApp/UserRepositoyTest.java @@ -29,6 +29,6 @@ void saveProject(){ user.setTz("+3"); repository.saveAndFlush(user); - assertThat(repository.findByEmail("test_user@test.com").get(0).getEmail()).isEqualTo("test_user@test.com"); + assertThat(repository.findByEmail("test_user@test.com").get().getEmail()).isEqualTo("test_user@test.com"); } } From 18d5742d87f21a5674deac4b1158fd8bfd177307 Mon Sep 17 00:00:00 2001 From: Elena Radchenko Date: Sat, 16 Mar 2024 21:35:43 +0300 Subject: [PATCH 13/17] some changes to autheticate --- .../auth/AuthenticationRequest.java | 2 ++ .../auth/AuthenticationService.java | 6 ++-- .../QuickProjectApp/auth/RegisterRequest.java | 13 ++++++-- .../config/SecurityConfiguration.java | 33 +++++++++++-------- .../QuickProjectApp/entity/user/User.java | 11 ++++--- 5 files changed, 43 insertions(+), 22 deletions(-) diff --git a/backend/src/main/java/com/QuickProject/QuickProjectApp/auth/AuthenticationRequest.java b/backend/src/main/java/com/QuickProject/QuickProjectApp/auth/AuthenticationRequest.java index 32bd8eb..00a3ea1 100644 --- a/backend/src/main/java/com/QuickProject/QuickProjectApp/auth/AuthenticationRequest.java +++ b/backend/src/main/java/com/QuickProject/QuickProjectApp/auth/AuthenticationRequest.java @@ -5,6 +5,8 @@ import lombok.Data; import lombok.NoArgsConstructor; +import java.util.UUID; + @Data @Builder @AllArgsConstructor diff --git a/backend/src/main/java/com/QuickProject/QuickProjectApp/auth/AuthenticationService.java b/backend/src/main/java/com/QuickProject/QuickProjectApp/auth/AuthenticationService.java index a9b1414..148670e 100644 --- a/backend/src/main/java/com/QuickProject/QuickProjectApp/auth/AuthenticationService.java +++ b/backend/src/main/java/com/QuickProject/QuickProjectApp/auth/AuthenticationService.java @@ -24,10 +24,12 @@ public class AuthenticationService { public AuthenticationResponse register(RegisterRequest request) { var user = User.builder() - .nickname(request.getNickname()) .email(request.getEmail()) .password(passwordEncoder.encode(request.getPassword())) - .anotherRole(Role.USER) + .role(Role.USER) + .created_at(request.getCreated_at()) + .enable(request.isEnable()) + .tz(request.getTz()) .build(); repository.save(user); var jwtToken = jwtService.generateToken(user); diff --git a/backend/src/main/java/com/QuickProject/QuickProjectApp/auth/RegisterRequest.java b/backend/src/main/java/com/QuickProject/QuickProjectApp/auth/RegisterRequest.java index bdf2905..b25ebf1 100644 --- a/backend/src/main/java/com/QuickProject/QuickProjectApp/auth/RegisterRequest.java +++ b/backend/src/main/java/com/QuickProject/QuickProjectApp/auth/RegisterRequest.java @@ -1,20 +1,29 @@ package com.QuickProject.QuickProjectApp.auth; +import com.QuickProject.QuickProjectApp.entity.user.Role; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import java.time.LocalDateTime; + @Data @Builder @AllArgsConstructor @NoArgsConstructor public class RegisterRequest { - private String nickname; - private String email; private String password; + + private LocalDateTime created_at; + + private boolean enable; + + private String tz; + + private final Role user_role = Role.USER; } diff --git a/backend/src/main/java/com/QuickProject/QuickProjectApp/config/SecurityConfiguration.java b/backend/src/main/java/com/QuickProject/QuickProjectApp/config/SecurityConfiguration.java index 4063893..7f8772d 100644 --- a/backend/src/main/java/com/QuickProject/QuickProjectApp/config/SecurityConfiguration.java +++ b/backend/src/main/java/com/QuickProject/QuickProjectApp/config/SecurityConfiguration.java @@ -6,10 +6,12 @@ import org.springframework.security.authentication.AuthenticationProvider; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; -import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; +import static org.springframework.security.config.http.SessionCreationPolicy.STATELESS; + @Configuration @EnableWebSecurity @RequiredArgsConstructor @@ -18,25 +20,30 @@ public class SecurityConfiguration { private final JwtAuthenticationFilter jwtAuthFilter; private final AuthenticationProvider authenticationProvider; + private static final String[] WHITE_LIST_URL = {"/api/auth/**", + "/api/users", + "/api/projects", + "/api/journal", + "/api/queue", + "/api/projects_roles"}; + @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http - .csrf() - .disable() - .authorizeHttpRequests() - .requestMatchers("/api/auth/**") - .permitAll() - .anyRequest() - .authenticated() - .and() - .sessionManagement() - .sessionCreationPolicy(SessionCreationPolicy.STATELESS) - .and() + .csrf(AbstractHttpConfigurer::disable) + .authorizeHttpRequests(req -> + req.requestMatchers(WHITE_LIST_URL) + .permitAll() + .anyRequest() + .authenticated()) + .sessionManagement(session -> session.sessionCreationPolicy(STATELESS)) .authenticationProvider(authenticationProvider) .addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter.class); - return http.build(); } } + + + diff --git a/backend/src/main/java/com/QuickProject/QuickProjectApp/entity/user/User.java b/backend/src/main/java/com/QuickProject/QuickProjectApp/entity/user/User.java index 6cedc63..60fa02c 100644 --- a/backend/src/main/java/com/QuickProject/QuickProjectApp/entity/user/User.java +++ b/backend/src/main/java/com/QuickProject/QuickProjectApp/entity/user/User.java @@ -7,6 +7,7 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import org.hibernate.annotations.UuidGenerator; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; @@ -30,8 +31,9 @@ public class User implements UserDetails { @Id @Column(name = "id") - private UUID id = UUID.randomUUID(); - + @UuidGenerator + private UUID id; + @Column(name = "nickname") private String nickname; @@ -49,9 +51,8 @@ public class User implements UserDetails { @Column(name = "user_role") @Enumerated(EnumType.STRING) - private Role role; - - Role anotherRole = Role.USER; + @Builder.Default + Role role = Role.USER; @Column(name = "created_at") private LocalDateTime created_at; From 0f0fa0a1823a80cc07cc9fdd9c53adf91471772e Mon Sep 17 00:00:00 2001 From: Elena Radchenko Date: Sat, 16 Mar 2024 21:36:08 +0300 Subject: [PATCH 14/17] add extra field to script --- backend/src/main/resources/db/migration/V1__Init.sql | 6 ++---- .../src/main/resources/db/migration/V3__Insert_Users.sql | 6 +++--- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/backend/src/main/resources/db/migration/V1__Init.sql b/backend/src/main/resources/db/migration/V1__Init.sql index 11def93..7ded9a3 100644 --- a/backend/src/main/resources/db/migration/V1__Init.sql +++ b/backend/src/main/resources/db/migration/V1__Init.sql @@ -1,5 +1,3 @@ -CREATE TYPE role AS ENUM ('USER', 'ADMIN'); - create table if not exists users ( id uuid not null primary key, @@ -7,11 +5,11 @@ create table if not exists users email varchar(100) not null unique, telegram varchar(100) unique, phone varchar(15) unique, - password varchar(30) not null, + password varchar(80) not null, created_at timestamp not null, enable boolean not null default true, project_role varchar(300), - user_role role, + user_role not null varchar(200), photo bytea ); diff --git a/backend/src/main/resources/db/migration/V3__Insert_Users.sql b/backend/src/main/resources/db/migration/V3__Insert_Users.sql index 05a4c12..dbd6a80 100644 --- a/backend/src/main/resources/db/migration/V3__Insert_Users.sql +++ b/backend/src/main/resources/db/migration/V3__Insert_Users.sql @@ -1,7 +1,7 @@ -INSERT INTO users (id, email, password, created_at, project_role) +INSERT INTO users (id, email, password, created_at, project_role, user_role) VALUES - ('223e4567-e89b-12d3-a456-426614174000', 'test@test.com', '12345678', NOW(), 'Программист'), - ('223e4567-e89b-12d3-a456-426614174001', 'designer@test.com', '123', NOW(), 'Дизайнер'); + ('223e4567-e89b-12d3-a456-426614174000', 'test@test.com', '123', NOW(), 'Программист', USER), + ('223e4567-e89b-12d3-a456-426614174001', 'designer@test.com', '123', NOW(), 'Дизайнер', USER); INSERT INTO projects (id, creator_id, name, description, enable, created_at) VALUES From 68932e28b037f495b0b190bfdb8e046454e1c9d5 Mon Sep 17 00:00:00 2001 From: Elena Radchenko Date: Sat, 16 Mar 2024 21:36:18 +0300 Subject: [PATCH 15/17] add postman_file --- backend/QuickProject.postman_collection.json | 42 ++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 backend/QuickProject.postman_collection.json diff --git a/backend/QuickProject.postman_collection.json b/backend/QuickProject.postman_collection.json new file mode 100644 index 0000000..a0847ce --- /dev/null +++ b/backend/QuickProject.postman_collection.json @@ -0,0 +1,42 @@ +{ + "info": { + "_postman_id": "71a90115-759d-4f6b-93e0-a28d0c86f1fd", + "name": "QuickProject", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", + "_exporter_id": "29891838" + }, + "item": [ + { + "name": "auth/register", + "request": { + "method": "GET", + "header": [] + }, + "response": [] + }, + { + "name": "New Request", + "request": { + "method": "GET", + "header": [] + }, + "response": [] + }, + { + "name": "New Request", + "request": { + "method": "GET", + "header": [] + }, + "response": [] + }, + { + "name": "New Request", + "request": { + "method": "GET", + "header": [] + }, + "response": [] + } + ] +} \ No newline at end of file From 6b156f52d7f4d307e51ae66776e3bc792d55b84f Mon Sep 17 00:00:00 2001 From: Elena Radchenko Date: Sun, 17 Mar 2024 10:57:24 +0300 Subject: [PATCH 16/17] changed postman file --- backend/QuickProject.postman_collection.json | 86 ++++++++++++++++++-- 1 file changed, 80 insertions(+), 6 deletions(-) diff --git a/backend/QuickProject.postman_collection.json b/backend/QuickProject.postman_collection.json index a0847ce..cf9b242 100644 --- a/backend/QuickProject.postman_collection.json +++ b/backend/QuickProject.postman_collection.json @@ -9,24 +9,86 @@ { "name": "auth/register", "request": { - "method": "GET", - "header": [] + "auth": { + "type": "noauth" + }, + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\r\n \"email\" : \"ela@mail.ru\",\r\n \"password\" : \"1\",\r\n \"created_at\": \"2024-03-22T18:00:00\",\r\n \"tz\" : \"+3\",\r\n \"enable\" : true\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://localhost:8081/api/auth/register", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "8081", + "path": [ + "api", + "auth", + "register" + ] + } }, "response": [] }, { "name": "New Request", "request": { - "method": "GET", - "header": [] + "method": "POST", + "header": [], + "body": { + "mode": "raw", + "raw": "{\r\n \"email\" : \"ela@mail.ru\",\r\n \"password\" : \"1\"\r\n}", + "options": { + "raw": { + "language": "json" + } + } + }, + "url": { + "raw": "http://localhost:8081/api/auth/authenticate", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "8081", + "path": [ + "api", + "auth", + "authenticate" + ] + } }, "response": [] }, { "name": "New Request", "request": { + "auth": { + "type": "noauth" + }, "method": "GET", - "header": [] + "header": [], + "url": { + "raw": "http://localhost:8081/api/users", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "8081", + "path": [ + "api", + "users" + ] + } }, "response": [] }, @@ -34,7 +96,19 @@ "name": "New Request", "request": { "method": "GET", - "header": [] + "header": [], + "url": { + "raw": "http://localhost:8081/api/projects", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "8081", + "path": [ + "api", + "projects" + ] + } }, "response": [] } From 0a2b9506c3b90446d8bbdb335d0395c9d46ab223 Mon Sep 17 00:00:00 2001 From: Elena Radchenko Date: Sat, 23 Mar 2024 21:18:27 +0300 Subject: [PATCH 17/17] added changes to script --- .../com/QuickProject/QuickProjectApp/dao/UserRepository.java | 2 -- .../com/QuickProject/QuickProjectApp/entity/user/Role.java | 3 ++- backend/src/main/resources/db/migration/V1__Init.sql | 4 +++- backend/src/main/resources/db/migration/V3__Insert_Users.sql | 4 ++-- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/backend/src/main/java/com/QuickProject/QuickProjectApp/dao/UserRepository.java b/backend/src/main/java/com/QuickProject/QuickProjectApp/dao/UserRepository.java index acf1b74..bf9740d 100644 --- a/backend/src/main/java/com/QuickProject/QuickProjectApp/dao/UserRepository.java +++ b/backend/src/main/java/com/QuickProject/QuickProjectApp/dao/UserRepository.java @@ -17,6 +17,4 @@ public interface UserRepository extends JpaRepository { @Transactional(readOnly = true) Optional findByEmail(String email) throws DataAccessException; - - } diff --git a/backend/src/main/java/com/QuickProject/QuickProjectApp/entity/user/Role.java b/backend/src/main/java/com/QuickProject/QuickProjectApp/entity/user/Role.java index 86f9654..219ebb6 100644 --- a/backend/src/main/java/com/QuickProject/QuickProjectApp/entity/user/Role.java +++ b/backend/src/main/java/com/QuickProject/QuickProjectApp/entity/user/Role.java @@ -1,5 +1,6 @@ package com.QuickProject.QuickProjectApp.entity.user; public enum Role { - USER + USER, + ADMIN } diff --git a/backend/src/main/resources/db/migration/V1__Init.sql b/backend/src/main/resources/db/migration/V1__Init.sql index 7ded9a3..24f23c1 100644 --- a/backend/src/main/resources/db/migration/V1__Init.sql +++ b/backend/src/main/resources/db/migration/V1__Init.sql @@ -1,3 +1,5 @@ +CREATE TYPE role AS ENUM ('USER', 'ADMIN'); + create table if not exists users ( id uuid not null primary key, @@ -9,7 +11,7 @@ create table if not exists users created_at timestamp not null, enable boolean not null default true, project_role varchar(300), - user_role not null varchar(200), + user_role role not null, photo bytea ); diff --git a/backend/src/main/resources/db/migration/V3__Insert_Users.sql b/backend/src/main/resources/db/migration/V3__Insert_Users.sql index dbd6a80..86bb57f 100644 --- a/backend/src/main/resources/db/migration/V3__Insert_Users.sql +++ b/backend/src/main/resources/db/migration/V3__Insert_Users.sql @@ -1,7 +1,7 @@ INSERT INTO users (id, email, password, created_at, project_role, user_role) VALUES - ('223e4567-e89b-12d3-a456-426614174000', 'test@test.com', '123', NOW(), 'Программист', USER), - ('223e4567-e89b-12d3-a456-426614174001', 'designer@test.com', '123', NOW(), 'Дизайнер', USER); + ('223e4567-e89b-12d3-a456-426614174000', 'test@test.com', '123', NOW(), 'Программист', 'USER'), + ('223e4567-e89b-12d3-a456-426614174001', 'designer@test.com', '123', NOW(), 'Дизайнер', 'USER'); INSERT INTO projects (id, creator_id, name, description, enable, created_at) VALUES