Ciao,
diciamo che potremmo anche parlarne per giorni su come sviluppare tutto quello che chiedi.
Di base, per definire lo stato di un utente basta che nel db sia flaggato in un certo modo, esempio 1 => attivo, 2 => pending.

Per quanto riguarda l'accesso utente devi sviluppare un sistema di autenticazione, e ci sono un milione di guide per fare questa cosa in giro.

Per distinguere un utente standard da un utente amministratore ( o qualsiasi altro ruolo ) devi implementare un sistema di autorizzazione o ACL ( Access Control List ), ed anche su questo argomento sono sicuro che ci sono decine di tutorial per il web.

Di base si tratta di avere un campo "role_id" per l'utente dove è specificato il ruolo dell'utente, es. 1 => guest, 2 => admin, 3 => superadmin, e per ogni ruolo saranno stabilite delle regole di accesso alle varie risorse del sistema.

Per quanto riguarda le password il consiglio è salvare sempre concatenandole ad un salt ( una stringa anche casuale ma fissa es: cjslidhfcidshciohsduichls ) criptate con un algoritmo irreversibile tipo md5 o sha1 es SHA1( $salt + $password ).
Una volta generata la puoi inviare in chiaro al tuo utente via email .

Ciao