定义好User,Group,Role了以后,下面我定义了权限判断的规则. 
    首先定义Rule接口,见Rule.java.Rule只做一件事判断User是否有权限. 
    然后我实现了一个Rule,见RuleImpl.java. 
  
  
    这部分涉及到了一个Input类,这个类是一个输入的类,接口如Input.java.这个通过继承该接口可以使用各种方式数据(HTTP,XML,SOAP……)作为输入数据. 
    Permission为权限类,下面一篇会介绍. 
  
======================Rule.java=============================== 
package org.fswan.permission; 
  
import java.util.HashMap; 
  
import org.fswan.Input; 
  
/** 
 * 用来进行判断的规则. 
 * 供Permission调用 
 */ 
public interface Rule 
{ 
    public boolean pass(Permission permission,User user,HashMap oldData,Input input); 
} 
  
=======================RuleImpl=================================== 
package org.fswan.permission; 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.Properties; 
import org.fswan.Input; 
/** 
 *  
 */ 
public class RuleImpl implements Rule 
{ 
    /* (non-Javadoc) 
     * @see org.fswan.permission.Rule#pass(org.fswan.permission.Permission, org.fswan.permission.User, org.fswan.permission.Role, org.fswan.permission.Group, java.util.HashMap, org.fswan.Input) 
     */ 
    public boolean pass(Permission permission, User user, HashMap oldData, Input input) 
    { 
       try 
       { 
           Role[] roles = user.getRoles(); 
           if (roles != null) 
           { 
               for (int i = 0; i < roles.length; i++) 
               { 
                  if (hasPermission(permission, user, roles[i], oldData, input)) //有权限 
                      return true; 
               } 
           } 
           Group[] groups = user.getGroups(); 
           if (groups != null) 
               for (int i = 0; i < groups.length; i++) 
               { 
                  if (pass(permission, groups[i], oldData, input)) 
                      return true; 
               } 
           return false; 
       } catch (Exception ex) 
       { 
           ex.printStackTrace(); 
       } 
        return false; 
    } 
    /** 
     * 判断用户的某个角色是否有权限进行某操作 
     * @param permission 权限 
     * @param user 用户 
     * @param role 角色 
     * @param oldData 数据 
     * @param input 输入 
     * @return 是否有权限 
     */ 
    private boolean hasPermission(Permission permission, User user, Role role, HashMap oldData, Input input) 
    { 
       //如角色没有该权限ID则无权限 
       if (role.getPermissionProp(permission.getPermissionName()) == null) 
           return false; 
       //如果权限还要判断层别 
       if (permission.getPermissionItem() != null) 
       { 
           ArrayList item = permission.getPermissionItem(); 
           boolean accept = true; 
           ArrayList roleItem = (ArrayList) role.getPermissionProp(permission.getPermissionName()); 
           ttt : for (int i = 0; i < roleItem.size(); i++) 
           { 
               Properties p = (Properties) roleItem.get(i); 
               accept = true; 
               for (int j = 0; j < item.size(); j++) 
               { 
                  if (p.getProperty(item.get(j).toString()) != null 
                      && p.getProperty(item.get(j).toString()).indexOf(oldData.get(item.get(j).toString()).toString()) 
                          != -1)                   //如果无权限 
                      continue ttt; 
               } 
               return true; 
           } 
           return false; 
       } 
        return true; 
    } 
} 
=============================Input.java======================= 
package org.fswan; 
  
/** 
 * @author 方志文 
 * 
 * 输入数据的接口,作为主类的数据输入式, 
 * 现可以从xml,HttpServletRequest和JSPUpload获取数据 
 *  
 */ 
public interface Input { 
    /** 
     * 获取参数的值,如果无该参数则返回null,如果该参数对应多个值则返回其第一个值 
     * @param parameter 参数 
     * @return 值 
     */ 
    public String getParameter(String parameter); 
    /** 
     * 获取参数的值列表 
     * @param parameter 参数 
     * @return 值 
     */ 
    public String[] getParameterValues(String parameter); 
    /** 
     * 获取参数名的列表 
     * @return 所有的参数的名 
     */ 
    public String[] getParameterNames(); 
    /** 
     * 获取数据源 
     * @return 数据源 
     */ 
    public Object getSource(); 
    /** 
     * 设置参数,如果已存在该参数,则原来的作废 
     * @param parameter 参数 
     * @param value 值 
     */ 
    public void setParameter(String parameter,String value); 
    /** 
     * 设置参数,如果已存在该参数,则把原来的作废 
     * @param parameter 参数 
     * @param values 值 
     */ 
    public void setParameter(String parameter,String[] values); 
    /** 
     * 添加参数,如果已存在该参数,则把该值添加到原值后成数组 
     * @param parameter 参数 
     * @param value 值 
     */ 
    public void addParameter(String parameter,String value); 
    /** 
     * 添加参数(多个值),如果已存在该参数,则把该值添加到原值后成数组 
     * @param parameter 参数 
     * @param values 值 
     */ 
    public void addParameter(String parameter,String[] values); 
} 
   
 
  |