⚠️ Archived Post
This is an archived post from my previous blog (2007-2014). It may contain outdated information, broken links, or deprecated technical content. For current writing, please see the main Writing section.

CakePHP: Creating a Custom Shell for Adding Users for Use With AuthComponent

Originally published on July 31, 2008

I’m cursed with having to use PHP for a current small project. I hate PHP, but with CakePHP it’s not too bad. I did a little write-up on creating a custom CakePHP shell for adding users with AuthComponent (it’s not published yet, so you might not be able to view it). Here it is: AuthComponent is great and there are tutorials for letting users register an account. But what if you just want a convenient way to add a few admin users? This custom shell will help you! The AuthComponent guide at http://manual.cakephp.org/view/172/authentication is very useful. Read it. I have a simple admin tool that uses AuthComponent. I also want a convenient way to create admin users, though and I surely don’t want to allow everyone to register their own admin account. So I wrote a custom shell. This shell assumes that you have a User model like this: Model Class:

<?php
class User extends AppModel {
    var $name = 'User';
}
?>

It should be backed by a database table named ‘users’ with this layout:

CREATE TABLE users (
  id integer auto_increment,
  username char(50),
  password char(50),
  PRIMARY KEY (id)
);

To create users, put this custom shell code into the file app/vendors/shells/create_user.php:

<?php
class CreateUserShell extends Shell {
    var $uses = array('User');

    function main() {
        App::import('Component','Auth');
        $this->Auth = new AuthComponent(null);

        $this->out('Create Admin User:');
        $this->hr();

        while (empty($username)) {
          $username = $this->in('Username:');
          if (empty($username)) $this->out('Username must not be empty!');
        }

        while (empty($pwd1)) {
          $pwd1 = $this->in('Password:');
          if (empty($pwd1)) $this->out('Password must not be empty!');
        }

        while (empty($pwd2)) {
          $pwd2 = $this->in('Password Confirmation:');
          if ($pwd1 !== $pwd2) {
            $this->out('Passwort and confirmation do not match!');
            $pwd2 = NULL;
          }
        }

        // we got all the data, let's create the user
        $this->User->create();
              if ($this->User->save(array('username' => $username, 'password' => $this->Auth->password($pwd1)))) {
                  $this->out('Admin User created successfully!');
              } else {
                  $this->out('ERROR while creating the Admin User!!!');
              }
    }
}
?>

That’s it, now you can run your spiffy new shell script like so:

cake/console/cake create_user

Enjoy!


Comments

Johannes Fahrenkrug said...

Hey Tom,

Thank you for your kind feedback! I'm glad it was helpful for you :)

January 27, 2009 06:45 AM

Tom said...

You probably just saved me a good deal of time learning CakePhp shells so that I could accomplish just this -- and provided an excellent simple example of a cake shell script in the bargain. Thanks!

January 27, 2009 03:38 AM