/** * Specifies the access control rules. * This method is used by the 'accessControl' filter. * @return array access control rules */ public function accessRules() { return array(array('allow', 'actions' => array('update', 'delete'), 'expression' => function () { // Se for admin já retorna permissão de acesso if (Sipesq::isAdmin() || Sipesq::isSupport()) { return true; } $projeto = ProjetoOrcamento::model()->findByPk($_GET['id'])->cod_projeto; $pessoa = Yii::app()->user->getId(); //Verifica se atua no projeto if (ProjetoPessoaAtuante::model()->count('cod_projeto = :proj AND cod_pessoa = :id', array('id' => $pessoa, 'proj' => $projeto)) > 0) { return true; } //verifica se é um dos coordenadores if (Projeto::model()->count('cod_projeto = :proj AND (cod_professor = :id OR cod_grad = :id OR cod_pos_grad = :id)', array('id' => $pessoa, 'proj' => $projeto))) { return true; } //verifica se alguem delegou uma permissão a este usuário if (PermissaoProjeto::model()->count('cod_projeto = :projeto AND cod_pessoa = :id', array('id' => $pessoa, 'projeto' => $projeto))) { return true; } //o usuário não é permitido return false; }), array('allow', 'actions' => array('create'), 'expression' => function () { // Se for admin já retorna permissão de acesso if (Sipesq::isAdmin() || Sipesq::isSupport()) { return true; } $projeto = $_GET['id']; $pessoa = Yii::app()->user->getId(); //Verifica se atua no projeto if (ProjetoPessoaAtuante::model()->count('cod_projeto = :proj AND cod_pessoa = :id', array('id' => $pessoa, 'proj' => $projeto)) > 0) { return true; } //verifica se é um dos coordenadores if (Projeto::model()->count('cod_projeto = :proj AND (cod_professor = :id OR cod_grad = :id OR cod_pos_grad = :id)', array('id' => $pessoa, 'proj' => $projeto))) { return true; } //verifica se alguem delegou uma permissão a este usuário if (PermissaoProjeto::model()->count('cod_projeto = :projeto AND cod_pessoa = :id', array('id' => $pessoa, 'projeto' => $projeto))) { return true; } //o usuário não é permitido return false; }), array('allow', 'actions' => array('create'), 'expression' => function () { return Sipesq::isSupport() || Sipesq::getPermition('projeto.financeiro') >= 1; }), array('allow', 'actions' => array('update'), 'expression' => function () { return Sipesq::isSupport() || Sipesq::getPermition('projeto.financeiro') >= 2; }), array('allow', 'actions' => array('delete'), 'expression' => function () { return Sipesq::isAdmin() || Sipesq::getPermition('projeto.financeiro') >= 100; }), array('deny', 'users' => array('*'))); }
/** * * Verifica as permissoes do cadastradas no projeto, * permissoes atribuidas no projeto e permissoes globais do sipesq * * @param $route - String - Rota da permissao * @param $id <opcional> - identificador de um usuário, se nulo pega o usuário logado */ public function getPermition($route, $id = null) { if (Yii::app()->user->isGuest) { return 0; } if ($id == null) { $id = Yii::app()->user->getId(); } if ($id == $this->cod_professor) { return 100; } //Professor Responsável if ($id == $this->cod_grad) { return 2; } //Graduando Responsável if ($id == $this->cod_pos_grad) { return 2; } //Pós-Graduando Responsável $permissao_projeto = PermissaoProjeto::model()->findByPk(array('cod_pessoa' => $id, 'cod_projeto' => $this->cod_projeto)); $permissao_sipesq = Sipesq::getPermition('projeto.' . $route, $id); //Não tem permissao neste projeto if ($permissao_projeto == null) { return $permissao_sipesq; } $permissao = 0; $routes = split('\\.', $route); $perm_pessoa = json_decode($permissao_projeto->permissao); foreach ($routes as $r) { if (property_exists($perm_pessoa, $r)) { $perm_pessoa = $perm_pessoa->{$r}; } else { return -1; } //Rota inexistente } if ($perm_pessoa > $permissao) { $permissao = $perm_pessoa; } return $permissao_sipesq > $permissao ? $permissao_sipesq : $permissao; }
/** * retorna um array de logins permitidos a fazer determinada ação com determinado nível * @param $nivel * @return array $logins[] */ public function loginsPermitidos($nivel) { $criteria = new CDbCriteria(); $criteria->addCondition("nivel_permissao >= '{$nivel}'", 'AND'); $criteria->addCondition("cod_projeto = '{$this->cod_projeto}'", 'AND'); $loginsArray = array(); $pesPermitidas = PermissaoProjeto::model()->findAll($criteria); foreach ($pesPermitidas as $p) { $loginsArray[] = $p->pessoa->login; } return $loginsArray; }
/** * * Deleta uma permissão * @param integer $id * @throws CHttpException */ public function actionDeletePermissao($cod_projeto, $cod_pessoa) { $model = PermissaoProjeto::model()->find('cod_pessoa = :cod_pessoa AND cod_projeto = :cod_projeto', array('cod_projeto' => $cod_projeto, 'cod_pessoa' => $cod_pessoa)); $projeto = Projeto::model()->findByPk($cod_projeto); //Verifica a permissão dos usuários. if (!in_array(Yii::app()->user->name, array_merge($projeto->loginsPermitidos(PermissaoProjeto::READ_WRITE_DELETE_PERMITION), Yii::app()->params['admins']))) { throw new CHttpException(401, 'Acesso Negado. Você não está permitido a fazer esta operação.'); } // Deleta o projeto $model->delete(); $this->redirect(isset($_GET['returnUrl']) ? $_GET['returnUrl'] : array('index')); }
<?php $id = $_GET['id']; $permissao = new PermissaoProjeto(); $permissao->cod_projeto = $id; $permissoes = PermissaoProjeto::model()->findAll(array('condition' => "cod_projeto = " . $id)); if (isset($_POST['PermissaoProjeto'])) { $permissao->attributes = $_POST['PermissaoProjeto']; if ($permissao->save()) { $this->redirect(array('/projeto/gerencial', 'id' => $id)); } } $t = json_encode(array('financeiro' => true, 'info' => false, 'rubricas' => $model->getRubricas(), 'docs' => true, 'atividades' => true)); ?> <a id="gerencial"></a> <div id="tabGerencial"> <h2>Gerencial</h2> <h4>Permissões do projeto </h4> <table class="table table-hover table-striped"> <tr><th>Nome</th><th>Nível de Acesso</th><th>Detalhe</th></tr> <tr> <td><?php echo $model->coordenador->nome; ?> </td> <td>Admin</td> <td><?php echo $model->getAttributeLabel('cod_professor'); ?> </td>
/** * * Deleta uma permissão * @param integer $id * @throws CHttpException */ public function actionDeletePermissao($id, $cod_pessoa) { if (!Yii::app()->request->isPostRequest) { throw new CHttpException(403); } $model = PermissaoProjeto::model()->findByPk(array('cod_pessoa' => $cod_pessoa, 'cod_projeto' => $id)); if ($model == null) { throw new CHttpException('404'); } // Deleta o projeto $model->delete(); $this->redirect(isset($_GET['returnUrl']) ? $_GET['returnUrl'] : array('index')); }