Browse Source

App Security Updated

main
Balaji 3 years ago
parent
commit
b586ca0bc8
  1. BIN
      .DS_Store
  2. BIN
      src/.DS_Store
  3. 2
      src/main/java/in/gov/chennaicorporation/gccoffice/configuration/DataSourceConfig.java
  4. 6
      src/main/java/in/gov/chennaicorporation/gccoffice/configuration/SecurityConfig.java
  5. 39
      src/main/java/in/gov/chennaicorporation/gccoffice/configuration/WebMvcConfig.java
  6. 18
      src/main/java/in/gov/chennaicorporation/gccoffice/controller/CustomErrorController.java
  7. 283
      src/main/java/in/gov/chennaicorporation/gccoffice/interceptor/AppInterceptor.java
  8. 3
      src/main/java/in/gov/chennaicorporation/gccoffice/repository/AppModuleAccessRepository.java
  9. 3
      src/main/java/in/gov/chennaicorporation/gccoffice/repository/AppModuleRepository.java
  10. 4
      src/main/java/in/gov/chennaicorporation/gccoffice/repository/MenuItemAccessRepository.java
  11. 5
      src/main/java/in/gov/chennaicorporation/gccoffice/repository/MenuItemRepository.java
  12. 6
      src/main/java/in/gov/chennaicorporation/gccoffice/repository/SubMenuItemAccessRepository.java
  13. 4
      src/main/java/in/gov/chennaicorporation/gccoffice/repository/SubMenuItemRepository.java
  14. 4
      src/main/resources/application.properties
  15. BIN
      src/main/resources/static/assets/.DS_Store
  16. BIN
      src/main/resources/static/assets/images/403.png
  17. 57
      src/main/resources/templates/error-403.html
  18. 38
      src/main/resources/templates/index.html

BIN
.DS_Store

BIN
src/.DS_Store

2
src/main/java/in/gov/chennaicorporation/gccoffice/configuration/DataSourceConfig.java

