From 5f2523496272c47209d6cdc4bd4edc9c6df6ab12 Mon Sep 17 00:00:00 2001 From: Sergey Krylov Date: Mon, 23 Feb 2026 16:14:34 +0300 Subject: [PATCH] feat: add authorization --- media/profiles/2/images.jpeg | Bin 0 -> 5836 bytes resources/WEB-INF/jsp/header.jsp | 40 ++++++++++++--- resources/WEB-INF/jsp/login.jsp | 43 ++++++++++++++++ .../back/controller/ContentController.java | 5 +- ...roller.java => CredentialsController.java} | 10 +--- .../back/controller/LoginController.java | 46 ++++++++++++++++++ .../back/controller/LogoutController.java | 24 +++++++++ .../back/controller/filter/AuthFilter.java | 43 ++++++++++++++++ src/ru/charm/back/dao/ProfileDao.java | 9 ++++ src/ru/charm/back/dto/LoginDto.java | 9 ++++ src/ru/charm/back/dto/ProfileGetDto.java | 25 ++++++---- .../mapper/ProfileToProfileGetDtoMapper.java | 1 + .../RegistrationDtoToProfileMapper.java | 2 + .../back/mapper/RequestToLoginDtoMapper.java | 29 +++++++++++ src/ru/charm/back/model/Profile.java | 1 + src/ru/charm/back/model/Role.java | 6 +++ src/ru/charm/back/service/ProfileService.java | 7 +++ 17 files changed, 274 insertions(+), 26 deletions(-) create mode 100644 media/profiles/2/images.jpeg create mode 100644 resources/WEB-INF/jsp/login.jsp rename src/ru/charm/back/controller/{EmailController.java => CredentialsController.java} (88%) create mode 100644 src/ru/charm/back/controller/LoginController.java create mode 100644 src/ru/charm/back/controller/LogoutController.java create mode 100644 src/ru/charm/back/controller/filter/AuthFilter.java create mode 100644 src/ru/charm/back/dto/LoginDto.java create mode 100644 src/ru/charm/back/mapper/RequestToLoginDtoMapper.java create mode 100644 src/ru/charm/back/model/Role.java diff --git a/media/profiles/2/images.jpeg b/media/profiles/2/images.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..78f170fc57e0cab5a13391310ea215a74354cf5d GIT binary patch literal 5836 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 +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
-

Charm <3

-
- - -
-
+ + + + + + + +
+ + +
+ +
+
+
+ +
+
+ + + + +
+ +
+
+
+
\ No newline at end of file diff --git a/resources/WEB-INF/jsp/login.jsp b/resources/WEB-INF/jsp/login.jsp new file mode 100644 index 0000000..dc1db52 --- /dev/null +++ b/resources/WEB-INF/jsp/login.jsp @@ -0,0 +1,43 @@ +<%@ page contentType="text/html;charset=UTF-8" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> + + + Charm Login + <%@ include file="style.html" %> + + + <%@ include file="header.jsp" %> +
+
+ + + + + + + + + +

${wordBundle.getWord("email")}

${wordBundle.getWord("password")}

