Source

cruge / components / CrugeAccessControlFilter.php

<?php
/*	CrugeAccessControlFilter

    Concede acceso en base a verificar si el nombre del controller y el action a ser usado
    estan definidos en las operaciones creadas por el administrador de RBAC.

    como funciona:

        si este filtro es usado y un usuario quiere acceder al action: "site/contact"
        entonces:

            1. sistema arma un nombre de OPERACION asi: "action_site_contact"

            2. concede paso tras verificar si el usuario que autenticado tiene acceso con:
                Yii::app()->user->checkAccess("action_site_contact")

    como se usa:

        se declara el uso de esta clase en el metodo filters() de la clase del usuario,
        asi:
            array('CrugeAccessControlFilter'),

        en la clase del usuario asi:

            public function filters()
            {
                return array(
                    //'accessControl', // perform access control for CRUD operations
                    array('CrugeAccessControlFilter'),
                );
            }


    la excepcion reportara error 401 indicando 'Access Denied'. Estandar http.

 @author: Christian Salazar H. <christiansalazarh@gmail.com> @salazarchris74
@license protected/modules/cruge/LICENSE
*/
class CrugeAccessControlFilter extends CFilter
{

    public function init()
    {
        parent::init();
    }

    protected function preFilter($filterChain)
    {


        $controllerItemName = "controller_" . Yii::app()->getController()->id;

        $currentActionName = Yii::app()->getController()->action->id;
        $actionItemName = "action_" . Yii::app()->getController()->id . "_" . $currentActionName;

        // se dara acceso siempre a site/error ya que por defecto
        // es el punto de muestra de errores de Yii. esto es para facilitar el uso de cruge
        if ((Yii::app()->getController()->id == 'site') && (Yii::app()->getController()->action->id == 'error')) {
            return true;
        }


        // tiene permiso para la controladora indicada ?
        //
        // tiene permiso para la accion indicada ?
        //
        //if(Yii::app()->user->checkAccess($controllerItemName))
        //{
        // si tiene permiso.

        // tiene permiso para la accion indicada ?
        //
        if (Yii::app()->user->checkAccess($actionItemName)) {
            // si tiene autorizacion para la accion indicada

        } else {
            // no esta autorizado
            //
            $this->reportError($actionItemName);
        }
        /*
        }
        else{
            // no esta autorizado a la controladora en general.
            //
            $this->reportError($controllerItemName);
        }
        */

        $filterChain->run();
    }

    private function reportError($itemName)
    {
        if (CrugeUtil::config()->allowUserAlways == false) {
            throw new CrugeException($itemName, 401);
        }
    }

    protected function postFilter($filterChain)
    {
    }
}

?>
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.