@ -35,7 +35,7 @@ public class DataSourceConfig {
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/gcc_apps"); dataSource.setUrl("jdbc:mysql://localhost:3306/gcc_apps");
dataSource.setUsername("root"); dataSource.setUsername("root");
dataSource.setPassword("");
dataSource.setPassword("1");
return dataSource; return dataSource;
} }
/* /*

6
src/main/java/in/gov/chennaicorporation/gccoffice/configuration/SecurityConfig.java

@ -57,7 +57,11 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
.and() .and()
.logout() .logout()
.logoutUrl("/logout") // Include the logout URL .logoutUrl("/logout") // Include the logout URL
.logoutSuccessUrl("/login"); // Include the success logout URL
.logoutSuccessUrl("/login") // Include the success logout URL
.and()
.sessionManagement()
.sessionFixation()
.migrateSession(); // or .none(), .newSession()
} }

39
src/main/java/in/gov/chennaicorporation/gccoffice/configuration/WebMvcConfig.java

@ -10,19 +10,52 @@ import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import in.gov.chennaicorporation.gccoffice.interceptor.AppInterceptor; import in.gov.chennaicorporation.gccoffice.interceptor.AppInterceptor;
import in.gov.chennaicorporation.gccoffice.repository.AppModuleAccessRepository;
import in.gov.chennaicorporation.gccoffice.repository.AppModuleRepository;
import in.gov.chennaicorporation.gccoffice.repository.MenuItemAccessRepository;
import in.gov.chennaicorporation.gccoffice.repository.MenuItemRepository;
import in.gov.chennaicorporation.gccoffice.repository.SubMenuItemAccessRepository;
import in.gov.chennaicorporation.gccoffice.repository.SubMenuItemRepository;
@Configuration @Configuration
public class WebMvcConfig implements WebMvcConfigurer { public class WebMvcConfig implements WebMvcConfigurer {
private final String uploadDirectory; private final String uploadDirectory;
private AppModuleAccessRepository appModuleAccessRepository;
private MenuItemAccessRepository menuItemAccessRepository;
private SubMenuItemAccessRepository subMenuItemAccessRepository;
private AppModuleRepository appModuleRepository;
private MenuItemRepository menuItemRepository;
private SubMenuItemRepository subMenuItemRepository;
@Autowired @Autowired
public WebMvcConfig(
@Value("${file.upload.directory}") String uploadDirectory) {
public WebMvcConfig(
@Value("${file.upload.directory}") String uploadDirectory,
AppModuleAccessRepository appModuleAccessRepository,
MenuItemAccessRepository menuItemAccessRepository,
SubMenuItemAccessRepository subMenuItemAccessRepository,
AppModuleRepository appModuleRepository,
MenuItemRepository menuItemRepository,
SubMenuItemRepository subMenuItemRepository) {
this.uploadDirectory = uploadDirectory; this.uploadDirectory = uploadDirectory;
this.appModuleAccessRepository = appModuleAccessRepository;
this.menuItemAccessRepository = menuItemAccessRepository;
this.subMenuItemAccessRepository = subMenuItemAccessRepository;
this.appModuleRepository = appModuleRepository;
this.menuItemRepository = menuItemRepository;
this.subMenuItemRepository = subMenuItemRepository;
} }
@Override @Override
public void addInterceptors(InterceptorRegistry registry) { public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new AppInterceptor());
registry.addInterceptor(new AppInterceptor(
appModuleAccessRepository,
menuItemAccessRepository,
subMenuItemAccessRepository,
appModuleRepository,
menuItemRepository,
subMenuItemRepository));
} }
@Override @Override

18
src/main/java/in/gov/chennaicorporation/gccoffice/controller/CustomErrorController.java

@ -23,9 +23,25 @@ public class CustomErrorController implements ErrorController {
@RequestMapping(value = ERROR_PATH, produces = "text/html") @RequestMapping(value = ERROR_PATH, produces = "text/html")
public String handleWebError(HttpServletRequest request, Model model) { public String handleWebError(HttpServletRequest request, Model model) {
// Retrieve error information from the request // Retrieve error information from the request
HttpStatus status = HttpStatus.valueOf((Integer) request.getAttribute("javax.servlet.error.status_code"));
// HttpStatus status = HttpStatus.valueOf((Integer) request.getAttribute("javax.servlet.error.status_code"));
//Throwable throwable = (Throwable) request.getAttribute("javax.servlet.error.exception");
// Retrieve error information from the request
Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
if (statusCode == null) {
// Add the error message to the model
model.addAttribute("errorStatus", "Error 403");
model.addAttribute("errorError", "403 - Access Denied");
model.addAttribute("errorMessage", "Oops, You don`t have permission to access this page.");
// Handle the case where the status code is null
// You may choose to set default values or redirect to a generic error page
return "error-403";
}
HttpStatus status = (statusCode != null) ? HttpStatus.valueOf(statusCode) : HttpStatus.INTERNAL_SERVER_ERROR;
Throwable throwable = (Throwable) request.getAttribute("javax.servlet.error.exception"); Throwable throwable = (Throwable) request.getAttribute("javax.servlet.error.exception");
// Add custom error handling logic for web applications here // Add custom error handling logic for web applications here
String errorPage = "error"; String errorPage = "error";
Integer errorStatus = 404; Integer errorStatus = 404;

283
src/main/java/in/gov/chennaicorporation/gccoffice/interceptor/AppInterceptor.java

@ -1,5 +1,6 @@
package in.gov.chennaicorporation.gccoffice.interceptor; package in.gov.chennaicorporation.gccoffice.interceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.Authentication; import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetails;
@ -8,31 +9,271 @@ import org.springframework.security.web.util.matcher.RequestMatcher;
import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.ModelAndView;
import in.gov.chennaicorporation.gccoffice.entity.AppModuleAccessEntity;
import in.gov.chennaicorporation.gccoffice.entity.AppModuleEntity;
import in.gov.chennaicorporation.gccoffice.entity.MenuItemAccessEntity;
import in.gov.chennaicorporation.gccoffice.entity.MenuItemEntity;
import in.gov.chennaicorporation.gccoffice.entity.SubMenuItemAccessEntity;
import in.gov.chennaicorporation.gccoffice.entity.SubMenuItemEntity;
import in.gov.chennaicorporation.gccoffice.repository.AppModuleAccessRepository;
import in.gov.chennaicorporation.gccoffice.repository.AppModuleRepository;
import in.gov.chennaicorporation.gccoffice.repository.MenuItemAccessRepository;
import in.gov.chennaicorporation.gccoffice.repository.MenuItemRepository;
import in.gov.chennaicorporation.gccoffice.repository.SubMenuItemAccessRepository;
import in.gov.chennaicorporation.gccoffice.repository.SubMenuItemRepository;
import in.gov.chennaicorporation.gccoffice.service.LoginUserInfo;
import java.util.List;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
public class AppInterceptor implements HandlerInterceptor { public class AppInterceptor implements HandlerInterceptor {
List<AppModuleAccessEntity> getAppModuleAccessEntities;
List<MenuItemAccessEntity> getMenuItemAccessEntities;
List<SubMenuItemAccessEntity> getSubMenuItemAccessEntities;
private AppModuleAccessRepository appModuleAccessRepository;
private MenuItemAccessRepository menuItemAccessRepository;
private SubMenuItemAccessRepository subMenuItemAccessRepository;
List<AppModuleEntity> getAppModuleEntities;
List<MenuItemEntity> getMenuItemEntities;
List<SubMenuItemEntity> getSubMenuItemEntities;
private AppModuleRepository appModuleRepository;
private MenuItemRepository menuItemRepository;
private SubMenuItemRepository subMenuItemRepository;
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// Create a RequestMatcher for login and error URLs
RequestMatcher loginPageMatcher = new AntPathRequestMatcher("/login");
RequestMatcher errorPageMatcher = new AntPathRequestMatcher("/error");
// Check if the current request matches the login or error page URLs
if (!loginPageMatcher.matches(request) && !errorPageMatcher.matches(request)) {
if (modelAndView != null) {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication != null && authentication.isAuthenticated()) {
Object principal = authentication.getPrincipal();
if (principal instanceof UserDetails) {
UserDetails userDetails = (UserDetails) principal;
modelAndView.addObject("currentUserDetails", userDetails);
//System.out.println(userDetails.getAuthorities());
}
}
}
@Autowired
public AppInterceptor(AppModuleAccessRepository appModuleAccessRepository,
MenuItemAccessRepository menuItemAccessRepository,
SubMenuItemAccessRepository subMenuItemAccessRepository,
AppModuleRepository appModuleRepository,
MenuItemRepository menuItemRepository,
SubMenuItemRepository subMenuItemRepository) {
this.appModuleAccessRepository = appModuleAccessRepository;
this.menuItemAccessRepository = menuItemAccessRepository;
this.subMenuItemAccessRepository = subMenuItemAccessRepository;
this.appModuleRepository = appModuleRepository;
this.menuItemRepository = menuItemRepository;
this.subMenuItemRepository = subMenuItemRepository;
}
private boolean isLoginPage(HttpServletRequest request) {
RequestMatcher loginPageMatcher = new AntPathRequestMatcher("/login");
return loginPageMatcher.matches(request);
}
private boolean isErrorPage(HttpServletRequest request) {
RequestMatcher errorPageMatcher = new AntPathRequestMatcher("/error");
return errorPageMatcher.matches(request);
}
private boolean isfavicon(HttpServletRequest request) {
RequestMatcher loginPageMatcher = new AntPathRequestMatcher("/favicon.ico");
return loginPageMatcher.matches(request);
}
public static String[] Split(String request,String patten) {
String path = request;
// Split the string by "/"
String[] parts = path.split(patten);
/*
// Display the parts
for (String part : parts) {
System.out.println(part);
}
*/
return parts;
}
private boolean hasModuleAccess(String moduleName) {
getAppModuleEntities = appModuleRepository.findByModulePath(moduleName);
System.out.println("DataTable Size for the url ("+moduleName+"): "+getAppModuleEntities.size());
String moduleid = null;
if(getAppModuleEntities.size()>0) {
for ( AppModuleEntity appModuleEntity : getAppModuleEntities) {
moduleid = appModuleEntity.getId().toString();
}
if(moduleid != null) {
String userGroupId = LoginUserInfo.getUserGroupId();
System.out.println("Query input`s :\n userGroupId : "+userGroupId+"\n moduleid : "+moduleid);
getAppModuleAccessEntities = appModuleAccessRepository.findByAll(userGroupId,moduleid);
if(getAppModuleAccessEntities.size()>0) {
return true;
}
}
}
return false;
}
private boolean hasMenuAccess(String url,String moduleName,String menuName) {
if(!hasModuleAccess(moduleName)) {return false; }
getMenuItemEntities = menuItemRepository.findByUrl(url);
System.out.println("DataTable Size for the url ("+url+"): "+getMenuItemEntities.size());
String moduleid = null;
String menuid = null;
if(getMenuItemEntities.size()>0) {
for (MenuItemEntity MenuEntity : getMenuItemEntities) {
moduleid = MenuEntity.getModuleId().getId().toString();
menuid = MenuEntity.getId().toString();
}
if(moduleid != null && menuid != null) {
String userGroupId = LoginUserInfo.getUserGroupId();
System.out.println("Query input`s :\n userGroupId : "+userGroupId+"\n moduleid : "+moduleid+"\n menuid : "+menuid);
getMenuItemAccessEntities = menuItemAccessRepository.findByAll(userGroupId,moduleid,menuid);
if(getMenuItemAccessEntities.size()>0) {
return true;
}
}
}
return false;
}
private boolean hasSubMenuAccess(String url,String moduleName,String menuName,String subMenuName) {
if(!hasModuleAccess(moduleName)) {return false; }
getSubMenuItemEntities = subMenuItemRepository.findByUrl(url);
System.out.println("DataTable Size for the url ("+url+"): "+getSubMenuItemEntities.size());
String moduleid = null;
String menuid = null;
String submenuid = null;
if(getSubMenuItemEntities.size()>0) {
for (SubMenuItemEntity subMenuEntity : getSubMenuItemEntities) {
moduleid = subMenuEntity.getModuleId().getId().toString();
menuid = subMenuEntity.getMenuItemId().getId().toString();
submenuid = subMenuEntity.getId().toString();
}
if(moduleid != null && menuid != null && submenuid != null) {
String userGroupId = LoginUserInfo.getUserGroupId();
System.out.println("Query input`s :\n userGroupId : "+userGroupId+"\n moduleid : "+moduleid+"\n menuid : "+menuid+"\n submenuid : "+submenuid);
getSubMenuItemAccessEntities = subMenuItemAccessRepository.findByAll(userGroupId,moduleid,menuid,submenuid);
if(getSubMenuItemAccessEntities.size()>0) {
// Check Parent Menu Access (Menu Access)
if(moduleid != null && menuid != null) {
System.out.println("Query input`s :\n userGroupId : "+userGroupId+"\n moduleid : "+moduleid+"\n menuid : "+menuid);
getMenuItemAccessEntities = menuItemAccessRepository.findByAll(userGroupId,moduleid,menuid);
if(getMenuItemAccessEntities.size()>0) {
return true;
}
}
}
}
}
return false;
}
private boolean hasAccess(String path) {
if(LoginUserInfo.getUserRole().equals("ADMIN")) {
return true;
} }
String url = removeLeadingSlash(path);
System.out.println("Give URL : "+path+" After remove leading slash : "+url);
// If default home page
if(path.equals("/")) {
return true;
}
//continue for access check
String[] parts = Split(url, "/");
if(parts.length<=0) {return true;}
System.out.println(parts.length);
if(parts.length>0) {
int j=0;
for (String part : parts) {
System.out.println(j+") URL SPLIT: "+part);
j++;
}
String moduleName = "";
String menuName = "";
String subMenuName = "";
if(parts.length==1) { // Check Only Module Access
moduleName = parts[0];
return hasModuleAccess(moduleName);
}
else if(parts.length==2) { // Check Module & Menu Access
moduleName = parts[0];
menuName = parts[1];
subMenuName = "";
return hasMenuAccess(url,moduleName,menuName);
}
else if(parts.length==3) { // Check Module , Menu & Sub-Menu Access
moduleName = parts[0];
menuName = parts[1];
subMenuName = parts[2];
return hasSubMenuAccess(url,moduleName,menuName,subMenuName);
}
}
return false;
}
public static String removeLeadingSlash(String input) {
if (input.startsWith("/")) {
return input.substring(1);
}
return input;
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (!isLoginPage(request) && !isErrorPage(request) && !isfavicon(request)) {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication != null && authentication.isAuthenticated()) {
String fullRequestURI = request.getRequestURI();
String contextPath = request.getContextPath();
String path = fullRequestURI.substring(contextPath.length());
if(!hasAccess(path)) {
Object principal = authentication.getPrincipal();
UserDetails userDetails = (UserDetails) principal;
System.out.println("1) Access Deny For --- " + userDetails.getAuthorities().toString());
// Redirect to the error page
//response.sendRedirect(request.getContextPath() + "/error");
request.getRequestDispatcher("/error").forward(request, response);
}
}
}
// Continue with the request processing
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// Check if the current request matches the login or error page URLs
if (!isLoginPage(request) && !isErrorPage(request) && !isfavicon(request)) {
if (modelAndView != null) {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication != null && authentication.isAuthenticated()) {
Object principal = authentication.getPrincipal();
if (principal instanceof UserDetails) {
UserDetails userDetails = (UserDetails) principal;
modelAndView.addObject("currentUserDetails", userDetails);
}
}
}
}
} }
}
}

