Advertisement
Guest User

Untitled

a guest
Jun 14th, 2017
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 10.06 KB | None | 0 0
  1. <?php
  2. class AuthSessionComponent extends Component {
  3.     /**
  4.      *  Autorização para URLs não especificadas explicitamente.
  5.      */
  6.     public $authorized = true;
  7.     /**
  8.       *  Define se AuthComponent::check() será chamado automaticamente.
  9.       */
  10.     public $autoCheck = true;
  11.     /**
  12.      *  Instância do Controller.
  13.      */
  14.     public $Controller;
  15.     /**
  16.       *  Nomes dos campos do modelo a serem usados na autenticação.
  17.       */
  18.     public $fields = array(
  19.         "id" => "id",
  20.         "username" => "username",
  21.         "password" => "password"
  22.     );
  23.     /**
  24.       *  Método de hash a ser usado para senhas.
  25.       */
  26.     public $hash = "sha1";
  27.     /**
  28.       *  Estado de autenticação do usuário corrente.
  29.       */
  30.     public $loggedIn;
  31.     /**
  32.       *  Action que fará login.
  33.       */
  34.     public $loginAction = "/users/login";
  35.     /**
  36.       *  URL para redirecionamento após o login.
  37.       */
  38.     public $loginRedirect = "/";
  39.     /**
  40.       *  Action que fará logout.
  41.       */
  42.     public $logoutAction = "/users/logout";
  43.     /**
  44.       *  URL para redirecionamento após o logout.
  45.       */
  46.     public $logoutRedirect = "/";
  47.     /**
  48.      *  Lista de permissões.
  49.      */
  50.     public $permissions = array();
  51.     /**
  52.       *  Usuário atual.
  53.       */
  54.     public $user = array();
  55.     /**
  56.       *  Nome do modelo a ser utilizado para a autenticação.
  57.       */
  58.     public $userModel = "Users";
  59.     /**
  60.       *  Condições adicionais para serem usadas na autenticação.
  61.       */
  62.     public $userScope = array();
  63.     /**
  64.       *  Define se o salt será usado como prefixo das senhas.
  65.       */
  66.     public $useSalt = true;
  67.     /**
  68.       * Define o prefixo da sessão do usuário logado
  69.       */
  70.     public $prefixCrypt = 'skjHASJKh';
  71.     /**
  72.       *  Define o nível de recursão do modelo.
  73.       */
  74.     public $recursion;
  75.     /**
  76.       *  Mensagem de erro para falha no login.
  77.       */
  78.     public $loginError = "loginFailed";
  79.     /**
  80.       *  Mensagem de erro para acesso não autorizado.
  81.       */
  82.     public $authError = "notAuthorized";
  83.  
  84.     public $authenticate = false;
  85.  
  86.     /**
  87.       *  Inicializa o componente.
  88.       *
  89.       *  @param object $Controller Objeto Controller
  90.       *  @return void
  91.       */
  92.     public function initialize(&$Controller) {
  93.         $this->Controller = $Controller;
  94.     }
  95.     /**
  96.       *  Faz as operações necessárias após a inicialização do componente.
  97.       *
  98.       *  @param object $Controller Objeto Controller
  99.       *  @return void
  100.       */
  101.     public function startup(&$Controller) {
  102.         $this->allow($this->loginAction);
  103.         if($this->autoCheck):
  104.             $this->check();
  105.         endif;
  106.         if(Mapper::match($this->loginAction)):
  107.             $this->login();
  108.         endif;
  109.     }
  110.     /**
  111.       *  Finaliza o component.
  112.       *
  113.       *  @param object $Controller Objeto Controller
  114.       *  @return void
  115.       */
  116.     public function shutdown(&$Controller) {
  117.         if(Mapper::match($this->loginAction)):
  118.             $this->loginRedirect();
  119.         endif;
  120.     }
  121.     /**
  122.       *  Verifica se o usuário está autorizado a acessar a URL atual, tomando as
  123.       *  ações necessárias no caso contrário.
  124.       *
  125.       *  @return boolean Verdadeiro caso o usuário esteja autorizado
  126.       */
  127.     public function check() {
  128.         if(!$this->authorized()):
  129.             $this->setAction(Mapper::here());
  130.             $this->error($this->authError);
  131.             $this->Controller->redirect($this->loginAction);
  132.             return false;
  133.         endif;
  134.         return true;
  135.     }
  136.     /**
  137.      *  Verifica se o usuário esta autorizado ou não para acessar a URL atual.
  138.      *
  139.      *  @return boolean Verdadeiro caso o usuário esteja autorizado
  140.      */
  141.     public function authorized() {
  142.         return $this->loggedIn() || $this->isPublic();
  143.     }
  144.     /**
  145.       *  Verifica se uma action é pública.
  146.       *
  147.       *  @return boolean Verdadeiro se a action é pública
  148.       */
  149.     public function isPublic() {
  150.         $here = Mapper::here();
  151.         $authorized = $this->authorized;
  152.         foreach($this->permissions as $url => $permission):
  153.             if(Mapper::match($url, $here)):
  154.                 $authorized = $permission;
  155.             endif;
  156.         endforeach;
  157.         return $authorized;
  158.     }
  159.     /**
  160.      *  Libera URLs a serem visualizadas sem autenticação.
  161.      *
  162.      *  @param string $url URL a ser liberada
  163.      *  @return void
  164.      */
  165.     public function allow($url = null) {
  166.         if(is_null($url)):
  167.             $this->authorized = true;
  168.         else:
  169.             $this->permissions[$url] = true;
  170.         endif;
  171.     }
  172.     /**
  173.      *  Bloqueia os URLS para serem visualizadas apenas com autenticação.
  174.      *
  175.      *  @param string $url URL a ser bloqueada
  176.      *  @return void
  177.      */
  178.     public function deny($url = null) {
  179.         if(is_null($url)):
  180.             $this->authorized = false;
  181.         else:
  182.             $this->permissions[$url] = false;
  183.         endif;
  184.     }
  185.     /**
  186.      *  Verifica se o usuário está autenticado.
  187.      *
  188.      *  @return boolean Verdadeiro caso o usuário esteja autenticado
  189.      */
  190.     public function loggedIn() {
  191.         $user_session = Session::read($this->prefixCrypt . 'user_logged');
  192.         if(is_null($this->loggedIn)):
  193.             $user = $user_session['user_id'];
  194.             $password = $user_session["password"];
  195.             if(!is_null($user) && !is_null($password)):
  196.                 $user = $this->identify(array(
  197.                     $this->fields["id"] => $user,
  198.                     $this->fields["password"] => $password
  199.                 ));
  200.                 return $this->loggedIn = !empty($user);
  201.             else:
  202.                 return $this->loggedIn = false;
  203.             endif;
  204.         else:
  205.             return $this->loggedIn;
  206.         endif;
  207.     }
  208.     /**
  209.       *  Identifica o usuário no banco de dados.
  210.       *
  211.       *  @param array $conditions Condições da busca
  212.       *  @return array Dados do usuário
  213.       */
  214.     public function identify($conditions) {
  215.         $userModel = ClassRegistry::load($this->userModel);
  216.         if(!$userModel):
  217.             $this->error("missingModel", array("model" => $this->userModel));
  218.             return false;
  219.         endif;
  220.         $params = array(
  221.             "conditions" => array_merge(
  222.                 $this->userScope,
  223.                 $conditions
  224.             ),
  225.             "recursion" => is_null($this->recursion) ? $userModel->recursion : $this->recursion
  226.         );
  227.         return $this->user = $userModel->first($params);
  228.     }
  229.     /**
  230.       *  Cria o hash de uma senha.
  231.       *
  232.       *  @param string $password Senha para ter o hash gerado
  233.       *  @return string Hash da senha
  234.       */
  235.     public function hash($password) {
  236.         return Security::hash($password, $this->hash, $this->useSalt);
  237.     }
  238.     /**
  239.       *  Efetua o login do usuário.
  240.       *
  241.       *  @return void
  242.       */
  243.     public function login() {
  244.         if(!empty($this->Controller->data)):
  245.             $password = $this->hash($this->Controller->data[$this->fields["password"]]);
  246.             $user = $this->identify(array(
  247.                 $this->fields["username"] => $this->Controller->data[$this->fields["username"]],
  248.                 $this->fields["password"] => $password
  249.             ));
  250.             if(!empty($user)):
  251.                 /**
  252.                  * Acrescentado pois o mesmo não criava a sessão para poder
  253.                  * redirecionar para as partes negadas.
  254.                  */
  255.                 $this->authenticate($user['id'], $user[$this->fields["password"]]);
  256.                 $this->authenticate = true;
  257.             else:
  258.                 $this->error($this->loginError);
  259.             endif;
  260.         endif;
  261.     }
  262.  
  263.     public function loginRedirect() {
  264.         if($this->authenticate):
  265.             $this->authenticate($this->user["id"], $this->user["password"]);
  266.             if($redirect = $this->getAction()):
  267.                 $this->loginRedirect = $redirect;
  268.             endif;
  269.             $this->Controller->redirect($this->loginRedirect);
  270.         endif;
  271.     }
  272.     /**
  273.       *  Autentica um usuário.
  274.       *
  275.       *  @param string $id ID do usuário
  276.       *  @param string $password Senha do usuário
  277.       *  @return void
  278.       */
  279.     public function authenticate($id, $password) {
  280.         Session::write($this->prefixCrypt . 'user_logged', array('user_id' => $id,'password' => $password));
  281.     }
  282.     /**
  283.       *  Efetua o logout do usuário.
  284.       *
  285.       *  @return void
  286.       */
  287.     public function logout() {
  288.         Session::delete($this->prefixCrypt . 'user_logged');
  289.         $this->Controller->redirect($this->logoutRedirect);
  290.     }
  291.     /**
  292.       *  Retorna informações do usuário.
  293.       *
  294.       *  @param string $field Campo a ser retornado
  295.       *  @return mixed Campo escolhido ou todas as informações do usuário
  296.       */
  297.     public function user($field = null) {
  298.         if($this->loggedIn()):
  299.             if(is_null($field)):
  300.                 return $this->user;
  301.             else:
  302.                 return $this->user[$field];
  303.             endif;
  304.         else:
  305.             return null;
  306.         endif;
  307.     }
  308.     /**
  309.       *  Armazena a action requisitada quando a autorização falhou.
  310.       *
  311.       *  @param string $action Endereço da action
  312.       *  @return void
  313.       */
  314.     public function setAction($action) {
  315.         Session::write("Auth.action", $action);
  316.     }
  317.     /**
  318.       *  Retorna a action requisitada quando a autorização falhou.
  319.       *
  320.       *  @return string Endereço da action
  321.       */
  322.     public function getAction() {
  323.         $action  = Session::read("Auth.action");
  324.         Session::delete("Auth.action");
  325.         return $action;
  326.     }
  327.     /**
  328.       *  Define um erro ocorrido durante a autenticação.
  329.       *
  330.       *  @param string $type Nome do erro
  331.       *  @param array $details Detalhes do erro
  332.       *  @return void
  333.       */
  334.     public function error($type, $details = array()) {
  335.         Session::writeFlash("Auth.error", $type);
  336.     }
  337. }
  338. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement