+ Java Enterprise проект с
+ регистрацией/авторизацией и интерфейсом на основе ролей (USER, ADMIN).
+ Администратор может создавать/редактировать/удалять пользователей, а пользователи - управлять своим
+ профилем и данными (день, еда, калории) через UI (по AJAX) и по REST интерфейсу с базовой авторизацией.
+ Возможна фильтрация данных по датам и времени, при этом цвет записи таблицы еды зависит от того, превышает ли
+ сумма
+ калорий за день норму (редактируемый параметр в профиле пользователя).
+ Весь REST интерфейс покрывается JUnit тестами, используя Spring MVC Test и Spring Security Test.
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml
index 72ea58f..82ffece 100644
--- a/src/main/webapp/WEB-INF/web.xml
+++ b/src/main/webapp/WEB-INF/web.xml
@@ -4,6 +4,7 @@
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
Book Manager
+
org.springframework.web.context.ContextLoaderListener
@@ -13,7 +14,7 @@
contextConfigLocation
- /WEB-INF/appconfig-root.xml
+ classpath:/spring/appconfig-root.xml
@@ -37,4 +38,15 @@
*.css
+
+ springSecurityFilterChain
+ org.springframework.web.filter.DelegatingFilterProxy
+
+
+ springSecurityFilterChain
+ /*
+
+
+
+
\ No newline at end of file
diff --git a/src/main/webapp/index.jsp b/src/main/webapp/index.jsp
deleted file mode 100644
index 52e7a99..0000000
--- a/src/main/webapp/index.jsp
+++ /dev/null
@@ -1,3 +0,0 @@
-<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
-<%@ page contentType="text/html;charset=UTF-8" language="java" %>
-
\ No newline at end of file
From 828f9bc66b1528d0a871339367212cb43523d72d Mon Sep 17 00:00:00 2001
From: gvp
Date: Fri, 6 Jul 2018 15:42:32 +0700
Subject: [PATCH 09/14] Implements Controllers
---
.../controller/BookController.java | 32 +++++------
.../controller/UserController.java | 53 +++++++++++++++++++
.../org/gvp/boookmanager/dao/UserDao.java | 4 +-
.../org/gvp/boookmanager/dao/UserDaoImpl.java | 4 +-
.../gvp/boookmanager/service/BookService.java | 4 +-
.../boookmanager/service/BookServiceImpl.java | 4 +-
.../gvp/boookmanager/service/UserService.java | 8 ++-
.../boookmanager/service/UserServiceImpl.java | 10 ++--
.../support/security/AuthorizedUser.java | 17 ++----
.../resources/spring/appconfig-security.xml | 10 ++--
10 files changed, 94 insertions(+), 52 deletions(-)
create mode 100644 src/main/java/org/gvp/boookmanager/controller/UserController.java
diff --git a/src/main/java/org/gvp/boookmanager/controller/BookController.java b/src/main/java/org/gvp/boookmanager/controller/BookController.java
index 77d90b0..dcfcc35 100644
--- a/src/main/java/org/gvp/boookmanager/controller/BookController.java
+++ b/src/main/java/org/gvp/boookmanager/controller/BookController.java
@@ -2,9 +2,10 @@
import org.gvp.boookmanager.model.Book;
import org.gvp.boookmanager.service.BookService;
+import org.gvp.boookmanager.support.security.AuthorizedUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
-import org.springframework.validation.BindingResult;
+import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
@@ -22,28 +23,27 @@ public BookController(BookService bookService) {
}
@GetMapping(produces = MediaType.APPLICATION_JSON_VALUE)
- public List getAll() {
- return bookService.getALL(1);
+ public List getAll(@AuthenticationPrincipal AuthorizedUser authorizedUser) {
+ return bookService.getALL(authorizedUser.getId());
}
- @GetMapping("/{id}")
- public Book get(@PathVariable("id") long id) {
- return bookService.get(id, 1);
+ @GetMapping( value = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
+ public Book get(@PathVariable("id") long id, @AuthenticationPrincipal AuthorizedUser authorizedUser) {
+ return bookService.get(id, authorizedUser.getId());
}
@DeleteMapping(value = "/delete/{id}")
- public void delete(@PathVariable("id") long id){
- bookService.delete(id, 1);
+ public void delete(@PathVariable("id") long id, @AuthenticationPrincipal AuthorizedUser authorizedUser){
+ bookService.delete(id, authorizedUser.getId());
}
- /* @PostMapping()
- public String update(@Valid @ModelAttribute("book") Book book, BindingResult bindingResult){
-
- if(bindingResult.hasErrors()){
- return "bookForm";
+ @PostMapping()
+ public void update(@Valid @ModelAttribute Book book, @AuthenticationPrincipal AuthorizedUser authorizedUser){
+ if(book.getId() == null) {
+ bookService.create(book, authorizedUser.getId());
+ } else {
+ bookService.update(book, authorizedUser.getId());
}
- bookService.save(book);
- return "redirect:/books";
- }**/
+ }
}
diff --git a/src/main/java/org/gvp/boookmanager/controller/UserController.java b/src/main/java/org/gvp/boookmanager/controller/UserController.java
new file mode 100644
index 0000000..29cc888
--- /dev/null
+++ b/src/main/java/org/gvp/boookmanager/controller/UserController.java
@@ -0,0 +1,53 @@
+package org.gvp.boookmanager.controller;
+
+import org.gvp.boookmanager.model.User;
+import org.gvp.boookmanager.service.UserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.List;
+
+@RestController
+public class UserController {
+
+ private final UserService userService;
+
+ @Autowired
+ public UserController(UserService userService) {
+ this.userService = userService;
+ }
+
+
+ @GetMapping(produces = MediaType.APPLICATION_JSON_VALUE)
+ public List getAll() {
+ return userService.getAll();
+ }
+
+
+ @GetMapping(value = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
+ public User get(@PathVariable("id") int id) {
+ return userService.get(id);
+ }
+
+
+ @DeleteMapping("/{id}")
+ public void delete(@PathVariable("id") int id) {
+ userService.delete(id);
+ }
+
+ @PostMapping
+ public void createOrUpdate(@Valid @ModelAttribute User user) {
+ if (user.getId() == null) {
+ userService.create(user);
+ } else {
+ userService.update(user);
+ }
+ }
+
+ @PostMapping(value = "/{id}")
+ public void enable(@PathVariable("id") int id, @RequestParam("enabled") boolean enabled) {
+ userService.enable(id, enabled);
+ }
+}
diff --git a/src/main/java/org/gvp/boookmanager/dao/UserDao.java b/src/main/java/org/gvp/boookmanager/dao/UserDao.java
index 103a861..f99bc7a 100644
--- a/src/main/java/org/gvp/boookmanager/dao/UserDao.java
+++ b/src/main/java/org/gvp/boookmanager/dao/UserDao.java
@@ -8,9 +8,9 @@ public interface UserDao {
User save(User user);
- boolean delete(int id);
+ boolean delete(long id);
- User get(int id);
+ User get(long id);
User getByEmail(String email);
diff --git a/src/main/java/org/gvp/boookmanager/dao/UserDaoImpl.java b/src/main/java/org/gvp/boookmanager/dao/UserDaoImpl.java
index 6f73fce..f689cce 100644
--- a/src/main/java/org/gvp/boookmanager/dao/UserDaoImpl.java
+++ b/src/main/java/org/gvp/boookmanager/dao/UserDaoImpl.java
@@ -27,13 +27,13 @@ public User save(User user) {
}
@Override
- public User get(int id) {
+ public User get(long id) {
return em.find(User.class, id);
}
@Override
@Transactional
- public boolean delete(int id) {
+ public boolean delete(long id) {
return em.createNamedQuery(User.DELETE)
.setParameter("id", id)
.executeUpdate() != 0;
diff --git a/src/main/java/org/gvp/boookmanager/service/BookService.java b/src/main/java/org/gvp/boookmanager/service/BookService.java
index f2489a5..1e1f0f3 100644
--- a/src/main/java/org/gvp/boookmanager/service/BookService.java
+++ b/src/main/java/org/gvp/boookmanager/service/BookService.java
@@ -8,9 +8,9 @@ public interface BookService {
void delete(long id, long userId);
- Book create(Book book, int userId);
+ Book create(Book book, long userId);
- Book update(Book book, int userId);
+ Book update(Book book, long userId);
List getALL(long userId);
diff --git a/src/main/java/org/gvp/boookmanager/service/BookServiceImpl.java b/src/main/java/org/gvp/boookmanager/service/BookServiceImpl.java
index c2fe8c9..85d82b7 100644
--- a/src/main/java/org/gvp/boookmanager/service/BookServiceImpl.java
+++ b/src/main/java/org/gvp/boookmanager/service/BookServiceImpl.java
@@ -33,13 +33,13 @@ public void delete(long id, long userId) {
}
@Override
- public Book create(Book book, int userId) {
+ public Book create(Book book, long userId) {
return bookDao.save(book, userId);
}
@Override
@Transactional
- public Book update(Book book, int userId) {
+ public Book update(Book book, long userId) {
return bookDao.save(book, userId);
}
diff --git a/src/main/java/org/gvp/boookmanager/service/UserService.java b/src/main/java/org/gvp/boookmanager/service/UserService.java
index 598dc77..b059693 100644
--- a/src/main/java/org/gvp/boookmanager/service/UserService.java
+++ b/src/main/java/org/gvp/boookmanager/service/UserService.java
@@ -8,16 +8,14 @@ public interface UserService {
User create(User user);
- void delete(int id);
+ void delete(long id);
- User get(int id);
-
- User getByEmail(String email);
+ User get(long id);
void update(User user);
List getAll();
- void enable(int id, boolean enabled);
+ void enable(long id, boolean enabled);
}
diff --git a/src/main/java/org/gvp/boookmanager/service/UserServiceImpl.java b/src/main/java/org/gvp/boookmanager/service/UserServiceImpl.java
index 46fbbda..500245b 100644
--- a/src/main/java/org/gvp/boookmanager/service/UserServiceImpl.java
+++ b/src/main/java/org/gvp/boookmanager/service/UserServiceImpl.java
@@ -33,19 +33,15 @@ public User create(User user) {
@Transactional
@Override
- public void delete(int id) {
+ public void delete(long id) {
userDao.delete(id);
}
@Override
- public User get(int id) {
+ public User get(long id) {
return userDao.get(id);
}
- @Override
- public User getByEmail(String email) {
- return userDao.getByEmail(email);
- }
@Transactional
@Override
@@ -60,7 +56,7 @@ public List getAll() {
@Transactional
@Override
- public void enable(int id, boolean enabled) {
+ public void enable(long id, boolean enabled) {
User user = get(id);
user.setEnabled(enabled);
userDao.save(user);
diff --git a/src/main/java/org/gvp/boookmanager/support/security/AuthorizedUser.java b/src/main/java/org/gvp/boookmanager/support/security/AuthorizedUser.java
index 075ff9a..e6bdfe7 100644
--- a/src/main/java/org/gvp/boookmanager/support/security/AuthorizedUser.java
+++ b/src/main/java/org/gvp/boookmanager/support/security/AuthorizedUser.java
@@ -9,24 +9,15 @@
public class AuthorizedUser extends org.springframework.security.core.userdetails.User {
+ private User user;
public AuthorizedUser(User user) {
super(user.getEmail(), user.getPassword(), user.isEnabled(), true, true, true, user.getRoles());
+ this.user = user;
}
- public static AuthorizedUser safeGet() {
- Authentication auth = SecurityContextHolder.getContext().getAuthentication();
- if (auth == null) {
- return null;
- }
- Object principal = auth.getPrincipal();
- return (principal instanceof AuthorizedUser) ? (AuthorizedUser) principal : null;
- }
-
- public static AuthorizedUser get() {
- AuthorizedUser user = safeGet();
- requireNonNull(user, "No authorized user found");
- return user;
+ public long getId() {
+ return user.getId();
}
diff --git a/src/main/resources/spring/appconfig-security.xml b/src/main/resources/spring/appconfig-security.xml
index b66a240..9818715 100644
--- a/src/main/resources/spring/appconfig-security.xml
+++ b/src/main/resources/spring/appconfig-security.xml
@@ -7,6 +7,9 @@
+
+
@@ -14,16 +17,17 @@
-
-
-
+
\ No newline at end of file
From 78bebce172c3714a15e49e3e67c14a9b4161e651 Mon Sep 17 00:00:00 2001
From: gvp
Date: Wed, 11 Jul 2018 00:14:47 +0700
Subject: [PATCH 10/14] Add profile controller's methods and jsp
---
.../controller/RootController.java | 40 ++++++-
.../controller/UserController.java | 1 +
.../boookmanager/service/UserServiceImpl.java | 1 +
.../support/security/AuthorizedUser.java | 13 ++-
src/main/resources/db/populateDB.sql | 2 +-
src/main/resources/spring/appconfig-mvc.xml | 6 +-
.../resources/spring/appconfig-security.xml | 6 +-
src/main/webapp/WEB-INF/jsp/bookForm.jsp | 3 -
src/main/webapp/WEB-INF/jsp/books.jsp | 105 +++++++++---------
src/main/webapp/WEB-INF/jsp/login.jsp | 87 +++++----------
.../webapp/WEB-INF/jsp/parts/navigation.jsp | 22 ++--
.../webapp/WEB-INF/jsp/parts/pagination.jsp | 39 -------
src/main/webapp/WEB-INF/jsp/profile.jsp | 38 +++++++
src/main/webapp/WEB-INF/jsp/search.jsp | 2 +-
14 files changed, 184 insertions(+), 181 deletions(-)
delete mode 100644 src/main/webapp/WEB-INF/jsp/parts/pagination.jsp
create mode 100644 src/main/webapp/WEB-INF/jsp/profile.jsp
diff --git a/src/main/java/org/gvp/boookmanager/controller/RootController.java b/src/main/java/org/gvp/boookmanager/controller/RootController.java
index 7c96c81..eb4fa3b 100644
--- a/src/main/java/org/gvp/boookmanager/controller/RootController.java
+++ b/src/main/java/org/gvp/boookmanager/controller/RootController.java
@@ -1,18 +1,39 @@
package org.gvp.boookmanager.controller;
+import org.gvp.boookmanager.model.User;
+import org.gvp.boookmanager.service.UserService;
+import org.gvp.boookmanager.support.security.AuthorizedUser;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.support.SessionStatus;
+
+import javax.validation.Valid;
+
@Controller
public class RootController {
+ private final UserService userService;
+
+ @Autowired
+ public RootController(UserService userService) {
+ this.userService = userService;
+ }
+
@GetMapping("/")
public String root() {
return "redirect:books";
}
@GetMapping("/books")
- public String meals() {
+ public String books() {
return "books";
}
@@ -20,4 +41,21 @@ public String meals() {
public String login() {
return "login";
}
+
+ @GetMapping("/profile")
+ public String profile(Model model, @AuthenticationPrincipal AuthorizedUser authorizedUser) {
+ model.addAttribute("user", authorizedUser.getUser());
+ return "profile";
+ }
+
+ @RequestMapping(name = "/profile", method = RequestMethod.POST)
+ public String updateProfile(@Valid User user, BindingResult result, SessionStatus status, @AuthenticationPrincipal AuthorizedUser authorizedUser) {
+ if (result.hasErrors()) {
+ return "profile";
+ }
+ userService.update(user);
+ authorizedUser.setUser(user);
+ status.setComplete();
+ return "redirect:books";
+ }
}
diff --git a/src/main/java/org/gvp/boookmanager/controller/UserController.java b/src/main/java/org/gvp/boookmanager/controller/UserController.java
index 29cc888..3b4d1db 100644
--- a/src/main/java/org/gvp/boookmanager/controller/UserController.java
+++ b/src/main/java/org/gvp/boookmanager/controller/UserController.java
@@ -10,6 +10,7 @@
import java.util.List;
@RestController
+@RequestMapping(name = "/users")
public class UserController {
private final UserService userService;
diff --git a/src/main/java/org/gvp/boookmanager/service/UserServiceImpl.java b/src/main/java/org/gvp/boookmanager/service/UserServiceImpl.java
index 500245b..56b3728 100644
--- a/src/main/java/org/gvp/boookmanager/service/UserServiceImpl.java
+++ b/src/main/java/org/gvp/boookmanager/service/UserServiceImpl.java
@@ -64,6 +64,7 @@ public void enable(long id, boolean enabled) {
@Override
public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
+ System.out.println(email + "is email");
User user = userDao.getByEmail(email.toLowerCase());
if (user == null) {
throw new UsernameNotFoundException("User " + email + " is not found");
diff --git a/src/main/java/org/gvp/boookmanager/support/security/AuthorizedUser.java b/src/main/java/org/gvp/boookmanager/support/security/AuthorizedUser.java
index e6bdfe7..b6cdb62 100644
--- a/src/main/java/org/gvp/boookmanager/support/security/AuthorizedUser.java
+++ b/src/main/java/org/gvp/boookmanager/support/security/AuthorizedUser.java
@@ -2,17 +2,13 @@
import org.gvp.boookmanager.model.User;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.context.SecurityContextHolder;
-
-import static java.util.Objects.requireNonNull;
public class AuthorizedUser extends org.springframework.security.core.userdetails.User {
private User user;
public AuthorizedUser(User user) {
- super(user.getEmail(), user.getPassword(), user.isEnabled(), true, true, true, user.getRoles());
+ super(user.getEmail(), user.getPassword(), user.getRoles());
this.user = user;
}
@@ -20,6 +16,11 @@ public long getId() {
return user.getId();
}
+ public User getUser() {
+ return user;
+ }
-
+ public void setUser(User user) {
+ this.user = user;
+ }
}
diff --git a/src/main/resources/db/populateDB.sql b/src/main/resources/db/populateDB.sql
index f88e2a9..e5828be 100644
--- a/src/main/resources/db/populateDB.sql
+++ b/src/main/resources/db/populateDB.sql
@@ -4,7 +4,7 @@ INSERT INTO users (name, email, password) VALUES
INSERT INTO user_roles (role, user_id) VALUES
('ROLE_USER', 1),
- ('ROLE_ADMIN', 1),
+ ('ROLE_ADMIN', 2),
('ROLE_USER', 2);
diff --git a/src/main/resources/spring/appconfig-mvc.xml b/src/main/resources/spring/appconfig-mvc.xml
index 3471410..f48faea 100644
--- a/src/main/resources/spring/appconfig-mvc.xml
+++ b/src/main/resources/spring/appconfig-mvc.xml
@@ -4,7 +4,11 @@
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
-
+
+
+
+
+
diff --git a/src/main/resources/spring/appconfig-security.xml b/src/main/resources/spring/appconfig-security.xml
index 9818715..779f0d1 100644
--- a/src/main/resources/spring/appconfig-security.xml
+++ b/src/main/resources/spring/appconfig-security.xml
@@ -7,6 +7,7 @@
+
@@ -14,7 +15,7 @@
-
+
+
-
+
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/jsp/bookForm.jsp b/src/main/webapp/WEB-INF/jsp/bookForm.jsp
index b612b8d..8faef65 100644
--- a/src/main/webapp/WEB-INF/jsp/bookForm.jsp
+++ b/src/main/webapp/WEB-INF/jsp/bookForm.jsp
@@ -64,9 +64,6 @@
value=Save>
-