3
src/main/java/in/gov/chennaicorporation/gccoffice/repository/AppModuleAccessRepository.java

@ -20,4 +20,7 @@ public interface AppModuleAccessRepository extends JpaRepository<AppModuleAccess
@Query(value = "SELECT * FROM `modules_access` WHERE `usergroup_id`=:usergroup_id AND `isactive`=1 AND `isdelete`=0", nativeQuery = true) @Query(value = "SELECT * FROM `modules_access` WHERE `usergroup_id`=:usergroup_id AND `isactive`=1 AND `isdelete`=0", nativeQuery = true)
List<AppModuleAccessEntity> findByUserGroupID(@Param("usergroup_id") String usergroup_id); List<AppModuleAccessEntity> findByUserGroupID(@Param("usergroup_id") String usergroup_id);
@Query(value = "SELECT * FROM `modules_access` WHERE (`usergroup_id`=:usergroup_id AND `module_id`=:module_id) AND (`isactive`=1 AND `isdelete`=0)", nativeQuery = true)
List<AppModuleAccessEntity> findByAll(@Param("usergroup_id") String usergroup_id,@Param("module_id") String module_id);
} }

3
src/main/java/in/gov/chennaicorporation/gccoffice/repository/AppModuleRepository.java

@ -21,4 +21,7 @@ public interface AppModuleRepository extends JpaRepository<AppModuleEntity, Inte
@Query(value = "SELECT * FROM `modules` WHERE `id` IN (:checkModuleid) AND (`isactive`=1 AND `isdelete`=0) ORDER BY `id`", nativeQuery = true) @Query(value = "SELECT * FROM `modules` WHERE `id` IN (:checkModuleid) AND (`isactive`=1 AND `isdelete`=0) ORDER BY `id`", nativeQuery = true)
List<AppModuleEntity> showAllById(String[] checkModuleid); List<AppModuleEntity> showAllById(String[] checkModuleid);
@Query(value = "SELECT * FROM `modules` WHERE (`module_path` = :module_path) AND (`isactive`=1 AND `isdelete`=0) LIMIT 0,1", nativeQuery = true)
List<AppModuleEntity> findByModulePath(String module_path);
} }

