/** * 检查 某个 会话是否具有访问某个 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; }
/** * 处理 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; }
/** * 获取一个action对应的view的文件 * * @param Pft_Controller_Action $theCtrl * @return string */ function getDefaultModelViewFile($theCtrl) { return $this->_getAbsViewPathFilename($theCtrl->getRelFileName() . $this->_viewExt); }