多平台统一管理软件接口,如何实现多平台统一管理软件接口
259
2023-03-08
spring aop实现用户权限管理的示例
AOP 在实际项目中运用的场景主要有 权限管理(Authority Management)、事务管理(Transaction Management)、安全管理(Security)、日志管理(Logging)和调试管理(Debugging) 等。
问题源于项目开发
最近项目中需要做一个权限管理模块,按照之前同事的做法是在controller层的每个接口调用之前上做逻辑判断,这样做也没有不妥,但是代码重复率太高,而且是体力劳动,so,便有了如题所说的使用spring aop做一个切点来实现通用功能的权限管理,这样也就降低了项目后期开发的可扩展性。
权限管理的代码实现与配置文件
在最小的代码修改程度上,aop无疑是最理想的选择。项目中有各种权限的复合,相对来说逻辑复杂度比较高,所以一步步来。因为权限涉及到的是后端接口的调用所以楼主选择在controller层代码做切面,而切点就是controller中的各个方法块,对于通用访问权限,我们使用execution表达式进行排除。
只读管理员权限的实现及切点选择
对于实现排除通用的controller,楼主采用的是execution表达式逻辑运算。因为只读管理员拥有全局读权限,而对于增删改权限,楼主采用的是使用切点切入是增删改的方法,so,这个时候规范的方法命名就很重要了。对于各种与只读管理员进行复合的各种管理员,我们在代码中做一下特殊判断即可。下面是spring aop的配置文件配置方法。
class="com.thundersoft.metadata.aop.UsersPermissionsAdvice"/> expression="(execution(* com.thundersoft.metadata.web.controller.*.add*(..)) or execution(* com.thundersoft.metadata.web.controller.*.edit*(..)) or execution(* com.thundersoft.metadata.web.controller.*.del*(..)) or execution(* com.thundersoft.metadata.web.controller.*.update*(..)) or execution(* com.thundersoft.metadata.web.controller.*.insert*(..)) or execution(* com.thundersoft.metadata.web.controller.*.modif*(..))) or execution(* com.thundersoft.metadata.web.controller.*.down*(..))) and ( !execution(* com.thundersoft.metadata.web.controller.FindPasswordController.*(..)) and !execution(* com.thundersoft.metadata.web.controller.SelfServiceController.*(..)) and !execution(* com.thundersoft.metadata.web.controller.HomeController.*(..)) and !execution(* com.thundersoft.metadata.web.controller.UserStatusController.*(..)) and !execution(* com.thundersoft.metadata.web.controller.DashboardController.*(..)) and !execution(* com.thundersoft.metadata.web.controller.MainController.*(..))))" id="authPointCut"/> pointcut-ref="authPointCut"/> 只读管理员权限管理代码实现 上面说了那么多,废话不多说了,下面是对只读权限与各种复合权限进行控制的切面代码实现。 /** * 对只读管理员以及其复合管理员进行aop拦截判断. * @param joinPoint 切入点. * @throws IOException */ public void readOnly(JoinPoint joinPoint) throws IOException { /** * 获取被拦截的方法. */ String methodName = joinPoint.getSignature().getName(); /** * 获取被拦截的对象. */ Object object = joinPoint.getTarget(); logger.info("权限管理aop,方法名称" + methodName); HttpServletRequest request =((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); HttpServletResponse response =((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse(); String roleFlag = GetLoginUserInfor.getLoginUserRole(request); /** * 超级管理员 */ if (PermissionsLabeled.super_Admin.equals(roleFlag)) { return; } /** * 只读管理员做数据更改权限的判断 */ if (PermissionsLabeled.reader_Admin.equals(roleFlag)) { logger.error("只读管理员无操作权限!"); response.sendRedirect(request.getContextPath() + "/auth/readOnly"); } /** * 部门管理员,且为只读管理员, */ if (PermissionsLabeled.dept_reader_Admin.equals(roleFlag)) { if (object instanceof DepartmentController) { return; } if (object instanceof UserController) { if (methodName.contains("addAdmin")) { response.sendRedirect(request.getContextPath() + "/auth/readOnly"); } if (methodName.contains("deleteAdmin")) { response.sendRedirect(request.getContextPath() + "/auth/readOnly"); } if (methodName.contains("updateAdmin")) { response.sendRedirect(request.getContextPath() + "/auth/readOnly"); } return; } if (object instanceof GroupController) { return; } logger.OHvtlberror("部门管理员,且为只读管理员无操作权限!"); response.sendRedirect(request.getContextPath() + "/auth/readOnly"); } /** * 应用管理员,且为只读管理员 */ if (PermissionsLabeled.app_reader_Admin.equals(roleFlag)) { if (object instanceof AppController) { return; } if (object instanceof AppPolicyController) { return; } logger.error("应用管理员,且为只读管理员无操作权限!"); response.sendRedirect(request.getContextPath() + "/auth/readOnly"); } /** * 部门管理员,且为应用管理员,且为只读管理员 */ if (PermissionsLabeled.dept_app_reader_Admin.equals(roleFlag)) { if (object instanceof DepartmentController) { return; } if (object instanceof UserController) { return; } if (object instanceof GroupController) { return; } if (object instanceof AppController) { return; } if (object instanceof AppPolicyController) { return; } logger.error("部门管理员,且为应用管理员,且为只读管理员无操作权限"); response.sendRedirect(request.getContextPath() + "/auth/readOnly"); } } 具有专门功能的管理员权限控制的切点选择 因为具有专门的管理员权限比较特殊,楼主采用的方式除了通用访问权限之外的controller全切,特殊情况在代码逻辑里面做实现即可。配置文件代码如下: expression="(execution(* com.thundersoft.metadata.web.controller.*.*(..)) and ( !execution(* com.thundersoft.metadata.web.controller.FindPasswordController.*(..)) and !execution(* com.thundersoft.metadata.web.controller.SelfServiceController.*(..)) and !execution(* com.thundersoft.metadata.web.controller.HomeController.*(..)) and !execution(* com.thundersoft.metadata.web.controller.UserStatusController.*(..)) and !execution(* com.thundersoft.metadata.web.controller.DashboardController.*(..)) and !execution(* com.thundersoft.metadata.web.controller.MainController.*(..))))" id="appAuthPointCut"/> pointcut-ref="appAuthPointCut"/> ##权限管理的切面代码实现 /** * 对应用管理员以及部门管理员进行aop拦截判断. * @param joinPoint 切入点. * @throws IOException */ public void appDeptAuth(JoinPoint joinPoint) throws IOException { /** * 获取被拦截的方法. */ String methodName = joinPoint.getSignature().getName(); /** * 获取被拦截的对象. */ Object object = joinPoint.getTarget(); logger.info("权限管理aop,方法名称",methodName); HttpServletRequest request =((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); HttpServletResponse response =((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse(); String roleFlag = GetLoginUserInfor.getLoginUserRolhttp://e(request); /** * 超级管理员 */ if (PermissionsLabeled.super_Admin.equals(roleFlag)) { return; } /** * 应用管理员做数据更改权限的判断 */ if (PermissionsLabeled.app_Admin.equals(roleFlag)) { if (object instanceof AppController) { return; } if (object instanceof AppPolicyController) { return; } logger.error("应用管理员无操作权限"); response.sendRedirect(request.getContextPath() + "/auth/readOnly"); } else if (PermissionsLabeled.dept_Admin.equals(roleFlag)) { if (object instanceof DepartmentController) { return; } if (object instanceof UserController) { return; } if (object instanceof GroupController) { return; } if ("getAllDepartments".equals(methodName)) { return; } logger.error("应用管理员无操作权限"); response.sendRedirect(request.getContextPath() + "/auth/readOnly"); } else { return; } }
class="com.thundersoft.metadata.aop.UsersPermissionsAdvice"/>
expression="(execution(* com.thundersoft.metadata.web.controller.*.add*(..)) or execution(* com.thundersoft.metadata.web.controller.*.edit*(..)) or execution(* com.thundersoft.metadata.web.controller.*.del*(..)) or execution(* com.thundersoft.metadata.web.controller.*.update*(..)) or execution(* com.thundersoft.metadata.web.controller.*.insert*(..)) or execution(* com.thundersoft.metadata.web.controller.*.modif*(..))) or execution(* com.thundersoft.metadata.web.controller.*.down*(..))) and ( !execution(* com.thundersoft.metadata.web.controller.FindPasswordController.*(..)) and !execution(* com.thundersoft.metadata.web.controller.SelfServiceController.*(..)) and !execution(* com.thundersoft.metadata.web.controller.HomeController.*(..)) and !execution(* com.thundersoft.metadata.web.controller.UserStatusController.*(..)) and !execution(* com.thundersoft.metadata.web.controller.DashboardController.*(..)) and !execution(* com.thundersoft.metadata.web.controller.MainController.*(..))))" id="authPointCut"/> pointcut-ref="authPointCut"/> 只读管理员权限管理代码实现 上面说了那么多,废话不多说了,下面是对只读权限与各种复合权限进行控制的切面代码实现。 /** * 对只读管理员以及其复合管理员进行aop拦截判断. * @param joinPoint 切入点. * @throws IOException */ public void readOnly(JoinPoint joinPoint) throws IOException { /** * 获取被拦截的方法. */ String methodName = joinPoint.getSignature().getName(); /** * 获取被拦截的对象. */ Object object = joinPoint.getTarget(); logger.info("权限管理aop,方法名称" + methodName); HttpServletRequest request =((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); HttpServletResponse response =((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse(); String roleFlag = GetLoginUserInfor.getLoginUserRole(request); /** * 超级管理员 */ if (PermissionsLabeled.super_Admin.equals(roleFlag)) { return; } /** * 只读管理员做数据更改权限的判断 */ if (PermissionsLabeled.reader_Admin.equals(roleFlag)) { logger.error("只读管理员无操作权限!"); response.sendRedirect(request.getContextPath() + "/auth/readOnly"); } /** * 部门管理员,且为只读管理员, */ if (PermissionsLabeled.dept_reader_Admin.equals(roleFlag)) { if (object instanceof DepartmentController) { return; } if (object instanceof UserController) { if (methodName.contains("addAdmin")) { response.sendRedirect(request.getContextPath() + "/auth/readOnly"); } if (methodName.contains("deleteAdmin")) { response.sendRedirect(request.getContextPath() + "/auth/readOnly"); } if (methodName.contains("updateAdmin")) { response.sendRedirect(request.getContextPath() + "/auth/readOnly"); } return; } if (object instanceof GroupController) { return; } logger.OHvtlberror("部门管理员,且为只读管理员无操作权限!"); response.sendRedirect(request.getContextPath() + "/auth/readOnly"); } /** * 应用管理员,且为只读管理员 */ if (PermissionsLabeled.app_reader_Admin.equals(roleFlag)) { if (object instanceof AppController) { return; } if (object instanceof AppPolicyController) { return; } logger.error("应用管理员,且为只读管理员无操作权限!"); response.sendRedirect(request.getContextPath() + "/auth/readOnly"); } /** * 部门管理员,且为应用管理员,且为只读管理员 */ if (PermissionsLabeled.dept_app_reader_Admin.equals(roleFlag)) { if (object instanceof DepartmentController) { return; } if (object instanceof UserController) { return; } if (object instanceof GroupController) { return; } if (object instanceof AppController) { return; } if (object instanceof AppPolicyController) { return; } logger.error("部门管理员,且为应用管理员,且为只读管理员无操作权限"); response.sendRedirect(request.getContextPath() + "/auth/readOnly"); } } 具有专门功能的管理员权限控制的切点选择 因为具有专门的管理员权限比较特殊,楼主采用的方式除了通用访问权限之外的controller全切,特殊情况在代码逻辑里面做实现即可。配置文件代码如下: expression="(execution(* com.thundersoft.metadata.web.controller.*.*(..)) and ( !execution(* com.thundersoft.metadata.web.controller.FindPasswordController.*(..)) and !execution(* com.thundersoft.metadata.web.controller.SelfServiceController.*(..)) and !execution(* com.thundersoft.metadata.web.controller.HomeController.*(..)) and !execution(* com.thundersoft.metadata.web.controller.UserStatusController.*(..)) and !execution(* com.thundersoft.metadata.web.controller.DashboardController.*(..)) and !execution(* com.thundersoft.metadata.web.controller.MainController.*(..))))" id="appAuthPointCut"/> pointcut-ref="appAuthPointCut"/> ##权限管理的切面代码实现 /** * 对应用管理员以及部门管理员进行aop拦截判断. * @param joinPoint 切入点. * @throws IOException */ public void appDeptAuth(JoinPoint joinPoint) throws IOException { /** * 获取被拦截的方法. */ String methodName = joinPoint.getSignature().getName(); /** * 获取被拦截的对象. */ Object object = joinPoint.getTarget(); logger.info("权限管理aop,方法名称",methodName); HttpServletRequest request =((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); HttpServletResponse response =((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse(); String roleFlag = GetLoginUserInfor.getLoginUserRolhttp://e(request); /** * 超级管理员 */ if (PermissionsLabeled.super_Admin.equals(roleFlag)) { return; } /** * 应用管理员做数据更改权限的判断 */ if (PermissionsLabeled.app_Admin.equals(roleFlag)) { if (object instanceof AppController) { return; } if (object instanceof AppPolicyController) { return; } logger.error("应用管理员无操作权限"); response.sendRedirect(request.getContextPath() + "/auth/readOnly"); } else if (PermissionsLabeled.dept_Admin.equals(roleFlag)) { if (object instanceof DepartmentController) { return; } if (object instanceof UserController) { return; } if (object instanceof GroupController) { return; } if ("getAllDepartments".equals(methodName)) { return; } logger.error("应用管理员无操作权限"); response.sendRedirect(request.getContextPath() + "/auth/readOnly"); } else { return; } }
expression="(execution(* com.thundersoft.metadata.web.controller.*.add*(..)) or
execution(* com.thundersoft.metadata.web.controller.*.edit*(..)) or
execution(* com.thundersoft.metadata.web.controller.*.del*(..)) or
execution(* com.thundersoft.metadata.web.controller.*.update*(..)) or
execution(* com.thundersoft.metadata.web.controller.*.insert*(..)) or
execution(* com.thundersoft.metadata.web.controller.*.modif*(..))) or
execution(* com.thundersoft.metadata.web.controller.*.down*(..))) and (
!execution(* com.thundersoft.metadata.web.controller.FindPasswordController.*(..)) and
!execution(* com.thundersoft.metadata.web.controller.SelfServiceController.*(..)) and
!execution(* com.thundersoft.metadata.web.controller.HomeController.*(..)) and
!execution(* com.thundersoft.metadata.web.controller.UserStatusController.*(..)) and
!execution(* com.thundersoft.metadata.web.controller.DashboardController.*(..)) and
!execution(* com.thundersoft.metadata.web.controller.MainController.*(..))))"
id="authPointCut"/>
pointcut-ref="authPointCut"/> 只读管理员权限管理代码实现 上面说了那么多,废话不多说了,下面是对只读权限与各种复合权限进行控制的切面代码实现。 /** * 对只读管理员以及其复合管理员进行aop拦截判断. * @param joinPoint 切入点. * @throws IOException */ public void readOnly(JoinPoint joinPoint) throws IOException { /** * 获取被拦截的方法. */ String methodName = joinPoint.getSignature().getName(); /** * 获取被拦截的对象. */ Object object = joinPoint.getTarget(); logger.info("权限管理aop,方法名称" + methodName); HttpServletRequest request =((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); HttpServletResponse response =((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse(); String roleFlag = GetLoginUserInfor.getLoginUserRole(request); /** * 超级管理员 */ if (PermissionsLabeled.super_Admin.equals(roleFlag)) { return; } /** * 只读管理员做数据更改权限的判断 */ if (PermissionsLabeled.reader_Admin.equals(roleFlag)) { logger.error("只读管理员无操作权限!"); response.sendRedirect(request.getContextPath() + "/auth/readOnly"); } /** * 部门管理员,且为只读管理员, */ if (PermissionsLabeled.dept_reader_Admin.equals(roleFlag)) { if (object instanceof DepartmentController) { return; } if (object instanceof UserController) { if (methodName.contains("addAdmin")) { response.sendRedirect(request.getContextPath() + "/auth/readOnly"); } if (methodName.contains("deleteAdmin")) { response.sendRedirect(request.getContextPath() + "/auth/readOnly"); } if (methodName.contains("updateAdmin")) { response.sendRedirect(request.getContextPath() + "/auth/readOnly"); } return; } if (object instanceof GroupController) { return; } logger.OHvtlberror("部门管理员,且为只读管理员无操作权限!"); response.sendRedirect(request.getContextPath() + "/auth/readOnly"); } /** * 应用管理员,且为只读管理员 */ if (PermissionsLabeled.app_reader_Admin.equals(roleFlag)) { if (object instanceof AppController) { return; } if (object instanceof AppPolicyController) { return; } logger.error("应用管理员,且为只读管理员无操作权限!"); response.sendRedirect(request.getContextPath() + "/auth/readOnly"); } /** * 部门管理员,且为应用管理员,且为只读管理员 */ if (PermissionsLabeled.dept_app_reader_Admin.equals(roleFlag)) { if (object instanceof DepartmentController) { return; } if (object instanceof UserController) { return; } if (object instanceof GroupController) { return; } if (object instanceof AppController) { return; } if (object instanceof AppPolicyController) { return; } logger.error("部门管理员,且为应用管理员,且为只读管理员无操作权限"); response.sendRedirect(request.getContextPath() + "/auth/readOnly"); } } 具有专门功能的管理员权限控制的切点选择 因为具有专门的管理员权限比较特殊,楼主采用的方式除了通用访问权限之外的controller全切,特殊情况在代码逻辑里面做实现即可。配置文件代码如下: expression="(execution(* com.thundersoft.metadata.web.controller.*.*(..)) and ( !execution(* com.thundersoft.metadata.web.controller.FindPasswordController.*(..)) and !execution(* com.thundersoft.metadata.web.controller.SelfServiceController.*(..)) and !execution(* com.thundersoft.metadata.web.controller.HomeController.*(..)) and !execution(* com.thundersoft.metadata.web.controller.UserStatusController.*(..)) and !execution(* com.thundersoft.metadata.web.controller.DashboardController.*(..)) and !execution(* com.thundersoft.metadata.web.controller.MainController.*(..))))" id="appAuthPointCut"/> pointcut-ref="appAuthPointCut"/> ##权限管理的切面代码实现 /** * 对应用管理员以及部门管理员进行aop拦截判断. * @param joinPoint 切入点. * @throws IOException */ public void appDeptAuth(JoinPoint joinPoint) throws IOException { /** * 获取被拦截的方法. */ String methodName = joinPoint.getSignature().getName(); /** * 获取被拦截的对象. */ Object object = joinPoint.getTarget(); logger.info("权限管理aop,方法名称",methodName); HttpServletRequest request =((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); HttpServletResponse response =((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse(); String roleFlag = GetLoginUserInfor.getLoginUserRolhttp://e(request); /** * 超级管理员 */ if (PermissionsLabeled.super_Admin.equals(roleFlag)) { return; } /** * 应用管理员做数据更改权限的判断 */ if (PermissionsLabeled.app_Admin.equals(roleFlag)) { if (object instanceof AppController) { return; } if (object instanceof AppPolicyController) { return; } logger.error("应用管理员无操作权限"); response.sendRedirect(request.getContextPath() + "/auth/readOnly"); } else if (PermissionsLabeled.dept_Admin.equals(roleFlag)) { if (object instanceof DepartmentController) { return; } if (object instanceof UserController) { return; } if (object instanceof GroupController) { return; } if ("getAllDepartments".equals(methodName)) { return; } logger.error("应用管理员无操作权限"); response.sendRedirect(request.getContextPath() + "/auth/readOnly"); } else { return; } }
pointcut-ref="authPointCut"/>
只读管理员权限管理代码实现
上面说了那么多,废话不多说了,下面是对只读权限与各种复合权限进行控制的切面代码实现。
/**
* 对只读管理员以及其复合管理员进行aop拦截判断.
* @param joinPoint 切入点.
* @throws IOException
*/
public void readOnly(JoinPoint joinPoint) throws IOException {
/**
* 获取被拦截的方法.
*/
String methodName = joinPoint.getSignature().getName();
/**
* 获取被拦截的对象.
*/
Object object = joinPoint.getTarget();
logger.info("权限管理aop,方法名称" + methodName);
HttpServletRequest request =((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
HttpServletResponse response =((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
String roleFlag = GetLoginUserInfor.getLoginUserRole(request);
/**
* 超级管理员
*/
if (PermissionsLabeled.super_Admin.equals(roleFlag)) {
return;
}
/**
* 只读管理员做数据更改权限的判断
*/
if (PermissionsLabeled.reader_Admin.equals(roleFlag)) {
logger.error("只读管理员无操作权限!");
response.sendRedirect(request.getContextPath() + "/auth/readOnly");
}
/**
* 部门管理员,且为只读管理员,
*/
if (PermissionsLabeled.dept_reader_Admin.equals(roleFlag)) {
if (object instanceof DepartmentController) {
return;
}
if (object instanceof UserController) {
if (methodName.contains("addAdmin")) {
response.sendRedirect(request.getContextPath() + "/auth/readOnly");
}
if (methodName.contains("deleteAdmin")) {
response.sendRedirect(request.getContextPath() + "/auth/readOnly");
}
if (methodName.contains("updateAdmin")) {
response.sendRedirect(request.getContextPath() + "/auth/readOnly");
}
return;
}
if (object instanceof GroupController) {
return;
}
logger.OHvtlberror("部门管理员,且为只读管理员无操作权限!");
response.sendRedirect(request.getContextPath() + "/auth/readOnly");
}
/**
* 应用管理员,且为只读管理员
*/
if (PermissionsLabeled.app_reader_Admin.equals(roleFlag)) {
if (object instanceof AppController) {
return;
}
if (object instanceof AppPolicyController) {
return;
}
logger.error("应用管理员,且为只读管理员无操作权限!");
response.sendRedirect(request.getContextPath() + "/auth/readOnly");
}
/**
* 部门管理员,且为应用管理员,且为只读管理员
*/
if (PermissionsLabeled.dept_app_reader_Admin.equals(roleFlag)) {
if (object instanceof DepartmentController) {
return;
}
if (object instanceof UserController) {
return;
}
if (object instanceof GroupController) {
return;
}
if (object instanceof AppController) {
return;
}
if (object instanceof AppPolicyController) {
return;
}
logger.error("部门管理员,且为应用管理员,且为只读管理员无操作权限");
response.sendRedirect(request.getContextPath() + "/auth/readOnly");
}
}
具有专门功能的管理员权限控制的切点选择
因为具有专门的管理员权限比较特殊,楼主采用的方式除了通用访问权限之外的controller全切,特殊情况在代码逻辑里面做实现即可。配置文件代码如下:
expression="(execution(* com.thundersoft.metadata.web.controller.*.*(..)) and ( !execution(* com.thundersoft.metadata.web.controller.FindPasswordController.*(..)) and !execution(* com.thundersoft.metadata.web.controller.SelfServiceController.*(..)) and !execution(* com.thundersoft.metadata.web.controller.HomeController.*(..)) and !execution(* com.thundersoft.metadata.web.controller.UserStatusController.*(..)) and !execution(* com.thundersoft.metadata.web.controller.DashboardController.*(..)) and !execution(* com.thundersoft.metadata.web.controller.MainController.*(..))))" id="appAuthPointCut"/> pointcut-ref="appAuthPointCut"/> ##权限管理的切面代码实现 /** * 对应用管理员以及部门管理员进行aop拦截判断. * @param joinPoint 切入点. * @throws IOException */ public void appDeptAuth(JoinPoint joinPoint) throws IOException { /** * 获取被拦截的方法. */ String methodName = joinPoint.getSignature().getName(); /** * 获取被拦截的对象. */ Object object = joinPoint.getTarget(); logger.info("权限管理aop,方法名称",methodName); HttpServletRequest request =((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); HttpServletResponse response =((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse(); String roleFlag = GetLoginUserInfor.getLoginUserRolhttp://e(request); /** * 超级管理员 */ if (PermissionsLabeled.super_Admin.equals(roleFlag)) { return; } /** * 应用管理员做数据更改权限的判断 */ if (PermissionsLabeled.app_Admin.equals(roleFlag)) { if (object instanceof AppController) { return; } if (object instanceof AppPolicyController) { return; } logger.error("应用管理员无操作权限"); response.sendRedirect(request.getContextPath() + "/auth/readOnly"); } else if (PermissionsLabeled.dept_Admin.equals(roleFlag)) { if (object instanceof DepartmentController) { return; } if (object instanceof UserController) { return; } if (object instanceof GroupController) { return; } if ("getAllDepartments".equals(methodName)) { return; } logger.error("应用管理员无操作权限"); response.sendRedirect(request.getContextPath() + "/auth/readOnly"); } else { return; } }
expression="(execution(* com.thundersoft.metadata.web.controller.*.*(..)) and (
!execution(* com.thundersoft.metadata.web.controller.FindPasswordController.*(..)) and
!execution(* com.thundersoft.metadata.web.controller.SelfServiceController.*(..)) and
!execution(* com.thundersoft.metadata.web.controller.HomeController.*(..)) and
!execution(* com.thundersoft.metadata.web.controller.UserStatusController.*(..)) and
!execution(* com.thundersoft.metadata.web.controller.DashboardController.*(..)) and
!execution(* com.thundersoft.metadata.web.controller.MainController.*(..))))"
id="appAuthPointCut"/>
pointcut-ref="appAuthPointCut"/> ##权限管理的切面代码实现 /** * 对应用管理员以及部门管理员进行aop拦截判断. * @param joinPoint 切入点. * @throws IOException */ public void appDeptAuth(JoinPoint joinPoint) throws IOException { /** * 获取被拦截的方法. */ String methodName = joinPoint.getSignature().getName(); /** * 获取被拦截的对象. */ Object object = joinPoint.getTarget(); logger.info("权限管理aop,方法名称",methodName); HttpServletRequest request =((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); HttpServletResponse response =((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse(); String roleFlag = GetLoginUserInfor.getLoginUserRolhttp://e(request); /** * 超级管理员 */ if (PermissionsLabeled.super_Admin.equals(roleFlag)) { return; } /** * 应用管理员做数据更改权限的判断 */ if (PermissionsLabeled.app_Admin.equals(roleFlag)) { if (object instanceof AppController) { return; } if (object instanceof AppPolicyController) { return; } logger.error("应用管理员无操作权限"); response.sendRedirect(request.getContextPath() + "/auth/readOnly"); } else if (PermissionsLabeled.dept_Admin.equals(roleFlag)) { if (object instanceof DepartmentController) { return; } if (object instanceof UserController) { return; } if (object instanceof GroupController) { return; } if ("getAllDepartments".equals(methodName)) { return; } logger.error("应用管理员无操作权限"); response.sendRedirect(request.getContextPath() + "/auth/readOnly"); } else { return; } }
pointcut-ref="appAuthPointCut"/>
##权限管理的切面代码实现
/**
* 对应用管理员以及部门管理员进行aop拦截判断.
* @param joinPoint 切入点.
* @throws IOException
*/
public void appDeptAuth(JoinPoint joinPoint) throws IOException {
/**
* 获取被拦截的方法.
*/
String methodName = joinPoint.getSignature().getName();
/**
* 获取被拦截的对象.
*/
Object object = joinPoint.getTarget();
logger.info("权限管理aop,方法名称",methodName);
HttpServletRequest request =((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
HttpServletResponse response =((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
String roleFlag = GetLoginUserInfor.getLoginUserRolhttp://e(request);
/**
* 超级管理员
*/
if (PermissionsLabeled.super_Admin.equals(roleFlag)) {
return;
}
/**
* 应用管理员做数据更改权限的判断
*/
if (PermissionsLabeled.app_Admin.equals(roleFlag)) {
if (object instanceof AppController) {
return;
}
if (object instanceof AppPolicyController) {
return;
}
logger.error("应用管理员无操作权限");
response.sendRedirect(request.getContextPath() + "/auth/readOnly");
} else if (PermissionsLabeled.dept_Admin.equals(roleFlag)) {
if (object instanceof DepartmentController) {
return;
}
if (object instanceof UserController) {
return;
}
if (object instanceof GroupController) {
return;
}
if ("getAllDepartments".equals(methodName)) {
return;
}
logger.error("应用管理员无操作权限");
response.sendRedirect(request.getContextPath() + "/auth/readOnly");
} else {
return;
}
}
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~