java aspect 权限_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.error("部门管理员,且为只读管理员无操作权限!");

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.getLoginUserRole(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;

}

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值