From fab2885e4e53e112494da04e83667612b0b3e58b Mon Sep 17 00:00:00 2001 From: mlinha <mlinha@students.zcu.cz> Date: Mon, 4 May 2020 17:38:37 +0200 Subject: [PATCH 1/2] re #7978 added functionality of only showing assemblies with correct role (same as user), added functionality of showing only logged in users's configurations in "Rychle k" --- .../vldc/aswi/configuration/AppConfig.java | 1 + .../vldc/aswi/dao/AssemblyRepository.java | 9 +++- .../aswi/dao/ConfigurationRepository.java | 9 +++- .../vldc/aswi/service/AssemblyManager.java | 6 +++ .../aswi/service/AssemblyManagerImpl.java | 9 ++++ .../service/ConfigurationManagerImpl.java | 34 ++++++++++---- .../java/vldc/aswi/service/RoleManager.java | 7 +++ .../vldc/aswi/service/RoleManagerImpl.java | 10 ++++ .../java/vldc/aswi/utils/AuthControl.java | 46 +++++++++++++++++++ .../web/controller/AssemblyController.java | 27 +++++++++-- .../controller/ConfigurationController.java | 17 +++++++ .../aswi/web/controller/IndexController.java | 18 +++++++- 12 files changed, 176 insertions(+), 17 deletions(-) create mode 100644 src/main/java/vldc/aswi/utils/AuthControl.java diff --git a/src/main/java/vldc/aswi/configuration/AppConfig.java b/src/main/java/vldc/aswi/configuration/AppConfig.java index 6afbdc40..fcf074d0 100644 --- a/src/main/java/vldc/aswi/configuration/AppConfig.java +++ b/src/main/java/vldc/aswi/configuration/AppConfig.java @@ -81,6 +81,7 @@ public class AppConfig extends WebSecurityConfigurerAdapter implements WebMvcCon @Override protected void configure(HttpSecurity http) throws Exception { + // TODO: 04.05.2020 Error pages http .authorizeRequests() .mvcMatchers("/login").permitAll() diff --git a/src/main/java/vldc/aswi/dao/AssemblyRepository.java b/src/main/java/vldc/aswi/dao/AssemblyRepository.java index c89f624d..bbce2f59 100644 --- a/src/main/java/vldc/aswi/dao/AssemblyRepository.java +++ b/src/main/java/vldc/aswi/dao/AssemblyRepository.java @@ -3,6 +3,7 @@ package vldc.aswi.dao; import org.springframework.data.repository.CrudRepository; import org.springframework.stereotype.Repository; import vldc.aswi.domain.Assembly; +import vldc.aswi.domain.Role; import java.util.List; @@ -27,8 +28,14 @@ public interface AssemblyRepository extends CrudRepository<Assembly, Long> { Assembly findFirst1ByOrderByAssemblyOrder(); /** - * Find assemblies order by order + * Find assemblies, order by order * @return ordered assemblies */ List<Assembly> getByOrderByAssemblyOrderAsc(); + + /** + * Find assemblies with role, order by order + * @return ordered assemblies + */ + List<Assembly> getByRolesContainingOrderByAssemblyOrderAsc(Role role); } diff --git a/src/main/java/vldc/aswi/dao/ConfigurationRepository.java b/src/main/java/vldc/aswi/dao/ConfigurationRepository.java index 5560e0c9..f3350125 100644 --- a/src/main/java/vldc/aswi/dao/ConfigurationRepository.java +++ b/src/main/java/vldc/aswi/dao/ConfigurationRepository.java @@ -2,8 +2,8 @@ package vldc.aswi.dao; import org.springframework.data.repository.CrudRepository; import org.springframework.stereotype.Repository; -import vldc.aswi.domain.Assembly; import vldc.aswi.domain.Configuration; +import vldc.aswi.domain.User; import java.util.List; @@ -26,4 +26,11 @@ public interface ConfigurationRepository extends CrudRepository<Configuration, L * @return List of configurations. */ List<Configuration> getByAssemblyId(Long assemblyId); + + /** + * Get list of configurations by user. + * @param user - user. + * @return List of configurations. + */ + List<Configuration> getByUserEquals(User user); } diff --git a/src/main/java/vldc/aswi/service/AssemblyManager.java b/src/main/java/vldc/aswi/service/AssemblyManager.java index 67528712..9f7b7685 100644 --- a/src/main/java/vldc/aswi/service/AssemblyManager.java +++ b/src/main/java/vldc/aswi/service/AssemblyManager.java @@ -56,4 +56,10 @@ public interface AssemblyManager { * @return True if delete was successful, otherwise false. */ boolean deleteAssembly(Long id); + + /** + * Get all Assemblies from database with role, ordered. + * @return List of assemblies. + */ + List<Assembly> getAssembliesWithRoleOrdered(Role role); } diff --git a/src/main/java/vldc/aswi/service/AssemblyManagerImpl.java b/src/main/java/vldc/aswi/service/AssemblyManagerImpl.java index 47be775f..0d751ff2 100644 --- a/src/main/java/vldc/aswi/service/AssemblyManagerImpl.java +++ b/src/main/java/vldc/aswi/service/AssemblyManagerImpl.java @@ -77,6 +77,15 @@ public class AssemblyManagerImpl implements AssemblyManager { return this.assemblyRepository.getByOrderByAssemblyOrderAsc(); } + /** + * Get all Assemblies from database with role, ordered. + * @return List of assemblies. + */ + @Override + public List<Assembly> getAssembliesWithRoleOrdered(Role role) { + return this.assemblyRepository.getByRolesContainingOrderByAssemblyOrderAsc(role); + } + /** * Get assembly by id. * @param id - ID of assembly. diff --git a/src/main/java/vldc/aswi/service/ConfigurationManagerImpl.java b/src/main/java/vldc/aswi/service/ConfigurationManagerImpl.java index 6f71d2aa..a59be6a8 100644 --- a/src/main/java/vldc/aswi/service/ConfigurationManagerImpl.java +++ b/src/main/java/vldc/aswi/service/ConfigurationManagerImpl.java @@ -5,20 +5,20 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.context.event.EventListener; import org.springframework.core.annotation.Order; +import org.springframework.security.authentication.AnonymousAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; import vldc.aswi.dao.*; import vldc.aswi.dao.parameter.ParameterInConfigurationRepository; -import vldc.aswi.dao.parameter.ParameterTypeRepository; -import vldc.aswi.domain.Assembly; -import vldc.aswi.domain.Configuration; -import vldc.aswi.domain.Function; +import vldc.aswi.domain.*; import vldc.aswi.domain.parameter.ParameterInConfiguration; import vldc.aswi.service.parameter.ParameterInConfigurationManager; import vldc.aswi.service.parameter.ParameterTypeManager; +import vldc.aswi.utils.AuthControl; import javax.transaction.Transactional; import java.util.ArrayList; -import java.util.LinkedList; import java.util.List; @Service @@ -83,9 +83,18 @@ public class ConfigurationManagerImpl implements ConfigurationManager { */ @Override public List<Configuration> getConfigurations() { - List<Configuration> retVal = new LinkedList<>(); - this.configurationRepository.findAll().forEach(retVal::add); - return retVal; + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + String username; + if (!(authentication instanceof AnonymousAuthenticationToken)) { + username = authentication.getName(); + } + else { + // TODO: 04.05.2020 error message, user not authenticated + return null; + } + User user = userRepository.findByUsername(username); + + return configurationRepository.getByUserEquals(user); } /** @@ -106,7 +115,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager { */ @Override public Configuration saveConfiguration(Configuration newConfiguration, String id) { - if(id.equals("")) { + if (id.equals("")) { return addConfiguration(newConfiguration); } else { @@ -158,12 +167,17 @@ public class ConfigurationManagerImpl implements ConfigurationManager { * @return saved configuration */ private Configuration addConfiguration(Configuration newConfiguration) { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + String username = AuthControl.getUserName(); + if (username == null) { + // TODO: 04.05.2020 error message, user not authenticated + } Configuration configuration = new Configuration(); Assembly assembly = assemblyRepository.getById(newConfiguration.getAssembly().getId()); configuration.setAssembly(assembly); configuration.setName(newConfiguration.getName()); configuration.setTableName(newConfiguration.getTableName()); - configuration.setUser(userRepository.getById((long) 1)); + configuration.setUser(userRepository.findByUsername(username)); Configuration savedConfiguration = configurationRepository.save(configuration); savedConfiguration.setParametersInConfiguration(new ArrayList<>()); diff --git a/src/main/java/vldc/aswi/service/RoleManager.java b/src/main/java/vldc/aswi/service/RoleManager.java index b739e67e..18de5b98 100644 --- a/src/main/java/vldc/aswi/service/RoleManager.java +++ b/src/main/java/vldc/aswi/service/RoleManager.java @@ -20,4 +20,11 @@ public interface RoleManager { * @param name Name of role. */ void addRole(String name); + + /** + * Get role from database by name. + * @param name name of the role + * @return List of roles. + */ + public Role getRole(String name); } diff --git a/src/main/java/vldc/aswi/service/RoleManagerImpl.java b/src/main/java/vldc/aswi/service/RoleManagerImpl.java index 14a08243..53d07b67 100644 --- a/src/main/java/vldc/aswi/service/RoleManagerImpl.java +++ b/src/main/java/vldc/aswi/service/RoleManagerImpl.java @@ -62,4 +62,14 @@ public class RoleManagerImpl implements RoleManager { this.roleRepository.findAll().forEach(retVal::add); return retVal; } + + /** + * Get role from database by name. + * @param name name of the role + * @return List of roles. + */ + @Override + public Role getRole(String name) { + return roleRepository.getByName(name); + } } diff --git a/src/main/java/vldc/aswi/utils/AuthControl.java b/src/main/java/vldc/aswi/utils/AuthControl.java new file mode 100644 index 00000000..3994cc40 --- /dev/null +++ b/src/main/java/vldc/aswi/utils/AuthControl.java @@ -0,0 +1,46 @@ +package vldc.aswi.utils; + +import org.springframework.security.authentication.AnonymousAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.context.SecurityContextHolder; + +import java.util.Set; +import java.util.stream.Collectors; + +/** + * Classed used for getting names and roles of logged in users + */ +public class AuthControl { + + /** + * Gets the name of current user + * @return name of current user + */ + public static String getRoleName() { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + Set<String> roles; + if (!(authentication instanceof AnonymousAuthenticationToken)) { + roles = authentication.getAuthorities().stream() + .map(GrantedAuthority::getAuthority).collect(Collectors.toSet()); + return roles.iterator().next().replace("ROLE_", ""); + } else { + // TODO: 04.05.2020 error message, user not authenticated + return null; + } + } + + /** + * Gets the role name of the current user + * @return role name of the current user + */ + public static String getUserName() { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + if (!(authentication instanceof AnonymousAuthenticationToken)) { + return authentication.getName(); + } else { + // TODO: 04.05.2020 error message, user not authenticated + return null; + } + } +} diff --git a/src/main/java/vldc/aswi/web/controller/AssemblyController.java b/src/main/java/vldc/aswi/web/controller/AssemblyController.java index b7ebc7bb..5c347e4d 100644 --- a/src/main/java/vldc/aswi/web/controller/AssemblyController.java +++ b/src/main/java/vldc/aswi/web/controller/AssemblyController.java @@ -1,6 +1,10 @@ package vldc.aswi.web.controller; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.AnonymousAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.validation.BindingResult; @@ -12,21 +16,21 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.support.RedirectAttributes; -import vldc.aswi.domain.Assembly; -import vldc.aswi.domain.Configuration; -import vldc.aswi.domain.Location; -import vldc.aswi.domain.Operator; +import vldc.aswi.domain.*; import vldc.aswi.domain.parameter.Parameter; import vldc.aswi.domain.parameter.ParameterInConfiguration; import vldc.aswi.service.*; import vldc.aswi.service.parameter.ParameterManager; import vldc.aswi.service.parameter.ParameterTypeManager; +import vldc.aswi.utils.AuthControl; import vldc.aswi.validators.AssemblyValidator; import vldc.aswi.utils.Utils; import javax.validation.Valid; import java.util.ArrayList; import java.util.Comparator; +import java.util.Set; +import java.util.stream.Collectors; /** * Controller for assemblies and configurations @@ -104,6 +108,21 @@ public class AssemblyController extends BasicController { Assembly assembly = this.assemblyManager.getAssemblyById(Long.parseLong(id)); + // TODO: 04.05.2020 error page when id doesn't exist + + String roleName = AuthControl.getRoleName(); + + if (roleName == null) { + // TODO: 04.05.2020 error message, user not authenticated + } + + Role role = roleManager.getRole(roleName); + + if (!assembly.getRoles().contains(role)) { + // TODO: 04.05.2020 Error page, wrong role + return new ModelAndView("redirect:/"); + } + Configuration configuration = new Configuration(); configuration.setAssembly(assembly); diff --git a/src/main/java/vldc/aswi/web/controller/ConfigurationController.java b/src/main/java/vldc/aswi/web/controller/ConfigurationController.java index df252936..64264ecf 100644 --- a/src/main/java/vldc/aswi/web/controller/ConfigurationController.java +++ b/src/main/java/vldc/aswi/web/controller/ConfigurationController.java @@ -1,6 +1,9 @@ package vldc.aswi.web.controller; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.AnonymousAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.validation.BindingResult; @@ -14,6 +17,7 @@ import vldc.aswi.domain.Location; import vldc.aswi.domain.Operator; import vldc.aswi.domain.parameter.ParameterInConfiguration; import vldc.aswi.service.ConfigurationManager; +import vldc.aswi.utils.AuthControl; import vldc.aswi.utils.Utils; import javax.validation.Valid; @@ -44,6 +48,18 @@ public class ConfigurationController extends BasicController{ Configuration configuration = configurationManager.getConfigurationById(Long.parseLong(id)); + // TODO: 04.05.2020 error page when id doesn't exist + + String userName = AuthControl.getUserName(); + + if (userName == null) { + // TODO: 04.05.2020 error message, user not authenticated + } + else if (!userName.equals(configuration.getUser().getUsername())) { + // TODO: 04.05.2020 error page wrong user + return new ModelAndView("redirect:/"); + } + List<ParameterInConfiguration> parametersInConfiguration = new ArrayList<>(configuration.getParametersInConfiguration()); configuration.setParametersInConfiguration(parametersInConfiguration); @@ -69,6 +85,7 @@ public class ConfigurationController extends BasicController{ ModelAndView modelAndView = new ModelAndView(); if (bindingResult.hasErrors()) { + // TODO: 04.05.2020 Error message modelAndView.setViewName("redirect:/"); return modelAndView; diff --git a/src/main/java/vldc/aswi/web/controller/IndexController.java b/src/main/java/vldc/aswi/web/controller/IndexController.java index 5a744493..dbfc60e7 100644 --- a/src/main/java/vldc/aswi/web/controller/IndexController.java +++ b/src/main/java/vldc/aswi/web/controller/IndexController.java @@ -6,10 +6,13 @@ import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; import vldc.aswi.domain.Assembly; +import vldc.aswi.domain.Role; import vldc.aswi.domain.parameter.Parameter; import vldc.aswi.service.AssemblyManager; import vldc.aswi.service.ConfigurationManager; +import vldc.aswi.service.RoleManager; import vldc.aswi.service.SqlQueryManager; +import vldc.aswi.utils.AuthControl; import javax.validation.Valid; import java.util.ArrayList; @@ -44,6 +47,12 @@ public class IndexController extends BasicController { @Autowired private ConfigurationManager configurationManager; + /** + * Autowired role manager + */ + @Autowired + private RoleManager roleManager; + /** * Shows index page * @return modelAndView with index page @@ -54,8 +63,15 @@ public class IndexController extends BasicController { ModelMap modelMap = modelAndView.getModelMap(); - List<Assembly> assemblies = assemblyManager.getAssembliesOrdered(); + String roleName = AuthControl.getRoleName(); + + if (roleName == null) { + // TODO: 04.05.2020 error message, user not authenticated + } + + Role role = roleManager.getRole(roleName); + List<Assembly> assemblies = assemblyManager.getAssembliesWithRoleOrdered(role); modelMap.addAttribute("assemblies", assemblies); modelMap.addAttribute("attributes", createAttributesString(assemblies)); -- GitLab From 38350f557ae3f7a74c810bd694e5932bda9a40ae Mon Sep 17 00:00:00 2001 From: mlinha <mlinha@students.zcu.cz> Date: Mon, 4 May 2020 17:46:37 +0200 Subject: [PATCH 2/2] re #7978 minor code improvements --- .../aswi/service/ConfigurationManagerImpl.java | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/src/main/java/vldc/aswi/service/ConfigurationManagerImpl.java b/src/main/java/vldc/aswi/service/ConfigurationManagerImpl.java index a59be6a8..7c62fdec 100644 --- a/src/main/java/vldc/aswi/service/ConfigurationManagerImpl.java +++ b/src/main/java/vldc/aswi/service/ConfigurationManagerImpl.java @@ -5,9 +5,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.context.event.EventListener; import org.springframework.core.annotation.Order; -import org.springframework.security.authentication.AnonymousAuthenticationToken; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; import vldc.aswi.dao.*; import vldc.aswi.dao.parameter.ParameterInConfigurationRepository; @@ -83,15 +80,11 @@ public class ConfigurationManagerImpl implements ConfigurationManager { */ @Override public List<Configuration> getConfigurations() { - Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); - String username; - if (!(authentication instanceof AnonymousAuthenticationToken)) { - username = authentication.getName(); - } - else { + String username = AuthControl.getUserName(); + if (username == null) { // TODO: 04.05.2020 error message, user not authenticated - return null; } + User user = userRepository.findByUsername(username); return configurationRepository.getByUserEquals(user); @@ -167,7 +160,6 @@ public class ConfigurationManagerImpl implements ConfigurationManager { * @return saved configuration */ private Configuration addConfiguration(Configuration newConfiguration) { - Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); String username = AuthControl.getUserName(); if (username == null) { // TODO: 04.05.2020 error message, user not authenticated -- GitLab