Acl.class.php 4.67 KB
<?php
/**
 * 权限验证插件,该插件于boot.php配置文件中注册
 * 
 * @version 0.1 20012-7-25
 * @author xiaoma
 * @name Lib_Plugs_Acl
 */
class Lib_Plugin_Acl extends Framework_YPlugin 
{
    /**
     * 当前登录用户
     *
     * @var unknown_type
     */
    private $_uid ;
    
    /**
	 * 初始化函数(仅在初始化时调用 ,两次调用则只会在第一次有效,相当于构造函数)
	 *
	 * @var Lib_Plugs_Acl
	 */
    public function init()
    {
        
    }
    
	/**
	 * 执行事件之前操作(每次执行 插件都会操作)
	 *
	 */
	protected function before_execute()
	{
	}
	
	/**
	 * 执行插件结束时调用 (每次执行 插件都会调用)
	 *
	 */
	protected function after_execute()
	{
	}
	
	/**
	 * 安装插件
	 *
	 */
	public function _install()
	{
	}
	
	/**
	 * 卸载插件
	 *
	 */
	public function _uninstall()
	{
	}
	
    /**
     * 执行控制器动作之前(事件主体)
     *
     */
    public function beforeDispatch()
    {
        //检测是否允许访问   
        if ($this->canAccess() === false)
        {
            //上下文请求对象
            $request = Framework_YHttpRequest::instance();
            //如果是ajax请求,返回相应格式
            if ($request->isAjax())
            {
                //这里可以return json
                $json = array(
                	'status'	=>	false,
                	'code'		=>  Config_Code::$error_auth['code'],
                	'message'	=>	Config_Code::$error_auth['message'],
                	'data'		=>	Config_Code::$error_auth['message'],
                );
                return json_encode($json);
            }
            //如果非ajax请求,这里可以转到到登录页面
            //组装参数
            $args = array(
            	'message'   =>	Config_Code::$error_auth['message'],
            	'refer_url' =>  $request->requestUri(),
            );
            //页面转发至登录的页面
            return new Framework_Response_YForward('passport::signin',$args);            
        }
    }
    
    /**
     * 获取需要登录才能访问的的名单
     * 
 	 * @version 0.1 20012-7-25
 	 * @author xiaoma
 	 * @return array
     */
    public function getNeedRole()
    {
        //@FIXME 返回需要登录才能访问的列表,该地方可以采用配置文件的方式引进,需放入缓存
        $config_file = C('APP.Config_Dir').DS.'Access.inc.php' ;
        $list = include $config_file;
        return $list ;
    }
    
    /**
     * 判断是否有访问的权限
     * 
 	 * @version 0.1 20012-7-25
 	 * @author xiaoma
 	 * @return boolean
     */
    private function canAccess()
    {
        $request = Framework_YHttpRequest::instance();
        $url = $request->requestUDI();
        $canAccess = false ;
        if ($url['module'] == 'admin')
        {
             //@todo 后台权限权限   
             $canAccess = $this->checkBackstage();
        }else
        {
            //@todo 前台权限控制
            $canAccess = $this->checkFront();
        }
        return $canAccess ;
    }
    
    /**
     * 检测是否有权限访问后台
     *
     * @return boolean 
     */
    private function checkBackstage()
    {
        return true ;
    }
    
    /**
     * 检测是否有权限访问前台
     * 
     * @return boolean 
     */
    private function checkFront()
    {
        //如果已经登录,直接返回,允许其访问  ^_^
        if ($this->_uid)
        {
            return true; 
        }
        $request = Framework_YHttpRequest::instance();
        $url = $request->requestUDI();
        //获取需要登录的名单
        $canAccess = $this->getNeedRole() ;
        //组装相应的格式
        $format1 = $url['namespace'].'::*/*@'.$url['module'];
        $format2 = $url['namespace'].'::'.$url['controller'].'/*@'.$url['module'];
        $format3 = $url['namespace'].'::'.$url['controller'].'/'.$url['action'].'@'.$url['module'];
        //校验是否存在于名单中,如存在,说明需要登录才可以访问,就返回false
        $allow = true ; //默认有权访问
        do {
        	if (isset($canAccess[$format3]))
        	{
        		$allow = !$canAccess[$format3] ;
        		break ;
        	}
        	if (isset($canAccess[$format2]) )
        	{
        		$allow = !$canAccess[$format2] ;
        		break ;
        	}
        	if (isset($canAccess[$format1]))
        	{
        		$allow = !$canAccess[$format1] ;
        		break ;
        	}
        }while (false);
       
        return $allow ;
    }
    
    /**
     * 完成视图渲染后
     *
     * @param mixed $response 输出到网页的内容
     */
    public function afterRender($response)
    {
        
    }
    

}
?>