ExpressionEngine (EE) stores all members in a MySQL database and manages them through the Control Panel (CP) at /admin.php (or your custom CP URL). EE has a rich role-based system with configurable Member Roles (called Member Groups in EE5 and earlier). Members serve as both backend editors and frontend site members.
Adding Members via the Control Panel
Creating a New Member
- Log in to the ExpressionEngine Control Panel
- Navigate to Members > All Members
- Click New Member (top right)
- Fill in the required fields:
- Username (alphanumeric, underscores allowed)
- Screen Name (display name, can contain spaces)
- Email Address (must be unique)
- Password (and confirmation)
- Select a Primary Role from the dropdown:
- Super Admin -- Unrestricted access to everything
- Admin -- Full CP access except system-level settings
- Content Editors -- Create and edit content in assigned channels
- Members -- Frontend access only (no CP access by default)
- Custom roles as configured
- Optionally assign additional Roles (EE7 supports multiple role assignment)
- Click Save
Understanding Member Roles
ExpressionEngine 7 introduced a flexible role system. Manage roles at Members > Roles:
| Default Role | CP Access | Typical Use |
|---|---|---|
| Super Admin | Full (cannot be restricted) | Site owner, primary developer |
| Admin | Full with configurable limits | Site managers |
| Content Editors | Channel entry management | Writers, editors |
| Members | No CP access | Frontend registered users |
| Pending | No access | Awaiting activation |
| Banned | No access | Blocked accounts |
Each role has granular permission toggles:
Members > Roles > [Role Name] > Edit
Permission categories:
├── Website Access (can view site, can view offline system)
├── Control Panel Access (can access CP, which sections)
├── Channel Entries (create, edit own, edit others, delete)
├── File Manager (upload, edit, delete files)
├── Template Manager (edit templates, create groups)
├── Member Management (create, edit, delete, ban members)
├── Add-on Management (install, configure add-ons)
└── System Settings (general, content, security settings)
Adding Members via the CLI
ExpressionEngine 7 includes a CLI tool:
# Create a new member via CLI
php system/ee/eecli.php make:member \
--username=jsmith \
--screen-name="John Smith" \
--email=jsmith@example.com \
--password="SecurePass123!" \
--role="Content Editors"
# List all members
php system/ee/eecli.php list:members
# Reset a member's password
php system/ee/eecli.php reset:password jsmith
Direct Database Creation
-- Create a member directly in the database
-- Note: EE uses bcrypt for passwords
INSERT INTO exp_members (
username, screen_name, email, password, role_id,
join_date, ip_address, total_entries, total_comments
) VALUES (
'jsmith',
'John Smith',
'jsmith@example.com',
-- Generate with: php -r "echo password_hash('Pass123!', PASSWORD_BCRYPT);"
'$2y$12$hashed_password_here',
(SELECT role_id FROM exp_roles WHERE name = 'Content Editors'),
UNIX_TIMESTAMP(),
'0.0.0.0',
0, 0
);
-- Get the new member_id
SET @mid = LAST_INSERT_ID();
-- Add to the member roles table (EE7 multi-role support)
INSERT INTO exp_members_roles (member_id, role_id)
VALUES (@mid, (SELECT role_id FROM exp_roles WHERE name = 'Content Editors'));
-- Create the member data row
INSERT INTO exp_member_data (member_id) VALUES (@mid);
Registration and Self-Service
EE supports frontend member registration. Configure at Settings > Members:
Settings > Members:
├── Allow new member registrations: Yes/No
├── Require email activation: Yes/No
├── Default role for new members: [dropdown]
├── Require CAPTCHA for registration: Yes/No
├── Minimum username length: 4
├── Minimum password length: 8
├── Password must contain: uppercase, number, special char
└── Allow multiple roles per member: Yes/No
Removing and Deactivating Members
Banning a Member (Recommended for Deactivation)
- Go to Members > All Members
- Click the member's username
- Change their Primary Role to Banned
- Click Save
Banned members cannot log in, access the CP, or use frontend features. Their content and profile remain intact.
Deleting a Member
- Go to Members > All Members
- Check the box next to the member(s) to delete
- Click Bulk Actions > Delete
- EE prompts: Reassign entries to which member?
- Select a member to inherit all entries, or choose to delete entries
- Confirm the deletion
What Happens to Their Content
When you delete an EE member:
- If you reassign entries, all channel entries transfer to the selected member with full metadata preserved
- If you delete entries, all channel entries by that member are permanently removed
- Comments by the member remain but show "Guest" or the original screen name (depending on settings)
- Forum posts (if using Discussion Forum module) are preserved with the original author name
- File uploads remain in the upload directory
- Member custom fields data is deleted
CLI-Based Removal
# Ban a member (set role to Banned)
php system/ee/eecli.php update:member jsmith --role="Banned"
# Delete a member and reassign entries
php system/ee/eecli.php delete:member jsmith --reassign-to=admin
SQL-Based Deactivation
-- Ban a member
UPDATE exp_members
SET role_id = (SELECT role_id FROM exp_roles WHERE name = 'Banned')
WHERE username = 'jsmith';
-- Also update the multi-role table
DELETE FROM exp_members_roles WHERE member_id = (
SELECT member_id FROM exp_members WHERE username = 'jsmith'
);
INSERT INTO exp_members_roles (member_id, role_id)
SELECT member_id, role_id FROM exp_members m
CROSS JOIN exp_roles r
WHERE m.username = 'jsmith' AND r.name = 'Banned';
Bulk User Management
Export All Members
-- Export members to CSV
SELECT m.member_id, m.username, m.screen_name, m.email,
r.name AS role, m.join_date, m.last_visit
FROM exp_members m
JOIN exp_roles r ON m.role_id = r.role_id
ORDER BY m.username
INTO OUTFILE '/tmp/ee_members.csv'
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\n';
Bulk Import Add-on
EE has a community add-on called DataGrab (or Datagrab) for bulk member imports:
# Using the EE CLI with a custom import command
php system/ee/eecli.php import:members --file=members.csv --role="Content Editors"
Bulk Import Script
<?php
// bulk-import-members.php -- Run from EE root directory
// Bootstrap EE
define('SYSPATH', 'system/');
require SYSPATH . 'ee/EllisLab/ExpressionEngine/Boot/boot.php';
$csv = array_map('str_getcsv', file('import_members.csv'));
$header = array_shift($csv);
foreach ($csv as $row) {
$data = array_combine($header, $row);
$existing = ee('Model')->get('Member')
->filter('username', $data['username'])
->first();
if ($existing) {
echo "SKIP: {$data['username']}\n";
continue;
}
$member = ee('Model')->make('Member');
$member->username = $data['username'];
$member->screen_name = $data['screen_name'];
$member->email = $data['email'];
$member->password = password_hash($data['password'], PASSWORD_BCRYPT);
$member->role_id = $data['role_id'];
$member->join_date = time();
$member->save();
echo "ADDED: {$data['username']}\n";
}
echo "Import complete.\n";
LDAP and SSO Integration
LDAP via Add-on
ExpressionEngine supports LDAP through the Auth LDAP add-on:
// system/user/config/ldap.php
return [
'host' => 'ldap://ldap.example.com',
'port' => 389,
'base_dn' => 'dc=example,dc=com',
'bind_dn' => 'cn=admin,dc=example,dc=com',
'bind_pass' => getenv('LDAP_BIND_PASSWORD'),
'filter' => '(uid={username})',
'mapping' => [
'username' => 'uid',
'screen_name' => 'cn',
'email' => 'mail',
],
'default_role' => 'Content Editors',
'group_mapping' => [
'cn=editors,ou=groups' => 'Content Editors',
'cn=admins,ou=groups' => 'Admin',
],
];
SAML SSO
For SAML-based SSO (Okta, Azure AD), use the EE SAML add-on or implement via the EE extension hook system:
// system/user/addons/saml_auth/ext.saml_auth.php
// Extension hook: member_member_login_start
// Redirects to SAML IdP if not authenticated
Security Settings
Configure member security at Settings > Security & Privacy:
Settings > Security & Privacy:
├── Password lockout: After X failed attempts
├── Lockout duration: X minutes
├── Require secure passwords: Yes
├── Minimum password length: 12
├── Password rotation: Every X days
├── Session type: Cookies only / Cookies + Session ID
├── CP session timeout: X minutes
└── Require MFA for CP access: Yes (EE7+)
Offboarding Checklist
- Ban the member (change role to Banned) to preserve content and audit trail
- Reassign channel entries if needed, especially for critical content
- Revoke additional roles -- Remove all secondary role assignments
- Check add-on access -- Some add-ons store per-member settings or API keys
- Review template access -- If the member had template editing permissions, audit recent template changes
- Clear their sessions -- Delete from
exp_sessionstable:DELETE FROM exp_sessions WHERE member_id = X - Update LDAP/SSO -- Disable the account in your identity provider
- Audit CP log -- Review Developer > Logs > CP Log for recent actions by the member