码迷,mamicode.com
首页 > 其他好文 > 详细

权限的分配与使用

时间:2015-04-09 17:32:43      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:权限

权限:控制功能的使用

web中权限的应用:

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

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

权限方案:

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

2、一个功能是否能被某用户使用,是判断用户权限中是否有这个功能的使用许可。技术分享


步骤:

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-8"%>

<%@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);
			
			//当选中一个权限时,也同时选中直接上级
			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(),就会有错。因为有一种用法:可以直接用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(-1);"><img
					src="${pageContext.request.contextPath }/style/images/goBack.png" /></a>
			</div>
		</s:form>
	</div>

	<div class="Description">
		说明:<br /> 1,选中一个权限时:<br />      a,应该选中 他的所有直系上级。<br />
		     b,应该选中他的所有直系下级。<br /> 2,取消选择一个权限时:<br />
		     a,应该取消选择 他的所有直系下级。<br />
		     b,如果同级的权限都是未选择状态,就应该取消选中他的直接上级,并递归向上做这个操作。<br />

		3,全选/取消全选。<br /> 4,默认选中当前岗位已有的权限。<br />
	</div>

</body>
</html>

3、根据权限显示菜单

	<div id="Menu">

		<ul id="MenuUl">

			<%--显示一级菜单 --%>
			<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">

							<%--显示二级菜单 --%>
							<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 > -1) {
			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);
	}






权限的分配与使用

标签:权限

原文地址:http://blog.csdn.net/u012092620/article/details/44961341

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!