程序员人生 网站导航

权限的分配与使用

栏目:框架设计时间:2015-04-24 07:58:33

权限:控制功能的使用

web中权限的利用:

1、1个功能对应1个或多个URL

2、对功能的控制就是对URL地址访问的控制

权限方案:

1、用户的权限就是用户的所有角色的权限的合集

2、1个功能是不是能被某用户使用,是判断用户权限中是不是有这个功能的使用许可。


步骤:

1、初始化权限

权限是不可变的,在第1次使用时就已肯定了。所以我们可以  insert into。。。。

Session session=sessionFactory.getCurrentSession(); //保存超级管理员用户 User user=new User(); user.setLoginName("admin"); user.setPassword(DigestUtils.md5Hex("admin")); user.setName("超级管理员"); session.save(user); //保存权限数据 Privilege menu,menu1,menu2,menu3; menu=new Privilege("系统管理",null,null); menu1=new Privilege("部门管理","/department_list",menu); menu2=new Privilege("岗位管理","/role_list",menu); menu3=new Privilege("用户管理","/user_list",menu); session.save(menu); session.save(menu1); session.save(menu2); session.save(menu3); session.save(new Privilege("部门列表","/department_list",menu1)); session.save(new Privilege("部门删除","/department_delete",menu1)); session.save(new Privilege("部门添加","/department_add",menu1)); session.save(new Privilege("部门修改","/department_edit",menu1)); session.save(new Privilege("岗位列表","/role_list",menu2)); session.save(new Privilege("岗位删除","/role_delete",menu2)); session.save(new Privilege("岗位添加","/role_add",menu2)); session.save(new Privilege("岗位修改","/role_edit",menu2)); session.save(new Privilege("用户列表","user_list",menu3)); session.save(new Privilege("用户删除","user_delete",menu3)); session.save(new Privilege("用户添加","user_add",menu3)); session.save(new Privilege("用户修改","user_edit",menu3)); menu=new Privilege("网上交换",null,null); menu1=new Privilege("论坛管理","/forumManage_list",menu); menu2=new Privilege("论坛","/forum_list",menu); session.save(menu); session.save(menu1); session.save(menu2);

2、分配权限

给角色分配权限,用户的权限就是用户的所有角色的权限的合集

分配权限类似于修改

