权限控制
①登录时查询登录权限
LoginController
//登陆成功获得登陆用户的菜单列表、按钮列表、权限范围列表
//菜单列表最终展示在主页面左侧,用layui-tree组装(要求List集合)
Map<String,Object> map=userService.findUserAuth(user.getUid());
req.getSession().setAttribute("loginAuth",map);
将所有的权限范围组成Set集合,方便查找
将所有的菜单组成新的List
将信息装入session
UserService
public Map<String,Object> findUserAuth(int uid) {//语雀6.1
List<Fun> funs = funDao.findFunByUser(uid);
//funs中装载着所有的权限功能,我们想要的,一个是只装有权限范围的列表
//一个是只装有菜单的列表(使用layui-tree组件展示,要求子父功能是包含关系)List<Fun>
//只装有权限范围的列表
Set<String> auths = new HashSet<>();
for (Fun fun:funs) {
auths.add(fun.getAuth());
}
//只装有菜单的列表List<Fun>->List<FunVo>
List<FunVO> menus=reload(funs,-1);
Map<String,Object> map=new HashMap<>();
map.put("auths",auths);
map.put("menus",menus);
return map;
}
//在所有的功能菜单中,逐层组装,理论上从第一层 语雀6.1
private List<FunVO> reload(List<Fun> funs, int level) {
List<FunVO> vos = new ArrayList<>();//装载本层组装后的菜单
for (Fun fun : funs) {
if (fun.getFtype().equals(1) && fun.getPid().equals(level)) {
//找到了一个属于当前层级的菜单
//要找到当前菜单的子级,当前菜单的fid就是子级菜单的pid
String title = "";
if (fun.getFhref() != null && !"".equals(fun.getFhref())) {
//当前菜单点击后需要发送请求
title = "<a href='" + fun.getFhref() + "' target='content'>" + fun.getFname() + "</a>";
} else {
title = fun.getFname();
}
FunVO funVO = new FunVO(title, fun.getFid(), reload(funs, fun.getFid()));
vos.add(funVO);
}
}
return vos;
}
FunDao
@Select("select * from t_fun where fid in" +
" (select fid from t_role_fun where rid in" +
" (select rid from t_user_role where uid = #{uid}))")
public List<Fun> findFunByUser(int uid);//语雀6.1
FunVo
package vo;
import java.util.List;
//当前存储的数据是给视图用的
public class FunVO {
private String title;//fname
private Integer id;//fid
private List<FunVO> children;//装载当前菜单的子菜单
public FunVO() {}
public FunVO(String title, Integer id, List<FunVO> children) {
this.title = title;
this.id = id;
this.children = children;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public List<FunVO> getChildren() {
return children;
}
public void setChildren(List<FunVO> children) {
this.children = children;
}
}
②通过权限控制菜单
UserController
@RequestMapping("/findUserMenus")
@ResponseBody
public List<FunVO> findUserMenus(HttpSession session){
Map<String,Object> map=(Map<String, Object>) session.getAttribute("loginAuth");
return (List<FunVO>) map.get("menus");
}
main.jsp
layui.use(['tree', 'util'], function () {
var tree = layui.tree
, layer = layui.layer
, util = layui.util
, $ = layui.$;
//需要获得session中存储的权限菜单信息(ajax)
$.ajax({
type:'get',
url:'findUserMenus',
data:{},
synch:true,
success:function (menus) {
//通过一个前端js的json反序列化处理,menus就变成了js语法的集合/数组
//常规用法
tree.render({
elem:'#myTree',//使用标签的id,表示将菜单的数据显示在指定的标签中
data:menus
})
},
dataType:'json'//告诉jQuery,将响应回来的字符串json反序列化
});
//常规用法
tree.render({
elem: '#myTree' //默认是点击节点可进行收缩,使用标签的id,表示将菜单的数据显示在指定标签中
, data: data1
});
});
③通过权限控制按钮
写法:
<c:if test="${sessionScope.loginAuth.auths.contains('com.qxgl.auth.user.delete')}">
<a href="#" class="layui-btn layui-btn-danger layui-btn-xs">
<i class="layui-icon"></i>删除
</a>
</c:if>