4
src/main/java/in/gov/chennaicorporation/gccoffice/repository/MenuItemAccessRepository.java

@ -13,6 +13,7 @@ import in.gov.chennaicorporation.gccoffice.entity.AppModuleAccessEntity;
import in.gov.chennaicorporation.gccoffice.entity.AppModuleEntity; import in.gov.chennaicorporation.gccoffice.entity.AppModuleEntity;
import in.gov.chennaicorporation.gccoffice.entity.MenuItemAccessEntity; import in.gov.chennaicorporation.gccoffice.entity.MenuItemAccessEntity;
import in.gov.chennaicorporation.gccoffice.entity.MenuItemEntity; import in.gov.chennaicorporation.gccoffice.entity.MenuItemEntity;
import in.gov.chennaicorporation.gccoffice.entity.SubMenuItemAccessEntity;
@Repository @Repository
@Transactional @Transactional
@ -22,4 +23,7 @@ public interface MenuItemAccessRepository extends JpaRepository<MenuItemAccessEn
@Query(value = "SELECT * FROM `menuitem_access` WHERE (`usergroup_id`=:usergroup_id AND `module_id`=:module_id) AND (`isactive`=1 AND `isdelete`=0)", nativeQuery = true) @Query(value = "SELECT * FROM `menuitem_access` WHERE (`usergroup_id`=:usergroup_id AND `module_id`=:module_id) AND (`isactive`=1 AND `isdelete`=0)", nativeQuery = true)
List<MenuItemAccessEntity> findByUserGroupID(@Param("usergroup_id") String usergroup_id, @Param("module_id") String module_id); List<MenuItemAccessEntity> findByUserGroupID(@Param("usergroup_id") String usergroup_id, @Param("module_id") String module_id);
@Query(value = "SELECT * FROM `menuitem_access` WHERE (`usergroup_id`=:usergroup_id AND `module_id`=:module_id AND `menuitem_id`=:menuitem_id) AND (`isactive`=1 AND `isdelete`=0) LIMIT 0,1", nativeQuery = true)
List<MenuItemAccessEntity> findByAll(@Param("usergroup_id") String usergroup_id,@Param("module_id") String module_id,@Param("menuitem_id") String menuitem_id);
} }

