Audit Resolvers

A resolver is a class that implements one of the following contracts:

Each resolver must have a public static resolve() method with the appropriate logic.

IP Address Resolver

By default, this resolver uses the Request::ip() method to get the current IP address.

Most of the times, this will get the correct value, but for applications running behind a proxy or a load balancer, IP addresses must be obtained differently.

Usually, the real IP address will be passed via an X-Forwarded-For HTTP header.

<?php
namespace App\Resolvers;

use Illuminate\Support\Facades\Request;

class IpAddressResolver implements \OwenIt\Auditing\Contracts\IpAddressResolver
{
    /**
     * {@inheritdoc}
     */
    public static function resolve(): string
    {
        return Request::header('HTTP_X_FORWARDED_FOR', '0.0.0.0');
    }
}

Set the custom IP Address resolver in the config/audit.php configuration file:

return [
    // ...

    'resolver' = [
        // ...
        'ip_address' => App\Resolvers\IpAddressResolver::class,
        // ...
    ],

    // ...
];

URL Resolver

This resolver uses the Request::fullUrlWithQuery() method to get the current URL (including any query strings).

Here's a resolver example where query strings are not included.

<?php
namespace App\Resolvers;

use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Request;

class UrlResolver implements \OwenIt\Auditing\Contracts\UrlResolver
{
    /**
     * {@inheritdoc}
     */
    public static function resolve(): string
    {
        if (App::runningInConsole()) {
            return 'console';
        }

        // Just the full URL without query strings
        return Request::fullUrl();
    }
}

Set the custom URL resolver in the config/audit.php configuration file:

return [
    // ...

    'resolver' = [
        // ...
        'url' => App\Resolvers\UrlResolver::class,
        // ...
    ],

    // ...
];

User Agent Resolver

This resolver uses the Request::userAgent() method, which might return null if a User Agent isn't available.

The following example will return a default string when the User-Agent HTTP header is empty/unavailable.

<?php
namespace App\Resolvers;

use Illuminate\Support\Facades\Request;

class UserAgentResolver implements \OwenIt\Auditing\Contracts\UserAgentResolver
{
    /**
     * {@inheritdoc}
     */
    public static function resolve()
    {
        // Default to "N/A" if the User Agent isn't available
        return Request::header('User-Agent', 'N/A');
    }
}

Set the custom User Agent resolver in the config/audit.php configuration file:

return [
    // ...

    'resolver' = [
        // ...
        'user_agent' => App\Resolvers\UserAgentResolver::class,
        // ...
    ],

    // ...
];

User Resolver

Out of the box, this resolver uses the Laravel Auth facade.

The resolve() method must return the ID of the currently logged User, or null if the User cannot be resolved.

When using other authentication mechanisms like Sentinel, a different resolver must be implemented.

<?php
namespace App\Resolvers;

use Cartalyst\Sentinel\Laravel\Facades\Sentinel;

class UserResolver implements \OwenIt\Auditing\Contracts\UserResolver
{
    /**
     * {@inheritdoc}
     */
    public static function resolve()
    {
        return Sentinel::check() ? Sentinel::getUser()->getUserId() : null;
    }
}

Set the custom User resolver in the config/audit.php configuration file:

return [
    // ...

    'resolver' = [
        // ...
        'user' => App\Resolvers\UserResolver::class,
        // ...
    ],

    // ...
];