Cake 1.2 Auth is still pretty badly documented, but between a half dozen articles I managed to get it all working. None tell the full story though, and I don't fully understand it, but I have working code I thought i'd share. I may post a bakery article if I get time. For now this should help some people. My biggest tip is to get a decent IDE and step through the Cake core code if you want to know what's going on, I use Komodo, but i'm sure there are others too. Note that I don't use groups, as when I first started I couldn't get them working, and I don't need them any now.
NB: this code was taken from all over the place; I copied, pasted, and tweaked. If I could find the original articles i'd credit the authors, but they were found all over the place and I didn't save them. My apologies to the people I haven't credited. I've removed some of the guff from my own app, so this should work, but you might need to tweak minor stuff. Database table CREATE TABLE `users` ( `id` int(11) NOT NULL auto_increment, `username` varchar(40) NOT NULL, `password` varchar(60) NOT NULL, `state_id` int(11) NOT NULL default '11', `email` varchar(40) NOT NULL, `created` datetime NOT NULL, `modified` datetime NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `EMAIL` (`email`), UNIQUE KEY `activation_code` (`activation_code`), KEY `email_index` (`email`) ) *** /views/users/login.ctp (see http://www.dynamicdrive.com for the rollover button javascript code, article "OO Dom Image Rollover") <h1>User Login</h1> <table class="whatever"> <tr> <th>Username</th> <td><?php echo $form->input('username'); ?></td> </tr> <tr> <th>Password</th> <td><?php echo $form->input('password'); ?></td> </tr> <tr> <th>Remember Me</th> <td><?php echo $form->input('remember_me', array('label' => 'Remember Me', 'type' => 'checkbox')); ?></td> </tr> <tr> <th> </th> <th align="right"><?php echo $form->submit('/images/login.png', array('srcover' => $this->base . '/images/login-over.png', 'srcdown' => $this->base . '/images/login-down.png', 'border' => '0'));?></th> </tr> </table> <input type="hidden" name="XDEBUG_SESSION_START" value="tim" /> <?php echo $form->end(); ?> *** /views/users/register.ctp <h1>User Registration</h1> <?php echo $form->create('User', array('action' => 'register'));?> <table class="whatever"> <tr> <th>Username</th> <td><?php echo $form->input('username', array_merge($errorMessages, array('size'=>'20', 'div' => null))); ? > <span class="required_field">*</span></td> </tr> <tr> <th>Email Address</th> <td><?php echo $form->input('email', array_merge($errorMessages, array('size'=>'30', 'div' => null))); ?> <span class="required_field">*</span><br /> Please note your confirmation email will be sent to this address</ td> </tr> <tr> <th>Password</th> <td><?php echo $form->input('password', array('type'=>'password', 'size'=>'15', 'div' => null)); ?> <span class="required_field">*</span></td> </tr> <tr> <th>Confirm Password</th> <td><?php echo $form->input('password2', array('type'=>'password', 'size'=>'15', 'div' => null)); ?> <span class="required_field">*</span></td> </tr> <tr> <th> </th> <th align="right"><?php echo $form->submit('/images/register.png', array('srcover' => $this->base . '/images/register-over.png', 'srcdown' => $this->base . '/images/register-down.png', 'border' => '0'));?></th> </tr> </table> <input type="hidden" name="XDEBUG_SESSION_START" value="tim" /> <?php echo $form->end(); ?> *** /controllers/login.php <?php /** * User Controller class */ class UsersController extends AppController { var $name = 'Users'; var $helpers = array('Html', 'Form', 'Session', 'Misc'); var $components = array('Auth', 'Email', 'Cookie'); var $uses = array('User', 'UserView'); function index() { $this->redirect('/home'); } /** * Login the user */ function login() { //-- code inside this function will execute only when autoRedirect was set to false (i.e. in a beforeFilter). if ($this->RequestHandler->isPost()) { if ($this->Auth->user()) { // Does user/password checking if (!empty($this->data) && $this->data['User']['remember_me'] == '1') { // Save cookie only if checkbox ticked $cookie = array(); $cookie['username'] = $this->data['User']['username']; $cookie['password'] = $this->data['User']['password']; $this->Cookie->write('Auth.User', $cookie, true, '+2 weeks'); unset($this->data['User']['remember_me']); } $this->redirect($this->Auth->redirect()); } else { $this->Session->setFlash('Invalid user or password'); } } } /** * Log out user * */ function logout(){ $cookie = $this->Cookie->read('Auth.User'); $this->Cookie->del('Auth.User'); $this->redirect($this->Auth->logout()); } function register() { // Check if user already logged in $i = $this->getUserID(); if ($i != null && $i > 0) { $this->Session->setFlash('You\'re already logged in!'); $this->redirect('/home/index'); } // Setup data for page $this->set('title', $this->appName .'User Registration'); $this->set('errorMessages', array('error' => array('username_size' => 'Your username must be between 3 and 10 characters long', 'password' => 'Your password must be between 4 and 10 characters long', 'email' => 'Please enter a valid email address', 'first_name' => 'name size is too short' ))); if (empty($this->data)) { // Just show the form } else { // Need to encode password2 so it can be matched with password by validation, but need to keep the length // around to check as encoded password is always the same length $this->data['User']['password_length'] = strlen($this- >data['User']['password2']); $this->data['User']['password2'] = $this->Auth->password($this- >data['User']['password2']); // Attempt to register the user if ($this->User->save($this->data)) { $this->set('title', $this->appName .'User Registration Succesful'); $this->set('user', $this->data); $this->render('register_email_sent'); return; } else { $this->Session->setFlash('Please correct the errors highlighted below'); $this->data['User']['password'] = $this->data['User'] ['password2'] = ''; } } } function beforeFilter() { $this->Auth->userScope = array('User.state_id' => '12'); $this->set('title', $this->appName .'User Login'); parent::beforeFilter(); } } ?> /controllers/app_controller.php <?php /** * Main App Controller File */ class AppController extends Controller { var $components = array('Auth','Cookie', 'Email'); var $helpers = array('Html', 'Javascript', 'Ajax'); var $home = '/home/view/'; /** * Load the Authentication * * @access public */ function beforeFilter(){ $this->Auth->loginAction = array('controller' => 'users', 'action' => 'login'); $this->Auth->loginRedirect = array('controller' => 'home'); $this->Auth->allow('index'); $this->Auth->authorize = 'controller'; $this->Auth->autoRedirect = false; if ($this->getUserID() == -1) { $this->loginFromCookie(); } } function loginFromCookie() { $cookie = $this->Cookie->read('Auth.User'); if (!is_null($cookie)) { if ($this->Auth->login($cookie)) { // Clear auth message, just in case we use it. $this->Session->del('Message.auth'); //$this->redirect($this->Auth->redirect()); } else { // Delete invalid Cookie $this->Cookie->del('Auth.User'); } } } function getUserID() { $usr = $this->Auth->user(); if (!empty($usr)) { return $usr['User']['id']; } else { return -1; } } } I hope it helps someone out :) --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "CakePHP" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/cake-php?hl=en -~----------~----~----~----~------~----~------~--~---
