博客信息

纵向越权与横向越权的处理方案

发布时间:『 2019-03-05 01:16』  博客类别:解决方案  阅读(1800)

问题描述

假设张三是超级管理员、李四和王五是普通系统用户。

纵向越权:

指的是,当李四或者王五登录系统后,可以操作张三用户才能操作的服务器请求。(李四或王五看不到操作按钮,但是知道对应按钮的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晓码阁 版权所有