+ + + + + +
+ + + +
+
+
+ + ${wordBundle.getWord(error)} +
+
+
+
+ <%@ include file="footer.jsp" %> + + \ No newline at end of file diff --git a/src/ru/charm/back/controller/ContentController.java b/src/ru/charm/back/controller/ContentController.java index 0d750ad..3756711 100644 --- a/src/ru/charm/back/controller/ContentController.java +++ b/src/ru/charm/back/controller/ContentController.java @@ -21,10 +21,11 @@ public class ContentController extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { try { - String contentPath = req.getRequestURI().replace("/content/", ""); + String contentPath = req.getRequestURI().replace("/content", ""); + log.info("Content download request: {} {}", req.getRequestURI(), contentPath); resp.setContentType("application/octet-stream"); service.download(contentPath, resp.getOutputStream()); - log.info("Content successfully downloaded: {}", contentPath); + log.info("Content successfully downloaded: {}", req); } catch (IOException e) { log.error("Content download failed: {}", e.getMessage()); resp.sendError(SC_NOT_FOUND); diff --git a/src/ru/charm/back/controller/EmailController.java b/src/ru/charm/back/controller/CredentialsController.java similarity index 88% rename from src/ru/charm/back/controller/EmailController.java rename to src/ru/charm/back/controller/CredentialsController.java index 400b3df..cbe5b2d 100644 --- a/src/ru/charm/back/controller/EmailController.java +++ b/src/ru/charm/back/controller/CredentialsController.java @@ -7,27 +7,21 @@ import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import ru.charm.back.controller.filter.ErrorFilter; import ru.charm.back.dto.ProfileGetDto; import ru.charm.back.dto.ProfileUpdateDto; import ru.charm.back.mapper.RequestToProfileUpdateDtoMapper; -import ru.charm.back.model.Gender; -import ru.charm.back.model.Profile; import ru.charm.back.model.exception.DuplicateEmailException; import ru.charm.back.service.ProfileService; import java.io.IOException; -import java.time.LocalDate; import java.util.Optional; import static jakarta.servlet.http.HttpServletResponse.SC_BAD_REQUEST; -@WebServlet("/email") +@WebServlet("/credentials") @Slf4j @MultipartConfig -public class EmailController extends HttpServlet { +public class CredentialsController extends HttpServlet { private final ProfileService service = ProfileService.getInstance(); private final RequestToProfileUpdateDtoMapper requestToProfileUpdateDtoMapper = RequestToProfileUpdateDtoMapper.getInstance(); diff --git a/src/ru/charm/back/controller/LoginController.java b/src/ru/charm/back/controller/LoginController.java new file mode 100644 index 0000000..a334588 --- /dev/null +++ b/src/ru/charm/back/controller/LoginController.java @@ -0,0 +1,46 @@ +package ru.charm.back.controller; + +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import ru.charm.back.dto.LoginDto; +import ru.charm.back.dto.ProfileGetDto; +import ru.charm.back.dto.RegistrationDto; +import ru.charm.back.mapper.RequestToLoginDtoMapper; +import ru.charm.back.mapper.RequestToRegistrationDtoMapper; +import ru.charm.back.service.ProfileService; +import ru.charm.back.validator.RegistrationValidator; +import ru.charm.back.validator.ValidationResult; + +import java.io.IOException; +import java.util.Optional; + +@WebServlet("/login") +@Slf4j +public class LoginController extends HttpServlet { + private final ProfileService service = ProfileService.getInstance(); + + private final RequestToLoginDtoMapper requestTologinDtoMapper = RequestToLoginDtoMapper.getInstance(); + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + req.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(req, resp); + } + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException { + LoginDto dto = requestTologinDtoMapper.map(req); + Optional userDetailOpt = service.login(dto); + + if (userDetailOpt.isPresent()) { + req.getSession().setAttribute("userDetails", userDetailOpt.get()); + + resp.sendRedirect(String.format("/profile?id=%s", userDetailOpt.get().getId())); + return; + } + resp.sendRedirect("/login"); + } +} diff --git a/src/ru/charm/back/controller/LogoutController.java b/src/ru/charm/back/controller/LogoutController.java new file mode 100644 index 0000000..787c7d4 --- /dev/null +++ b/src/ru/charm/back/controller/LogoutController.java @@ -0,0 +1,24 @@ +package ru.charm.back.controller; + +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import ru.charm.back.dto.LoginDto; +import ru.charm.back.dto.ProfileGetDto; +import ru.charm.back.mapper.RequestToLoginDtoMapper; +import ru.charm.back.service.ProfileService; + +import java.io.IOException; +import java.util.Optional; + +@WebServlet("/logout") +public class LogoutController extends HttpServlet { + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException { + req.getSession().invalidate(); + resp.sendRedirect("/login"); + } +} diff --git a/src/ru/charm/back/controller/filter/AuthFilter.java b/src/ru/charm/back/controller/filter/AuthFilter.java new file mode 100644 index 0000000..ece1e18 --- /dev/null +++ b/src/ru/charm/back/controller/filter/AuthFilter.java @@ -0,0 +1,43 @@ +package ru.charm.back.controller.filter; + +import jakarta.servlet.*; +import jakarta.servlet.annotation.WebFilter; +import jakarta.servlet.http.Cookie; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import ru.charm.back.dto.ProfileGetDto; +import ru.charm.back.model.Role; +import ru.charm.back.service.WordBundle; + +import java.io.IOException; +import java.util.Arrays; +import java.util.Set; + +@WebFilter("/*") +@Slf4j +public class AuthFilter implements Filter { + private final Set PRIVATE_PATHS = Set.of("/profile", "/credentials"); + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { + HttpServletRequest req = (HttpServletRequest) servletRequest; + HttpServletResponse res = (HttpServletResponse) servletResponse; + + if (PRIVATE_PATHS.contains(req.getRequestURI())) { + ProfileGetDto userDetails = (ProfileGetDto) req.getSession().getAttribute("userDetails"); + log.info("User {} is trying to access {}", userDetails, req.getRequestURI()); + if (userDetails == null) { + res.sendError(HttpServletResponse.SC_UNAUTHORIZED); + } else if (userDetails.getRole() == Role.ADMIN || userDetails.getId().toString().equals( req.getParameter("id"))) { + filterChain.doFilter(req, res); + } else { + res.sendError(HttpServletResponse.SC_FORBIDDEN); + } + + } else { + filterChain.doFilter(req, res); + + } + } +} diff --git a/src/ru/charm/back/dao/ProfileDao.java b/src/ru/charm/back/dao/ProfileDao.java index c74329b..5a31d63 100644 --- a/src/ru/charm/back/dao/ProfileDao.java +++ b/src/ru/charm/back/dao/ProfileDao.java @@ -2,6 +2,7 @@ package ru.charm.back.dao; import ru.charm.back.model.Gender; import ru.charm.back.model.Profile; +import ru.charm.back.model.Role; import ru.charm.back.model.Status; import java.time.LocalDate; @@ -32,6 +33,7 @@ public class ProfileDao { profile.setAbout("I am QA"); profile.setGender(Gender.MALE); profile.setStatus(Status.ACTIVE); + profile.setRole(Role.ADMIN); this.storage.put(1L, profile); Profile profile1 = new Profile(); profile1.setId(2L); @@ -43,6 +45,7 @@ public class ProfileDao { profile1.setAbout("I am Java Dev"); profile1.setGender(Gender.FEMALE); profile1.setStatus(Status.INACTIVE); + profile1.setRole(Role.USER); this.storage.put(2L, profile1); this.idStorage = new AtomicLong(3L); } @@ -80,4 +83,10 @@ public class ProfileDao { public Set getAllEmails() { return storage.values().stream().map(Profile::getEmail).collect(Collectors.toSet()); } + + public Optional findByEmail(String email) { + if (email == null) return Optional.empty(); + + return storage.values().stream().filter(profile -> profile.getEmail().equals(email)).findFirst(); + } } diff --git a/src/ru/charm/back/dto/LoginDto.java b/src/ru/charm/back/dto/LoginDto.java new file mode 100644 index 0000000..18ad387 --- /dev/null +++ b/src/ru/charm/back/dto/LoginDto.java @@ -0,0 +1,9 @@ +package ru.charm.back.dto; + +import lombok.Data; + +@Data +public class LoginDto { + private String email; + private String password; +} diff --git a/src/ru/charm/back/dto/ProfileGetDto.java b/src/ru/charm/back/dto/ProfileGetDto.java index 0faf33a..2fb1c1f 100644 --- a/src/ru/charm/back/dto/ProfileGetDto.java +++ b/src/ru/charm/back/dto/ProfileGetDto.java @@ -1,21 +1,26 @@ package ru.charm.back.dto; +import lombok.AccessLevel; import lombok.Data; +import lombok.experimental.FieldDefaults; import ru.charm.back.model.Gender; +import ru.charm.back.model.Role; import ru.charm.back.model.Status; import java.time.LocalDate; @Data +@FieldDefaults(level = AccessLevel.PRIVATE) public class ProfileGetDto { - private Long id; - private String email; - private String name; - private String surname; - private LocalDate birthDate; - private Integer age; - private String about; - private Gender gender; - private Status status; - private String photo; + Long id; + String email; + String name; + String surname; + LocalDate birthDate; + Integer age; + String about; + Gender gender; + Status status; + String photo; + Role role; } diff --git a/src/ru/charm/back/mapper/ProfileToProfileGetDtoMapper.java b/src/ru/charm/back/mapper/ProfileToProfileGetDtoMapper.java index dab99a5..f51f55e 100644 --- a/src/ru/charm/back/mapper/ProfileToProfileGetDtoMapper.java +++ b/src/ru/charm/back/mapper/ProfileToProfileGetDtoMapper.java @@ -37,6 +37,7 @@ public class ProfileToProfileGetDtoMapper implements Mapper { @@ -25,6 +26,7 @@ public class RegistrationDtoToProfileMapper implements Mapper { + + private static final RequestToLoginDtoMapper INSTANCE = new RequestToLoginDtoMapper(); + + private RequestToLoginDtoMapper() { + } + + public static RequestToLoginDtoMapper getInstance() { + return INSTANCE; + } + + @Override + public LoginDto map(HttpServletRequest req) { + return map(req, new LoginDto()); + } + + @Override + public LoginDto map(HttpServletRequest req, LoginDto dto) { + dto.setEmail(req.getParameter("email")); + dto.setPassword(req.getParameter("password")); + return dto; + } +} diff --git a/src/ru/charm/back/model/Profile.java b/src/ru/charm/back/model/Profile.java index 8beff43..e5cc6e5 100644 --- a/src/ru/charm/back/model/Profile.java +++ b/src/ru/charm/back/model/Profile.java @@ -17,4 +17,5 @@ public class Profile { private Gender gender; private Status status; private String photo; + private Role role; } \ No newline at end of file diff --git a/src/ru/charm/back/model/Role.java b/src/ru/charm/back/model/Role.java new file mode 100644 index 0000000..738cbcc --- /dev/null +++ b/src/ru/charm/back/model/Role.java @@ -0,0 +1,6 @@ +package ru.charm.back.model; + +public enum Role { + ADMIN, + USER +} diff --git a/src/ru/charm/back/service/ProfileService.java b/src/ru/charm/back/service/ProfileService.java index f8bd206..c71568e 100644 --- a/src/ru/charm/back/service/ProfileService.java +++ b/src/ru/charm/back/service/ProfileService.java @@ -4,6 +4,7 @@ import lombok.AccessLevel; import lombok.NoArgsConstructor; import lombok.SneakyThrows; import ru.charm.back.dao.ProfileDao; +import ru.charm.back.dto.LoginDto; import ru.charm.back.dto.ProfileGetDto; import ru.charm.back.dto.ProfileUpdateDto; import ru.charm.back.dto.RegistrationDto; @@ -66,4 +67,10 @@ public class ProfileService { public boolean delete(Long id) { return dao.delete(id); } + + public Optional login(LoginDto dto) { + return dao.findByEmail(dto.getEmail()) + .filter(profile -> profile.getPassword().equals(dto.getPassword())) + .map(profileToProfileGetDtoMapper::map); + } } \ No newline at end of file