问题描述
假设张三是超级管理员、李四和王五是普通系统用户。
纵向越权:
指的是,当李四或者王五登录系统后,可以操作张三用户才能操作的服务器请求。(李四或王五看不到操作按钮,但是知道对应按钮的URL请求地址和参数名)
横向越权:
指的是,当李四登录系统后,可以修改王五用户的个人信息
处理方案:
1、常规的处理方案
使用权限框架(以shiro为例)处理,重写授权方法,这个方法每次URL请求都会调用,可以在这里做用户权限判断
public class MyRealm extends AuthorizingRealm { private UserService userService; public UserService getUserService() { return userService; } public void setUserService(UserService userService) { this.userService = userService; } @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { 在这里进行横向越权与纵向越权的处理。 return null; }
这个方案针对于没有使用缓存技术的系统而言,有所缺陷,由于授权方法每个URL请求发出都会被调用,如果不使用缓存的话,性能十分低下。
2、spring aop进行处理
直接上代码
@Component @Aspect public class AuthAspect { @Around("execution(* *..PermissionService.insert*(..)) " + "|| execution(* *..PermissionService.delete*(..)) " + "|| execution(* *..PermissionService.update*(..)) " + "|| execution(* *..RoleService.insert*(..)) " + "|| execution(* *..RoleService.delete*(..)) " + "|| execution(* *..RoleService.update*(..)) " + "|| execution(* *..UserService.insert*(..)) " + "|| execution(* *..UserService.delete*(..))") public Object invoke(ProceedingJoinPoint args) throws Throwable{ HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); // 当前会话获取的用户 HttpSession session = request.getSession(); User currentUser = (User) session.getAttribute("currentUser"); Object[] params = args.getArgs(); if(currentUser == null || currentUser.getUid() != 1){ return null; } Object proceed = args.proceed(params); return proceed; } }
代码的意思是,当发送到URL请求涉及到用户增删、角色增删改、权限增删改时,需要判断当前会话里的用户是超级管理员张三(uid=1),否者不能做权限相关任何操作。
注:这里只提供解决问题的思路,这里针对的是小系统,代码里可以写死超级管理员,相应代码还需做对应的修改。
备案号:湘ICP备19000029号
Copyright © 2018-2019 javaxl晓码阁 版权所有