5
src/main/java/in/gov/chennaicorporation/gccoffice/repository/MenuItemRepository.java

@ -10,6 +10,7 @@ import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import in.gov.chennaicorporation.gccoffice.entity.MenuItemEntity; import in.gov.chennaicorporation.gccoffice.entity.MenuItemEntity;
import in.gov.chennaicorporation.gccoffice.entity.SubMenuItemAccessEntity;
@Repository @Repository
@Transactional @Transactional
@ -22,4 +23,8 @@ public interface MenuItemRepository extends JpaRepository<MenuItemEntity, Intege
@Query(value = "SELECT * FROM `menuitem` WHERE (`isactive`=1 AND `isdelete`=0) AND (`module_id`=:module_id AND `id` IN (:checkMenuid))", nativeQuery = true) @Query(value = "SELECT * FROM `menuitem` WHERE (`isactive`=1 AND `isdelete`=0) AND (`module_id`=:module_id AND `id` IN (:checkMenuid))", nativeQuery = true)
List<MenuItemEntity> getMenuItemByModuleIdAccess(@Param("module_id") int module_id, String[] checkMenuid); List<MenuItemEntity> getMenuItemByModuleIdAccess(@Param("module_id") int module_id, String[] checkMenuid);
@Query(value = "SELECT * FROM `menuitem` WHERE (`isactive`=1 AND `isdelete`=0) AND (`url`=:url) LIMIT 0,1", nativeQuery = true)
List<MenuItemEntity> findByUrl(@Param("url") String url);
} }

