PageRenderTime 47ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/pianogame/core/lib/components/auth_component.php

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