天天看点

十六、WEB项目开发之按照权限显示不同的菜单

  接十五、WEB项目开发之权限管理系统​,在权限分配系统做好以后,我们需要开发“按照分配的权限,显示不同的界面”功能。

  基本流程是:

  (一)在Session拦截器中,将用户能操作的所有菜单放入Session中

  (二)在请求首页的时候,从Session中获取当前用户能操作的所有菜单,使用JS动态显示菜单

  (三)在Session拦截器中,将用户能操作的所有Action放入Session中

  (四)创建权限标签“auth.tag”,所有使用该标签的地方,需要传入访问路径和能操作的方法,同时在标签中验证当前用户能操作的Action是否包含该路径和方法。若包含,显示使用该标签包裹的界面;不包含,则不显示。

  (1)标签文件auth.tag

<%@ tag import="com.imooc.util.CommonUtil" %>
<!-- 设置编码 -->
<%@ tag language="java" pageEncoding="UTF-8" %>
<!-- 设置自定义属性:来接收使用这个标签传进来的函数名参数 -->
<%@ attribute type="java.lang.String" name="url" required="true" %>

<%@ attribute type="java.lang.String" name="method" required="true" %>

<%--好神奇,竟然凭空冒出来一个session--%>
<% if (CommonUtil.contain(session ,url, method)){%>
    <jsp:doBody/>
<%}%>      
/**
     * 判断当前用户是否具有某项操作的权限
     * @param session HttpSession
     * @param url 路径
     * @param method 操作:R查   CR 增|查   CRU 增|查|改   CRUD 增|查|改|删
     * @return true 包含该权限 false 无该权限
     */
    public static boolean contain(HttpSession session, String url, String method){
        List<Action> actionList = (List<Action>) session.getAttribute(SessionKeyConst.SESSION_ACTION_INFO);
        if (CollectionUtils.isNotEmpty(actionList)){
            //将method转换成代码
            for (Action action : actionList){
                if (CommonUtil.allIsNotBlank(action.getUrl(), action.getMethod(), url, method)){
                    /*
                     * 举例:
                     *     假设数据库中,广告管理的url是“/ad”:表示访问广告管理的任何功能都可以
                     * method是“CRU”:表示可以增、查、改。
                     *     若目标路径是"/ad/addInit",method是“U”,那么则可以通过权限检查。
                     *     只要目标路径在数据库的路径之下:url.contains(action.getUrl())
                     *     目标方法在数据库的方法之内:action.getMethod().contains(method)
                     *     即可通过权限检查
                     * 备注:
                     *     注意url和method是包含还是被包含!!
                     *
                     */
                    if (url.contains(action.getUrl()) && action.getMethod().contains(method)){
                        return true;
                    }
                }
            }
        }
        return false;
    }      
<t:auth url="/ad/search" method="R">
    <input class="tabSub" value="查询" onclick="search('1',$('#title').val());" type="button"/>&nbsp;&nbsp;&nbsp;&nbsp;
</t:auth>
<t:auth url="/ad/addInit" method="C">
    <input class="tabSub" value="添加" onclick="location.href='${basePath}/ad/addInit'" type="button"/>
</t:auth>