二. 权限认证
目录结构如下所示:
二.一 认证和授权
在登录的方法里面,进行验证,如果查询出有这个员工的信息,就去查询这个员工的权限数据。
这个方法 写在 UserServlet 的 login 方法里面。
二.一.一 登录方法进行认证和查询权限
public void login(HttpServletRequest req,HttpServletResponse resp){ //将请求信息,封装到对象里面。 User userInfo=super.reqParamToBean(req,User.class); userService=new UserServiceImpl(); //从数据库中查询密码 User user=userService.login(userInfo); if(user!=null){ //说明登录成功,放置到session里面 HttpSession session=req.getSession(); session.setAttribute("loginUser",user); //查询一下,该员工的 按钮权限信息。 privilegeService=new PrivilegeServiceImpl(); List<Privilege> privilegeList= privilegeService.getPrivilegeByUId(user.getId(),2); List<String> priCodeList=new ArrayList<String>(); for(Privilege pri:privilegeList){ if(pri.getPercode()!=null){ //放置标识 priCodeList.add(pri.getPercode()); } } JsonConfig jsonConfig = new JsonConfig(); JSONArray objData=JSONArray.fromObject(priCodeList,jsonConfig); JSONObject objMap=new JSONObject(); objMap.put("data",objData); //转换成 json 字符串对象 session.setAttribute("privilegeList",objMap.toString()); //登录成功 super.boolean2Json(resp, true); }else{ //代码为001,表示用户名或者密码错误 super.map2Json(resp,"001"); } }
如果登录成功,那么就跳转到 main.jsp 的页面。
(该代码存放在 login.jsp 的页面)
二.一.二 权限菜单展示
main.jsp 的左侧菜单,是动态地读取出来的,然后渲染到页面上。
二.一.二.一 菜单 div
<!-- 存放左侧的菜单事件 --> <div class="leftmenu" id="leftmenu"> <div id="leftmenu_0" class="leftmenu-item"> </div> </div>
二.一.二.二 根据登录者id 动态查询权限,渲染到页面 leftmenu 上
/*获取所有的权限信息*/ function getAllPrivilege(){ //取出当前登录的用户信息 var userId='${sessionScope.loginUser.id}'; console.log("id:"+userId); $.post("Privilege?method=getPrivilegeByUId",{userId:userId},function(data){ //查询出权限 var allPrivilegeList=data.data; createMenuByData($("#leftmenu_0"),allPrivilegeList); }) } //执行获取权限的方法 getAllPrivilege(); //渲染到页面里面 function createMenuByData(target,allPrivilegeList){ target.empty(); var firstMenus=[]; var secondMenus=[]; $.each(allPrivilegeList,function(idx,item){ //有父 if(item.pid){ secondMenus.push(item); }else{ firstMenus.push(item); } }) $.each(firstMenus,function(idx,item){ var $dl=$("<dl id='"+item.id+"'><dt>"+item.name+"</dt></dl>"); var $dd=$("<dd id='"+item.id+"'></dd>"); var $ul=$('<ul id="'+item.id+'" class="clearfix"></ul>'); $dd.append($ul); $dl.append($dd); $.each(secondMenus,function(idx1,item1){ if(item1.pid==item.id){ var $li=$('<li id="'+item1.id+'"><a href="javascript:void(0);" data-link="'+item1.url+'">'+item1.name+'</a></li>'); $ul.append($li); } }) target.append($dl); }) }
二.一.二.三 根据用户编号,查询该用户的权限
PrivilegeServiceImpl 实现类里面的 getPrivilegeByUId() 方法。
二.一.二.四 展示 按钮的权限
上面一部分,可以根据登录者的id 动态地展示 菜单权限,下面根据登录者的id 动态地展示页面上按钮的权限。
用 部门表 dept 进行举例。
- 设置标识,后面根据标识来控制按钮的显示与隐藏
<script> //获取权限 var privilegeList='<%=session.getAttribute("privilegeList")%>'; //console.log("值是:"+privilegeList+","+typeof(privilegeList)); var objPrivilegeList=JSON.parse(privilegeList); $.each(objPrivilegeList.data,function(idx,item){ //将标识存放在 sessionStorage 里面,进行暂时的保存。 sessionStorage.setItem(item,true); }) </script> <script type="text/javascript" src="${pageContext.request.contextPath}/static/js/dept.js"></script>
- dept.js 里面,从sessionStorage 里面取出标识,进行显隐
二.一.三 退出登录按钮
二.一.三.一 前端页面实现
<div class="right"> <span> <a href="javascript:void(0);" onclick="window.location.href='User?method=logout'">退出</a> </span> </div>
二.一.三.二 退出后台实现
//退出登录 public String logout(HttpServletRequest req,HttpServletResponse resp){ HttpSession session=req.getSession(); //注销 session.invalidate(); return "login"; }
二.二 不同用户地验证测试
二.二.一 admin 管理员验证
输入网址: http://localhost:8080/Servlet_RBAC/User?jsp=toLogin
填入 用户名为 admin, 密码是 1234
点击登录:
菜单显示是正常的, 没有添加和修改的权限,按钮显示是正常的。