public String setPrivilegeUI(){ //准备回显数据 Role role=roleService.find(model.getId()); ActionContext.getContext().getValueStack().push(role); if(role.getPrivileges()!=null){ privilegeIds=new Long[role.getPrivileges().size()]; int index=0; for(Privilege privilege : role.getPrivileges()){ privilegeIds[index++]=privilege.getId(); } } // List<Privilege> list=privilegeService.getAll(); // ActionContext.getContext().put("list", list); return "setPrivilegeUI"; } /** * 分配权限 * @return */ public String setPrivilege(){ //1、从数据库中获得修改对象 Role role=roleService.find(model.getId()); //2、设置修改数据 List<Privilege> list=privilegeService.getByIds(privilegeIds); role.setPrivileges(new HashSet<Privilege>(list)); //3、更新到数据库 roleService.save(role); return "toList"; }

jsp页面-----显示树状结构

<%@ page language="java" import="java.util.*" pageEncoding="UTF⑻"%> <%@include file="/WEB-INF/jsp/public/commons.jspf"%> <html> <head> <title>配置权限</title> <script language="javascript" src="${pageContext.request.contextPath }/script/jquery_treeview/jquery.treeview.js"></script> <link type="text/css" rel="stylesheet" href="${pageContext.request.contextPath }/style/blue/file.css" /> <link type="text/css" rel="stylesheet" href="${pageContext.request.contextPath }/script/jquery_treeview/jquery.treeview.css" /> <script type="text/javascript"> $(function(){ $("[name=privilegeIds]").click(function(){ //当选中或取消权限时,也同时选中或取消下级元素 $(this).siblings("ul").find("input").attr("checked",this.checked); //当选中1个权限时,也同时选中直接上级 if(this.checked==true){ $(this).parents("li").children("input").attr("checked",true); } }); }); $(function() { $("#tree").treeview(); }); </script> </head> <body> <!-- 标题显示 --> <div id="Title_bar"> <div id="Title_bar_Head"> <div id="Title_Head"></div> <div id="Title"> <!--页面标题--> <img border="0" width="13" height="13" src="${pageContext.request.contextPath }/style/images/title_arrow.gif" /> 配置权限 </div> <div id="Title_End"></div> </div> </div> <!--显示表单内容--> <div id=MainArea> <s:form action="role_setPrivilege"> <s:hidden name="id"></s:hidden> <div class="ItemBlock_Title1"> <!-- 信息说明 --> <div class="ItemBlock_Title1"> <img border="0" width="4" height="7" src="${pageContext.request.contextPath }/style/blue/images/item_point.gif" /> 正在为【${name } }】配置权限 </div> </div> <!-- 表单内容显示 --> <div class="ItemBlockBorder"> <div class="ItemBlock"> <table cellpadding="0" cellspacing="0" class="mainForm"> <!--表头--> <thead> <tr align="LEFT" valign="MIDDLE" id="TableTitle"> <td width="300px" style="padding-left: 7px;"> <!-- 如果把全选元素的id指定为selectAll,并且有函数selectAll(),就会有错。由于有1种用法:可以直接用id援用元素 --> <input type="CHECKBOX" id="cbSelectAll" onClick="$('[name=privilegeIds]').attr('checked',this.checked)" /> <label for="cbSelectAll">全选</label> </td> </tr> </thead> <!--显示数据列表--> <tbody id="TableData"> <tr class="TableDetail1"> <!-- 显示权限树 --> <td> <!-- <s:checkboxlist name="privilegeIds" list="#list" listKey="id" listValue="name"></s:checkboxlist> --> <%-- <s:iterator value="#list"> <input type="checkbox" name="privilegeIds" value="${id }" id="lb_${id }" <s:property value="%{id in privilegeIds ? 'checked' : '' }"/> /> <label for="lb_${id }">${name }</label> <br/> </s:iterator> --%> <ul id="tree"> <s:iterator value="#application.topPrivilegeList"> <li> <input type="checkbox" name="privilegeIds" value="${id }" id="lb_${id }" <s:property value="%{id in privilegeIds ? 'checked' : '' }"/>/> <label for="lb_${id }"><span class="folder">${name }</span></label> <ul> <s:iterator value="children"> <li> <input type="checkbox" name="privilegeIds" value="${id }" id="lb_${id }" <s:property value="%{id in privilegeIds ? 'checked' : '' }"/>/> <label for="lb_${id }"><span class="folder">${name }</span></label> <ul> <s:iterator value="children"> <li><input type="checkbox" name="privilegeIds" value="${id }" id="lb_${id }" <s:property value="%{id in privilegeIds ? 'checked' : '' }"/>/> <label for="lb_${id }"><span class="folder">${name }</span></label></li> </s:iterator> </ul> </li> </s:iterator> </ul> </li> </s:iterator> </ul> </td> </tr> </tbody> </table> </div> </div> <!-- 表单操作 --> <div id="InputDetailBar"> <input type="image" src="${pageContext.request.contextPath }/style/images/save.png" /> <a href="javascript:history.go(⑴);"><img src="${pageContext.request.contextPath }/style/images/goBack.png" /></a> </div> </s:form> </div> <div class="Description"> 说明:<br /> 1,选中1个权限时:<br />      a,应当选中 他的所有直系上级。<br />      b,应当选中他的所有直系下级。<br /> 2,取消选择1个权限时:<br />      a,应当取消选择 他的所有直系下级。<br />      b,如果同级的权限都是未选择状态,就应当取消选中他的直接上级,并递归向上做这个操作。<br /> 3,全选/取消全选。<br /> 4,默许选中当前岗位已有的权限。<br /> </div> </body> </html>

3、根据权限显示菜单

<div id="Menu"> <ul id="MenuUl"> <%--显示1级菜单 --%> <s:iterator value="#application.topPrivilegeList"> <s:if test="#session.user.hasPrivilegeByName(name)"> <li class="level1"> <div onClick="menuClick(this)" class="level1Style"> <img src="style/images/MenuIcon/${id }.gif" class="Icon" />${name } </div> <ul id="aa" class="MenuLevel2"> <%--显示2级菜单 --%> <s:iterator value="children"> <s:if test="#session.user.hasPrivilegeByName(name)"> <li class="level2"> <div class="level2Style"> <img src="style/images/MenuIcon/menu_arrow_single.gif" /> <a target="body" href="${pageContext.request.contextPath }${url}.action">${name }</a> </div> </li> </s:if> </s:iterator> </ul> </li> </s:if> </s:iterator> </ul> </div>

4、根据权限显示链接

重写<s:a></s:a>标签

public int doEndTag() throws JspException { User user=(User) pageContext.getSession().getAttribute("user"); String privUrl="/"+action; if(user.hasPrivilegeByUrl(privUrl)){ return super.doEndTag(); }else{ return EVAL_PAGE; } }


5.拦截每个action要求,验证用户是不是有权限访问

用struts的 interceptor拦截

public String intercept(ActionInvocation invocation) throws Exception { String result=null; User user= (User) ActionContext.getContext().getSession().get("user"); String namespace=invocation.getProxy().getNamespace(); String actionName=invocation.getProxy().getActionName(); String privUrl=namespace+actionName; //未登入,转到登入页面 if(user==null){ //如果是去登入,就放行 if(privUrl.startsWith("/user_login")){ return invocation.invoke(); }else{ //如果不是去登入,就转到登入页面 return "loginUI"; } } //已登入,判断是不是有权限 else{ if(user.hasPrivilegeByUrl(privUrl)){ //有,放行 return invocation.invoke(); }else{ //无,转到提示页面 return "noPrivilege"; } } }






补上怎样判断用户是不是有权限的代码

/** * 判断本用户是不是有指定的名称权限 * * @return */ public boolean hasPrivilegeByName(String name) { // 超级管理员 if (isAdmin()) { return true; } // 普通用户 for (Role role : roles) { for (Privilege privilege : role.getPrivileges()) { if (privilege.getName().equals(name)) { return true; } } } return false; } /** * 判断本用户是不是有指定的url权限 * * @return */ public boolean hasPrivilegeByUrl(String privUrl) { // 超级管理员 if (isAdmin()) { return true; } int pos = privUrl.indexOf("?"); if (pos > ⑴) { privUrl = privUrl.substring(0, pos); if (privUrl.endsWith("UI")) { privUrl = privUrl.substring(0, privUrl.length() - 2); } } Collection<Privilege> allPrivilege = (Collection<Privilege>) ActionContext.getContext().getApplication().get("allPrivilege"); // 如果本url不需要控制,则登入用户就能够使用 if (!allPrivilege.contains(privUrl)) { return true; } else { // 普通用户 for (Role role : roles) { for (Privilege privilege : role.getPrivileges()) { if (privUrl.equals(privilege.getUrl())) { return true; } } } } return false; } /** * 判断本用户是否是超级用户 * * @return */ private boolean isAdmin() { return "admin".equals(loginName); }






------分隔线----------------------------
------分隔线----------------------------

最新技术推荐