定义好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);
}