权限组件之四(规则)

类别:Java 点击:0 评论:0 推荐:

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

}

 

本文地址:http://com.8s8s.com/it/it13905.htm