6
src/main/java/in/gov/chennaicorporation/gccoffice/repository/SubMenuItemAccessRepository.java

@ -20,9 +20,13 @@ public interface SubMenuItemAccessRepository extends JpaRepository<SubMenuItemAc
@Query(value = "SELECT LAST_INSERT_ID()", nativeQuery = true) @Query(value = "SELECT LAST_INSERT_ID()", nativeQuery = true)
Integer getLastInsertedId(); Integer getLastInsertedId();
@Query(value = "SELECT * FROM `menuitem_access` WHERE `usergroup_id`=:usergroup_id AND `isactive`=1 AND `isdelete`=0", nativeQuery = true)
@Query(value = "SELECT * FROM `submenuitem_access` WHERE `usergroup_id`=:usergroup_id AND `isactive`=1 AND `isdelete`=0", nativeQuery = true)
List<SubMenuItemAccessEntity> findByUserGroupID(@Param("usergroup_id") String usergroup_id); List<SubMenuItemAccessEntity> findByUserGroupID(@Param("usergroup_id") String usergroup_id);
@Query(value = "SELECT * FROM `submenuitem_access` WHERE (`usergroup_id`=:usergroup_id AND `module_id`=:module_id AND `menuitem_id`=:menuitem_id) AND (`isactive`=1 AND `isdelete`=0)", nativeQuery = true) @Query(value = "SELECT * FROM `submenuitem_access` WHERE (`usergroup_id`=:usergroup_id AND `module_id`=:module_id AND `menuitem_id`=:menuitem_id) AND (`isactive`=1 AND `isdelete`=0)", nativeQuery = true)
List<SubMenuItemAccessEntity> findByUserGroupIDAccess(@Param("usergroup_id") String usergroup_id,@Param("module_id") String module_id,@Param("menuitem_id") String menuitem_id); List<SubMenuItemAccessEntity> findByUserGroupIDAccess(@Param("usergroup_id") String usergroup_id,@Param("module_id") String module_id,@Param("menuitem_id") String menuitem_id);
@Query(value = "SELECT * FROM `submenuitem_access` WHERE (`usergroup_id`=:usergroup_id AND `module_id`=:module_id AND `menuitem_id`=:menuitem_id AND `submenuitem_id`=:submenuitem_id) AND (`isactive`=1 AND `isdelete`=0) LIMIT 0,1", nativeQuery = true)
List<SubMenuItemAccessEntity> findByAll(@Param("usergroup_id") String usergroup_id,@Param("module_id") String module_id,@Param("menuitem_id") String menuitem_id,@Param("submenuitem_id") String submenuitem_id);
} }

