医药采购之操作权限拦截器

本文介绍了一种基于Spring MVC的权限拦截器实现方案,通过配置公开访问地址和用户操作权限,确保用户只能访问其被授权的功能模块。

用户登录成功根据用户角色从数据库查询用户的操作权限(操作链接),可以进行权限拦截校验,并将操作权限存储至session中,在拦截器中获取用户的操作权限,用户请求url时,如果url在权限操作内放行可以继续操作,如果不在这个范围内拦截,提示用户:无此操作权限。
这里写图片描述

权限拦截
常用的有过虑器方式、框架拦截器(springmvc拦截,struts拦截器等)
配置公共访问地址

公开访问地址在resources/commonActions.properties文件中进行配置。
权限拦截流程:

这里写图片描述

权限拦截器


/**
 * 权限拦截器
 * @author Thinkpad
 *
 */
public class PermissionInterceptor implements HandlerInterceptor {

    //进入action方法前要执行
    @Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {
        // TODO Auto-generated method stub
        //用户访问地址:
        String url  = request.getRequestURI();

        //判断是否公开权限,如果是放行

        //获取公开地址    
        List<String> url_list_open= ResourcesUtil.gekeyList(Config.ANONYMOUS_ACTIONS);

        //便利公开的地址,如果用户访问的地址url包括了公开的地址,则说明用户访问的地址就是公开的地址
        for(String url_v:url_list_open){
            if(url.contains(url_v)){
                return true;//放行,用户继续访问
            }
        }

        //校验用户访问的是否是公共权限
        //获取公共权限地址  
        List<String> url_list= ResourcesUtil.gekeyList(Config.COMMON_ACTIONS);

        //便利公开的地址,如果用户访问的地址url包括了公开的地址,则说明用户访问的地址就是公开的地址
        for(String url_v:url_list){
            if(url.contains(url_v)){
                return true;//放行,用户继续访问
            }
        }

        //从session获取用户权限信息

        HttpSession session  =request.getSession();

        ActiveUser activeUser = (ActiveUser)session.getAttribute(Config.ACTIVEUSER_KEY);

        //获取用户操作权限
        List<Operation> operation_list = activeUser.getOperationList();
        //校验用户访问地址是否在用户权限范围内
        for(Operation operation:operation_list){
             String url_operation = operation.getActionUrl();
             if(url.contains(url_operation)){
                    return true;//放行,用户继续访问
             }
        }       

        //跳转到页面
        request.getRequestDispatcher("/WEB-INF/jsp/base/refuse.jsp").forward(request, response);
        return false;
    }

    //action方法执行完但返回视图前执行此方法
    @Override
    public void postHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        // TODO Auto-generated method stub

    }

    //action方法执行完且视图返回(渲染)完成执行此方法
    @Override
    public void afterCompletion(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        // TODO Auto-generated method stub

    }

}

在springmvc.xml文件中 配置拦截器链


    <!-- 拦截器 -->
    <mvc:interceptors>
        <!-- 多个拦截器,顺序执行 -->
        <!-- 用户身份校验的拦截器 -->
        <mvc:interceptor>
            <mvc:mapping path="/**" />
            <bean class="yycg.base.filter.LoginInterceptor"></bean>
        </mvc:interceptor>
        <!--用户权限拦截器  -->
        <mvc:interceptor>
            <mvc:mapping path="/**" />
            <bean class="yycg.base.filter.PermissionInterceptor"></bean>
        </mvc:interceptor>

    </mvc:interceptors>

拦截器抛出异常
由于本系统提交结果为json格式数据,页面上由js函数进行解析,如果这里拦截器重定向到一个页面会导致js函数无法正确解析,这里需要将:

request.getRequestDispatcher("/WEB-INF/jsp/base/refuse.jsp").forward(request, response);
//改为:
//105表示“没有操作权限”
ResultUtil.throwExcepion(ResultUtil.createFail(Config.MESSAGE, 105, null));

异常处理器需要在处理返回页面方法中添加如下处理代码:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值