Muchísimas gracias Aland aunque no se si porque he hecho algo mal no
consigo exactamente el comportamiento que busco .
La idea es una página principal (home) que dependiendo de si estas
logueado o no muestra una información diferente, ejemplo el bienvenido
<nombre_usuario>
Con lo que me has enviado tengo el login con el que puedo entrar, he
añadido en pages en la funcion beforeFilter que me permita acceder al home
pero en cuanto hago eso la variable $_SESSION se queda vacía.
*AppController.php*
App::uses('Controller', 'Controller');
class AppController extends Controller {
var $components = array('Session',
'Auth' => array(
'loginRedirect' =>
array('controller' => 'pages', 'action' => 'display', 'home'),
'logoutRedirect' =>
array('controller' => 'pages', 'action' => 'display', 'home'),
'authError' => 'No ha ingresado
en el sistema'
));
var $helpers= array('Js' => array('Jquery'),'Html','Form','Session');
public function beforeFilter(){
parent::beforeFilter();
$this->Auth->deny(); //todos los controladores se deniegan a no ser
que estes logueado
}
}
*UsersController.php *
class UsersController extends AppController{
var $name='Users';
public function beforeSave($options = array()) {
if (isset($this->data[$this->alias]['password'])) {
$this->data[$this->alias]['password'] =
AuthComponent::password($this->data[$this->alias]['password']);
}
return true;
}
public function login(){
if ($this->request->is('post')) {
if ($this->Auth->login()) {
$this->Session->write('User',$this->User);
$id = AuthComponent::user('id');
$this->Session->write('Usuario.id',$id);
$this->redirect($this->Auth->redirect());
} else {
$this->Session->setFlash(__('Usuario o
contraseña inválida, pruebe de nuevo.'));
}
}
}
public function logout(){
$this->Session->destroy();
$this->redirect($this->Auth->logout());
}
}
*PagesController *
class PagesController extends AppController {
/**
* Controller name
*
* @var string
*/
public $name = 'Pages';
/**
* This controller does not use a model
*
* @var array
*/
public $uses = array();
/**
* Displays a view
*
* @param mixed What page to display
* @return void
*/
public function display() {
$path = func_get_args();
$count = count($path);
if (!$count) {
$this->redirect('/');
}
$page = $subpage = $title_for_layout = null;
if (!empty($path[0])) {
$page = $path[0];
}
if (!empty($path[1])) {
$subpage = $path[1];
}
if (!empty($path[$count - 1])) {
$title_for_layout =
Inflector::humanize($path[$count - 1]);
}
$this->set(compact('page', 'subpage', 'title_for_layout'));
$this->render(implode('/', $path));
}
* public function beforeFilter(){
parent::beforeFilter();
$this->Auth->allow('display');
}
*
Esto que he puesto en negrita, es realmente el cambio, si lo pongo me
permite acceder a home sin tener que autentificarme pero el $_SESSION esta
vacío aunque me haya autentificado :/
Si no lo pongo, no puedo acceder.
*/View/Pages/home.ctp
*
if (Configure::read('debug') == 0):
throw new NotFoundException();
endif;
App::uses('Debugger', 'Utility');
?>
<?php
debug($_SESSION);
if ( $_SESSION ){
$user = $_SESSION['Auth']['User'];
echo "Bienvenido <strong>".$user['username']."</strong>";
echo "<br />";
echo $this->Html->link('Logout','../users/logout');
}else{
echo $this->Html->link('Login','../users/login');
}
echo "<br />";
?>
Muchisimas gracias,
Un Saludo.
El 21 de noviembre de 2012 16:56, Aland Laines <[email protected]>escribió:
> Rosa, no se como lo estes trabajando pero yo hago esto:
>
> *AppController.php*
>
> class AppController extends Controller {
>
> public $components = array(
> 'Session',
> 'Auth' => array(
> 'loginRedirect' => array('controller' => 'personas', 'action'
> => 'index'),
> 'logoutRedirect' => array('controller' => 'users', 'action' =>
> 'login'),
> 'authError' => 'No ha ingresado al sistema.',
> )
> );
> public $helpers = array('Js'=>array('Jquery'), 'Html',
> 'Form','Session');
>
> public function beforeFilter() {
> parent::beforeFilter();
> $this->Auth->deny(); // todos los controllers son accesibles solo
> logueando
> }
> }
>
> *User.php (Modelo)*
>
> App::uses('AuthComponent', 'Controller/Component');
> class User extends AppModel {
>
> public function beforeSave($options = array()) {
> if (isset($this->data[$this->alias]['password'])) {
> $this->data[$this->alias]['password'] =
> AuthComponent::password($this->data[$this->alias]['password']);
> }
> return true;
> }
>
>
> public $validate = array(
> 'username' => array(
> 'required' => array(
> 'rule' => array('notEmpty'),
> 'message' => 'Escriba un nombre de usuario'
> )
> ),
> 'password' => array(
> 'required' => array(
> 'rule' => array('notEmpty'),
> 'message' => 'Escriba su clave'
> )
> ),
> 'role' => array(
> 'valid' => array(
> 'rule' => array('inList', array('admin', 'digitador')),
> 'message' => 'Please enter a valid role',
> 'allowEmpty' => false
> )
> )
> );
> }
>
> *UserController.php (Controlador)*
>
> class UsersController extends AppController {
>
> public function beforeFilter() {
> parent::beforeFilter();
> $this->Auth->allow('add'); // Letting users register themselves
> }
>
> public function login() {
> if ($this->request->is('post')) {
> if ($this->Auth->login()) {
> $id = AuthComponent::user('id');
> $nombre = $this->nombuse($id);
> $this->Session->write('Usuario.nombre', $nombre);
> $this->Session->write('Usuario.id',$id);
> $this->redirect($this->Auth->redirect());
> } else {
> $this->Session->setFlash(__('Usuario o password
> incorrecto.'), 'default', array(), 'auth');
> }
> }
> $this->layout = 'login';
> }
>
> public function logout() {
> //$this->Session->setFlash(__('Ha salido del sistema.','default',
> array(), 'auth'));
> $this->Session->destroy();
> $this->redirect($this->Auth->logout());
> }
>
> public function add() {
> if ($this->request->is('post')) {
> $this->User->create();
> if ($this->User->save($this->request->data)) {
> $this->Session->setFlash(__('The user has been saved'));
> $this->redirect(array('action' => 'index'));
> } else {
> $this->Session->setFlash(__('The user could not be saved.
> Please, try again.'));
> }
> }
> }
> }
>
> Esto solo es básico, no esta implementado lo de ACL, pero para que
> comienzes estaria bien.
>
> En esta linea:
> $this->Session->write('Usuario.nombre', $nombre);
>
> escribes lo que quieres que se almacene en Session, para recuperarlo en tu
> vista usas esto:
>
> <?php echo $this->Session->read('Usuario.nombre');?>
>
> Espero te sirva,
>
>
> Saludos,
>
> *Aland Laines Calonge*
> Twitter: @lainessolutions
> http://about.me/aland.laines
>
>
>
>
> El 21 de noviembre de 2012 04:15, Rosa Atienza Ribés <
> [email protected]> escribió:
>
>> Buenas a todos,
>>
>> Estoy empezando con Cake de hecho este va a ser mi primer proyecto en el
>> que utilizo este framework y nada más empezar me he encontrado el primer
>> problema.
>>
>> Queremos hacer 1 página inicial en el que en si estas logueado ponga
>> bienvenido <nombre_usuario> y si no ponga el típico formulario para hacer
>> login o un enlace para loguearse.
>>
>> Pues esto tan sencillo no consigo hacerlo, de ninguna manera, ya que si
>> saco esta página inicial del "login" entonces es como si $_SESSION no se
>> cargara y es un array vacío aunque el usuario se haya logueado de forma
>> correcta.
>>
>>
>> No se si me estoy explicando bien, cualquier cosa me comentais.
>>
>> ¿Hay forma de solucionarlo? ¿o es que deben ser páginas independientes?
>>
>>
>> Muchísimas gracias.
>>
>> Saludos
>>
>> --
>> Has recibido este mensaje porque estás suscrito al grupo "CakePHP-es" de
>> Grupos de Google.
>> Para publicar una entrada en este grupo, envía un correo electrónico a
>> [email protected].
>> Para anular tu suscripción a este grupo, envía un correo electrónico a
>> [email protected]
>> Para tener acceso a más opciones, visita el grupo en
>> http://groups.google.com/group/cakephp-es?hl=es.
>>
>
> --
> Has recibido este mensaje porque estás suscrito al grupo "CakePHP-es" de
> Grupos de Google.
> Para publicar una entrada en este grupo, envía un correo electrónico a
> [email protected].
> Para anular tu suscripción a este grupo, envía un correo electrónico a
> [email protected]
> Para tener acceso a más opciones, visita el grupo en
> http://groups.google.com/group/cakephp-es?hl=es.
>
--
Has recibido este mensaje porque estás suscrito al grupo "CakePHP-es" de Grupos
de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a
[email protected].
Para anular tu suscripción a este grupo, envía un correo electrónico a
[email protected]
Para tener acceso a más opciones, visita el grupo en
http://groups.google.com/group/cakephp-es?hl=es.