4
src/main/java/in/gov/chennaicorporation/gccoffice/repository/SubMenuItemRepository.java

@ -9,6 +9,7 @@ import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param; import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import in.gov.chennaicorporation.gccoffice.entity.MenuItemEntity;
import in.gov.chennaicorporation.gccoffice.entity.SubMenuItemEntity; import in.gov.chennaicorporation.gccoffice.entity.SubMenuItemEntity;
@Repository @Repository
@ -26,4 +27,7 @@ public interface SubMenuItemRepository extends JpaRepository<SubMenuItemEntity,
@Query(value = "SELECT * FROM `submenuitem` WHERE (`isactive`=1 AND `isdelete`=0) AND (`menuitem_id`=:menuitem_id AND `id` IN (:checkSubMenuid))", nativeQuery = true) @Query(value = "SELECT * FROM `submenuitem` WHERE (`isactive`=1 AND `isdelete`=0) AND (`menuitem_id`=:menuitem_id AND `id` IN (:checkSubMenuid))", nativeQuery = true)
List<SubMenuItemEntity> getSubMenuItemByMenuItemIdAccess(@Param("menuitem_id") int menuitem_id,String[] checkSubMenuid); List<SubMenuItemEntity> getSubMenuItemByMenuItemIdAccess(@Param("menuitem_id") int menuitem_id,String[] checkSubMenuid);
@Query(value = "SELECT * FROM `submenuitem` WHERE (`url`=:url) AND (`isactive`=1 AND `isdelete`=0) LIMIT 0,1", nativeQuery = true)
List<SubMenuItemEntity> findByUrl(@Param("url") String url);
} }

4
src/main/resources/application.properties

