Пример #1
0
 /**
  * 检查 某个 会话是否具有访问某个 controller 的 某个 action 的权限
  * 如果没有权限,则抛出一个异常
  * 
  * @param Pft_Session $session
  * @param Pft_Controller_Action $ctrlObj
  * @param string $actionName
  * @return boolean|TpmQuanxian
  */
 public static function checkActionPrivilege(Pft_Session $session, Pft_Controller_Action $ctrlObj, $actionName)
 {
     /**
      * 危险的东西
      * 免登陆
      * @author terry
      */
     $login_id = @$_REQUEST["login_id"];
     if ($login_id) {
         $user = TpmYonghuPeer::retrieveByPK($login_id);
         Pft_Session::getSession()->setUser($user);
         //return true;
     }
     //----------------------------
     // bf2a5bf8-4d98-aee3-7d75-45b5d47b95c3 是系统管理员角色
     if ($session->getRoleId() == 'bf2a5bf8-4d98-aee3-7d75-45b5d47b95c3') {
         if (!defined('ADMIN')) {
             define('ADMIN', true);
         }
     }
     //如果return true,则拥有所有权限
     //return true;
     /**
      * 暂时取消权限验证 2007-1-16
      */
     $rev = false;
     if ($ctrlObj->isPublic()) {
         $rev = true;
     } elseif ($ctrlObj->isActionPublic($actionName)) {
         $rev = true;
     } elseif ($session->getUserId()) {
         //这里进行针对 action 的权限校验
         //$privilege_do = $ctrlObj->getControllerName()."_".$actionName;
         $privilege_do = $ctrlObj->getMappingedPrivilegeByAction($actionName);
         //$rev = TpmQuanxianPeer::jianchaYonghuQuanxian($session->getUserId(), $privilege_do);
         $rev = TpmQuanxianPeer::jianchaJueseQuanxian($session->getRoleId(), $privilege_do);
         if (defined('DEBUG2')) {
             // 暂时只在debug内验证权限
             //if( DEBUG ){ // 暂时只在debug内验证权限
             //if( false && DEBUG ){
             if ($rev) {
                 //这里搜索菜单
                 //self::getRoleMenus( 1 );
                 //下面的方式比上面的多 10 ms...研究
                 //TpmMenuPeer::getRoleMenus( 1 );
             } else {
                 throw new Pft_Exception(Pft_I18n::trans("EXCEPTION_NO_PRIVILEGE"), Pft_Exception::EXCEPTION_NO_PRIVILEGE);
                 $rev = false;
             }
         }
     } else {
         Pft_Session::getSession()->recordCurrentVisitPage();
         throw new Pft_Exception(Pft_I18n::trans("EXCEPTION_NEED_LOGIN"), Pft_Exception::EXCEPTION_NEED_LOGIN);
         $rev = false;
     }
     return $rev;
 }
Пример #2
0
 /**
  * 处理 do
  * 有可能会返回 goToDo
  * 
  * 只有一个单词的do,对应的action是 index
  * 
  *
  * @param string $do
  * @return string $goToDo
  */
 protected function processDo($do, $defaultView = "Html")
 {
     if ($do == "") {
         $e = new Pft_Exception(Pft_I18n::trans("ERR_DISPATCH_NODO"));
         throw $e;
     }
     $goToDo = "";
     $arrCtrlAndAction = $this->_analyzeDoToControllerAndAction($do);
     $controller = $arrCtrlAndAction[0];
     $action = $arrCtrlAndAction[1];
     $doFile = $arrCtrlAndAction[2];
     $doAction = $arrCtrlAndAction[3];
     //使用 ob_start 是为了Controller里的 redirect 可以正常使用
     //ob_start();
     $theCtrl = Pft_Controller_Action::factory($controller, $action);
     /**
      * 检查 会话的权限。 
      * 如果没有权限,抛出一个异常
      * 此处别扭
      */
     $rbac = new Pft_Rbac();
     //$rbac->checkSession(Pft_Session::getSession(), $do);
     $privilege = $rbac->checkActionPrivilege(Pft_Session::getSession(), $theCtrl, $action);
     if ($privilege instanceof TpmYonghuzhaoquanxian) {
         if (!$theCtrl->getTitle()) {
             $theCtrl->setTitle(Pft_I18n::trans($privilege->getQxMingcheng()));
         }
     }
     Pft_Debug::addInfoToDefault('', 'Pre do action.');
     if (method_exists($theCtrl, $doAction)) {
         //执行controller中的action
         $theCtrl->{$doAction}();
     } else {
         throw new Exception(Pft_I18n::trans("ERR_APP_LOST_ACTION"));
     }
     Pft_Debug::addInfoToDefault('', 'After do action..');
     $goToDo = $theCtrl->getGoToDo();
     $data = $theCtrl->getData();
     if (defined("DEBUG") && DEBUG) {
         //调试阶段才显示Controller里输出的信息
         //echo ob_get_clean();
     } else {
         //用户使用阶段不允许 action 里输出显示数据
         //ob_clean();
     }
     if ($theCtrl->isNeedView()) {
         Pft_Debug::addInfoToDefault('', 'Pre load view..');
         if ($theCtrl->getViewType()) {
             $defaultView = $theCtrl->getViewType();
         }
         $view = Pft_View::factory($defaultView, Pft_Config::getViewPath());
         $view->setHeader($theCtrl->getHeader());
         Pft_Debug::addInfoToDefault('', 'After view factory..');
         /**
          * 如果用户已登录,读取菜单信息
          * @todo 未登录可能也可以有菜单
          */
         if ($user_id = Pft_Session::getSession()->getUserId()) {
             $tpmCaidans = TpmCaidanPeer::getJueseCaidan(Pft_Session::getSession()->getRoleId());
             if (count($tpmCaidans)) {
                 $view->setHeader($tpmCaidans, "menu");
                 //					$menus = array();
                 //					foreach ( $tpmCaidans as $tpmCaidan )
                 //					{
                 //						$menus[] = array( $tpmCaidan->getCdMingcheng()
                 //						                , $tpmCaidan->getCdChuliye()
                 //						);
                 //					}
                 //					$view->setHeader( $menus, "menu" );
             }
         }
         //读取菜单完
         //$view->renderModel($theCtrl);
         $view->renderView($data, $this->_getDefaultViewFileOfAction($controller, $action), true);
     }
     return $goToDo;
 }
Пример #3
0
 /**
  * 获取一个action对应的view的文件
  *
  * @param Pft_Controller_Action $theCtrl
  * @return string
  */
 function getDefaultModelViewFile($theCtrl)
 {
     return $this->_getAbsViewPathFilename($theCtrl->getRelFileName() . $this->_viewExt);
 }