Skip to content

AuthUser Component and Helper

The AuthUser component and helper provide convenient methods for working with the currently authenticated user in your controllers and views.

Key Feature: These work standalone and do not require the official Authentication or Authorization plugins. They work with any authentication solution that sets an identity in the request attributes.

AuthUser Component

The component provides easy access to the current user's data and permission checks in your controllers.

Setup

Load the component in your AppController:

php
// src/Controller/AppController.php

public function initialize(): void {
    parent::initialize();

    $this->loadComponent('TinyAuth.AuthUser');
}

Available Methods

id()

Get the current user's ID:

php
$userId = $this->AuthUser->id();

isMe(int|string $id)

Check if a given ID belongs to the current user:

php
if ($this->AuthUser->isMe($post->user_id)) {
    // User owns this post
}

hasRole(string|int $role)

Check if the user has a specific role (by alias or ID):

php
if ($this->AuthUser->hasRole('admin')) {
    // User is an admin
}

if ($this->AuthUser->hasRole(ROLE_MODERATOR)) {
    // User is a moderator (using constant)
}

hasRoles(array $roles)

Check if the user has any of the specified roles:

php
if ($this->AuthUser->hasRoles(['admin', 'moderator'])) {
    // User is either admin or moderator
}

roles()

Get all roles for the current user:

php
$userRoles = $this->AuthUser->roles();

hasAccess(array $url)

Check if the user has access to a specific URL (checks ACL):

php
if ($this->AuthUser->hasAccess(['action' => 'delete', $id])) {
    return $this->redirect(['action' => 'delete', $id]);
}
// Do something else instead

Note: By default, hasAccess() only checks the auth_acl.ini file, not auth_allow.ini. Set includeAuthentication config to true if you need to check public actions as well.

identity()

Get the full identity object/array:

php
$identity = $this->AuthUser->identity();
// Returns the original data from Authentication/Authorization identity

Example Usage

php
// In a controller action
public function edit($id) {
    $post = $this->Posts->get($id);

    // Only allow editing own posts unless admin
    if (!$this->AuthUser->isMe($post->user_id) && !$this->AuthUser->hasRole('admin')) {
        $this->Flash->error(__('You can only edit your own posts.'));
        return $this->redirect(['action' => 'index']);
    }

    // Continue with edit logic...
}

AuthUser Helper

The helper provides the same functionality in your templates, plus additional methods for conditionally displaying links.

Setup

Load the helper in your AppView:

php
// src/View/AppView.php

public function initialize(): void {
    parent::initialize();

    $this->loadHelper('TinyAuth.AuthUser');
}

Important: The helper requires the component to be loaded, as it needs data passed from the controller.

Available Methods

The helper has all the same methods as the component:

  • id()
  • isMe($id)
  • hasRole($role)
  • hasRoles($roles)
  • roles()
  • hasAccess($url)
  • identity()

Additional Helper-Only Methods

Display a link only if the user has access to that URL:

php
// Only displays if user has access to Admin prefix
echo $this->AuthUser->link('Admin Backend', ['prefix' => 'Admin', 'action' => 'index']);

If the user doesn't have access, nothing is displayed.

Display a POST link only if the user has access:

php
// Only displays delete link if user has delete permission
echo $this->AuthUser->postLink('Delete', ['action' => 'delete', $id], [
    'confirm' => 'Are you sure?',
]);

Named Routes Support

Both link() and postLink() support named routes:

php
<?= $this->AuthUser->link('Change Password', ['_name' => 'admin:account:password']); ?>

Template Examples

Conditional Content Display

php
<?php if ($this->AuthUser->hasRole('admin')): ?>
    <div class="admin-tools">
        <?= $this->AuthUser->link('Manage Users', ['controller' => 'Users', 'action' => 'index']); ?>
        <?= $this->AuthUser->link('Settings', ['controller' => 'Settings', 'action' => 'index']); ?>
    </div>
<?php endif; ?>

Show/Hide Based on Ownership

php
<?php if ($this->AuthUser->isMe($comment->user_id)): ?>
    <?= $this->AuthUser->postLink(
        'Delete Comment',
        ['action' => 'delete', $comment->id],
        ['confirm' => 'Are you sure?']
    ); ?>
<?php endif; ?>

Complex Access Checks

php
<?php if ($this->AuthUser->hasAccess(['action' => 'secretArea'])): ?>
    <div class="secret-section">
        <p>Only for you:</p>
        <?= $this->Html->link('Secret Area', ['action' => 'secretArea']); ?>
        <small>(do not tell anyone else!)</small>
    </div>
<?php endif; ?>

Role-Based Navigation

php
<nav>
    <ul>
        <li><?= $this->Html->link('Home', ['action' => 'index']); ?></li>

        <?php if ($this->AuthUser->hasRole('user')): ?>
            <li><?= $this->AuthUser->link('My Posts', ['action' => 'myPosts']); ?></li>
        <?php endif; ?>

        <?php if ($this->AuthUser->hasRoles(['admin', 'moderator'])): ?>
            <li><?= $this->AuthUser->link('Moderation', ['action' => 'moderate']); ?></li>
        <?php endif; ?>

        <?php if ($this->AuthUser->hasRole('admin')): ?>
            <li><?= $this->AuthUser->link('Admin', ['prefix' => 'Admin', 'action' => 'dashboard']); ?></li>
        <?php endif; ?>
    </ul>
</nav>

Configuration

Including Authentication in Access Checks

By default, hasAccess() only checks authorization (ACL), not authentication (public actions).

To include public actions in the access check:

php
$this->loadComponent('TinyAuth.AuthUser', [
    'includeAuthentication' => true,
]);

Note: This only works with INI-based configuration. Controller-level allow() calls cannot be detected.

Best Practices

Use Constants for Roles

Instead of magic strings, define role constants:

php
// In your bootstrap
define('ROLE_USER', 'user');
define('ROLE_MODERATOR', 'moderator');
define('ROLE_ADMIN', 'admin');

// In your code
if ($this->AuthUser->hasRole(ROLE_ADMIN)) {
    // Much better than: hasRole('admin')
}

This provides:

  • IDE autocompletion
  • Easy refactoring
  • Prevents typos
  • Self-documenting code

Combine with Form Helper

php
<?php
echo $this->Form->create($post);
echo $this->Form->control('title');
echo $this->Form->control('body');

// Only admins can change the status
if ($this->AuthUser->hasRole('admin')) {
    echo $this->Form->control('status');
}

echo $this->Form->button(__('Submit'));
echo $this->Form->end();
?>

Standalone Usage

AuthUser works with any authentication solution, not just TinyAuth:

  • CakePHP Authentication plugin - Works out of the box
  • CakePHP Authorization plugin - Works out of the box
  • Custom auth - As long as you set an identity in request attributes

The component looks for the identity in $request->getAttribute('identity') and works with any object that implements getOriginalData() or is an array.

Released under the MIT License.