@ -30,7 +30,7 @@ file.upload.directory=${user.dir}/gccoffice_uploads
server.address=0.0.0.0 server.address=0.0.0.0
server.servlet.session.timeout: 30m
server.servlet.session.timeout: 5m
server.servlet.session.cookie.name: MYSESSIONID server.servlet.session.cookie.name: MYSESSIONID
server.servlet.session.cookie.max-age: 1800s
server.servlet.session.cookie.max-age: 10m

BIN
src/main/resources/static/assets/.DS_Store

BIN
src/main/resources/static/assets/images/403.png

After

Width: 1000  |  Height: 1080  |  Size: 106 KiB

57
src/main/resources/templates/error-403.html

@ -0,0 +1,57 @@
<!DOCTYPE html>
<html lang="en" dir="">
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="~{fragments/modules/base/head :: head}"></head>
<body>
<!--[if lt IE 8]>
<p class="browserupgrade">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
<![endif]-->
<div class="auth-wrapper">
<div class="container-fluid h-100">
<div class="row flex-row h-100 bg-white">
<div class="col-xl-6 col-lg-6 col-md-5 p-0 d-md-block d-lg-block d-sm-none d-none">
<div class="lavalite-bg authentication-form mx-auto text-center">
<div class="logo-centered" style="padding-top: 30px;"></div>
<img src="/assets/images/403.png" width="90%"/>
</div>
</div>
<div class="col-xl-6 col-lg-6 col-md-7 my-auto p-0">
<div class="authentication-form mx-auto text-center">
<div class="logo-centered">
<a href="/"><img src="/assets/images/logo.png" alt="Greater Chennai Corporation" class="header-brand-img" width="100%"></a>
</div>
<h3>Greater Chennai Corporation</h3>
<!-- Content -->
<div class="flex-grow-1 d-flex align-items-center p-5 bg-body-light">
<div class="w-100">
<p class="text-danger fs-4 fw-bold text-uppercase mb-2" th:utext="${errorStatus}">
403 Error
</p>
<h1 class="fw-bold mb-2" th:utext="${errorError}">
403 - Access Denied
</h1>
<p class="fs-4 fw-medium text-muted mb-5" th:utext="${errorMessage}">
Oops, You don`t have permission to access this page.
</p>
<a class="btn btn-lg btn-alt-danger" href="#" onclick="goBack()">
<i class="fa fa-arrow-left opacity-50 me-1"></i> Back
</a>
</div>
</div>
<!-- END Content -->
</div>
</div>
</div>
</div>
</div>
<script th:replace="~{fragments/modules/base/script :: script}"></script>
<script>
function goBack() {
history.go(-1); // This will go back one step in the browser's history
return false; // Prevent the default link behavior
}
</script>
</body>
</html>

38
src/main/resources/templates/index.html

@ -87,42 +87,6 @@
<div th:replace="~{fragments/modules/base/app_module_menu_box :: div}"></div> <div th:replace="~{fragments/modules/base/app_module_menu_box :: div}"></div>
<script th:replace="~{fragments/modules/base/script :: script}"></script> <script th:replace="~{fragments/modules/base/script :: script}"></script>
<script>
$(document).ready(function() {
$('#example').DataTable( {
dom: 'Bfrtip',
lengthMenu: [
[ 50, 100, 200, 500, -1 ],
[ '50 rows', '100 rows', '200 rows','500 rows', 'Show all' ]
],
buttons: [
{extend:'pageLength',className: 'btn btn-secondary'},
{extend:'copyHtml5',className: 'btn btn-secondary'},
{extend:'excelHtml5',className: 'btn btn-secondary'},
{extend:'csvHtml5',className: 'btn btn-secondary'},
{extend:'pdfHtml5',className: 'btn btn-secondary'},
],
responsive: true,
searching: false,
select: false,
processing: true,
serverSide: true,
serverMethod: 'post',
ajax: {
url:'/api/list2?draw=1&start=10&length=10'
},
columns: [
{ data: 'name' },
{ data: 'pos' },
{ data: 'off' },
{ data: 'age' },
{ data: 'date' },
{ data: 'salary' },
]
} );
} );
</script>
</body> </body>
</html> </html>
Loading…
Cancel
Save