接十五、WEB项目开发之权限管理系统,在权限分配系统做好以后,我们需要开发“按照分配的权限,显示不同的界面”功能。 基本流程是: (一)在Session拦截器中,将
接十五、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/>
<%}%>
(2)CommonUtil.contain(session ,url, method)方法
/*** 判断当前用户是否具有某项操作的权限
* @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;
}
(3)使用该标签
<t:auth url="/ad/search" method="R"><input class="tabSub" value="查询" onclick="search('1',$('#title').val());" type="button"/>
</t:auth>
<t:auth url="/ad/addInit" method="C">
<input class="tabSub" value="添加" onclick="location.href='${basePath}/ad/addInit'" type="button"/>
</t:auth>