论坛首页 Web前端技术论坛

Struts,ZK 各实现细粒度的权限验证控制(下)

浏览 1941 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-06-28   最后修改:2010-07-06

 

    上篇,所说为什么要用Stringbuffer的拼接来存储权限集合,而不用List或者Map集合

   对于List或者Map   List接口是对Collection进行了简单的扩充,它的泛化类常用的有ArrayList和LinkedList。你可以将任何东西放到一个List容器中,并在需要时从中取出。ArrayList从其命名中可以看出它是一种类似数组的形式进行存储,存储对象会其元素顺序是按照加入顺序排列的,当如果循环存储,或者删除,都会进行排序,将对遍历的所有对象开辟N个空间,消耗占内存.Map是键值对是以哈希表的方式存储没有排序.但也消耗内存.具体的就不多讲了.   

   Stringbuffer 和string的拼接  又有性能上的差异,String 虽然是final类,String是原型类型,类似基本类型,就是说, 对他的修改都会创建一个新的对象,例如String s ="abc"; 修改String s="abc"+"c"

对象"abc" 与"abc"+"c"不是同一个对象,String字符串的拼接一般会重复创建string对象,StringBuffer与StringBuilder这两个类是为字符串设计的,后者是一个线程安全的类,

设计这两个类就是解决string反复创建新对象的问题,为什么StringBuffer一般效率高于String,是因为StringBuffer是一个Buffer,有一个字符缓冲数组,默认分配16个字符.

    所以选用StringBuffer来存储权限集合对象.

 

package com.linktel.linkFax.web.zk.util;

import java.util.List;
import org.zkoss.zkplus.spring.SpringUtil;
import com.linktel.linkFax.LinkFaxContext;
import com.linktel.linkFax.domain.Authority;
import com.linktel.linkFax.domain.Resource;
import com.linktel.linkFax.domain.Role;
import com.linktel.linkFax.domain.User;
import com.linktel.linkFax.service.ResourceService;

public class AuthorityTools {
	/**
	 * 通过资源名称查找功能权限 与登录用户所属角色所拥有的权限对比, 如果功能权限被授权的话返回授权;
	 * 
	 * @param resourceName
	 *            功能资源名称;
	 * @return
	 */
	public static boolean hasPermission(String resourceName) {

		StringBuffer authoritiesStr=(StringBuffer ) ZkUtils.getSessionAttr(LinkFaxContext.CURRENT_AUTHORITIESSTR);
		ResourceService service = (ResourceService) SpringUtil
				.getBean("resourceService");
		Resource resource = service.getResourceByValue(resourceName);
		List<Authority> authoritiesResource = resource.getAuths();
		for (Authority authority : authoritiesResource) {
			int index = authoritiesStr.indexOf(authority.getName());
			if (index >= 0) {
				return Boolean.TRUE;
			}
		}
		return Boolean.FALSE;
	}

}

 

  以上内容是自己写了一个可重用的工具类,这个工具类是针对于循环遍历所操作的resource资源来验证当前登录的用户是否是有权限,如有权限就返回true    如没有就返回false

 

   具体实现是这样的  之前我们把所有角色的权限放入了StringBuffer中  现在我们只要通过当前用户操作的resource资源

中的所包含的权限名称去比对角色中的权限名称

     authoritiesStr.indexOf(authority.getName());

 

 接下来就是在页面初始化的时候去绑定后台类对象

       

<?xml version="1.0" encoding="utf-8"?>
<?page id="userPage"?>
<?xel-method prefix="c" name="hasPermission" 
class="com.linktel.linkFax.web.zk.util.AuthorityTools" 
signature="com.linktel.linkFax.web.zk.util.AuthorityTools  hasPermission(java.lang.String)"?>
<?init class="org.zkoss.zkplus.databind.AnnotateDataBinderInit" root="./userWin"?>
<window id="userWin" width="100%">
<div if="${c:hasPermission('CompanyUser')}">
					<label value="按公司条件查询:"></label>
					<combobox id="cbxCompany" model="@{userWin.companyList}"
						selectedItem="@{userWin.company}" readonly="true">
						<comboitem self="@{each=company}" label="@{company.name}"></comboitem>
					</combobox>
				</div>
				<separator width="260px" bar="true"></separator>
				<div if="${c:hasPermission('DeptUser')}">
					<label value="按部门条件查询:"></label>
					<combobox id="cbxDept" model="@{userWin.deptList}"
						readonly="true" selectedItem="@{userWin.dept}">
						<comboitem self="@{each=dept}" label="@{dept.name}"></comboitem>
					</combobox>
				</div>
</window>

 

  <?xel-method prefix="c" name="hasPermission" 

class="com.linktel.linkFax.web.zk.util.AuthorityTools" 

signature="com.linktel.linkFax.web.zk.util.AuthorityTools  hasPermission(java.lang.String)"?>

绑定后台类的指令

 

    <div if="${c:hasPermission('CompanyUser')}">  

    if(${c:hasPermission('资源名称')}) 如果之前后台方法返回的是true  那么在加载的时候组件被创建,如果是false就  不被创建

 

 

 

论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics