cartalyst / sentinel

A framework agnostic authentication & authorization system.
BSD 3-Clause "New" or "Revised" License
1.52k stars 242 forks source link

Where do I add the checkpoint code? #224

Closed zakiaziz closed 8 years ago

zakiaziz commented 8 years ago

ref: https://cartalyst.com/manual/sentinel/2.0#functions

$checkpoint = new Your\Custom\Checkpoint;
Sentinel::addCheckpoint('your_checkpoint', $checkpoint);

I'm on laravel 5.1, where in my code should this be put? I've tried adding it in boot() and register() in AppServiceProvider.php but It gives me an error.

brunogaspar commented 8 years ago

It would help to know the error you're having :)

zakiaziz commented 8 years ago

woops sorry. At first there were no errors returning just a 500 and a blank page but that was due to the Exception handling package not being loaded yet. After removing that package I see this:

screen shot 2016-04-19 at 10 14 06 am

brunogaspar commented 8 years ago

Can't reproduce.

Can you paste your config/app.php file contents?

zakiaziz commented 8 years ago
<?php

return [

    /*
    |--------------------------------------------------------------------------
    | Application Debug Mode
    |--------------------------------------------------------------------------
    |
    | When your application is in debug mode, detailed error messages with
    | stack traces will be shown on every error that occurs within your
    | application. If disabled, a simple generic error page is shown.
    |
    */

    'debug' => env('APP_DEBUG', false),

    /*
    |--------------------------------------------------------------------------
    | Application URL
    |--------------------------------------------------------------------------
    |
    | This URL is used by the console to properly generate URLs when using
    | the Artisan command line tool. You should set this to the root of
    | your application so that it is used when running Artisan tasks.
    |
    */

    'url' => env('CONFIG_APP_URL', 'http://api.domain.com'),

    /*
    |--------------------------------------------------------------------------
    | Application Timezone
    |--------------------------------------------------------------------------
    |
    | Here you may specify the default timezone for your application, which
    | will be used by the PHP date and date-time functions. We have gone
    | ahead and set this to a sensible default for you out of the box.
    |
    */

    'timezone' => 'UTC',

    /*
    |--------------------------------------------------------------------------
    | Application Locale Configuration
    |--------------------------------------------------------------------------
    |
    | The application locale determines the default locale that will be used
    | by the translation service provider. You are free to set this value
    | to any of the locales which will be supported by the application.
    |
    */

    'locale' => 'en',

    /*
    |--------------------------------------------------------------------------
    | Application Fallback Locale
    |--------------------------------------------------------------------------
    |
    | The fallback locale determines the locale to use when the current one
    | is not available. You may change the value to correspond to any of
    | the language folders that are provided through your application.
    |
    */

    'fallback_locale' => 'en',

    /*
    |--------------------------------------------------------------------------
    | Encryption Key
    |--------------------------------------------------------------------------
    |
    | This key is used by the Illuminate encrypter service and should be set
    | to a random, 32 character string, otherwise these encrypted strings
    | will not be safe. Please do this before deploying an application!
    |
    */

    'key' => env('APP_KEY', 'SECRET_KEY'),

    'cipher' => 'AES-256-CBC',

    /*
    |--------------------------------------------------------------------------
    | Logging Configuration
    |--------------------------------------------------------------------------
    |
    | Here you may configure the log settings for your application. Out of
    | the box, Laravel uses the Monolog PHP logging library. This gives
    | you a variety of powerful log handlers / formatters to utilize.
    |
    | Available Settings: "single", "daily", "syslog", "errorlog"
    |
    */

    'log' => 'single',

    /*
    |--------------------------------------------------------------------------
    | Autoloaded Service Providers
    |--------------------------------------------------------------------------
    |
    | The service providers listed here will be automatically loaded on the
    | request to your application. Feel free to add your own services to
    | this array to grant expanded functionality to your applications.
    |
    */

    'providers' => [

        /*
         * Laravel Framework Service Providers...
         */
        Illuminate\Foundation\Providers\ArtisanServiceProvider::class,
        Illuminate\Auth\AuthServiceProvider::class,
        Illuminate\Broadcasting\BroadcastServiceProvider::class,
        Illuminate\Bus\BusServiceProvider::class,
        Illuminate\Cache\CacheServiceProvider::class,
        Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
        Illuminate\Routing\ControllerServiceProvider::class,
        Illuminate\Cookie\CookieServiceProvider::class,
        Illuminate\Database\DatabaseServiceProvider::class,
        Illuminate\Encryption\EncryptionServiceProvider::class,
        Illuminate\Filesystem\FilesystemServiceProvider::class,
        Illuminate\Foundation\Providers\FoundationServiceProvider::class,
        Illuminate\Hashing\HashServiceProvider::class,
        Illuminate\Mail\MailServiceProvider::class,
        Illuminate\Pagination\PaginationServiceProvider::class,
        Illuminate\Pipeline\PipelineServiceProvider::class,
        Illuminate\Queue\QueueServiceProvider::class,
        Illuminate\Redis\RedisServiceProvider::class,
        Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,
        Illuminate\Session\SessionServiceProvider::class,
        Illuminate\Translation\TranslationServiceProvider::class,
        Illuminate\Validation\ValidationServiceProvider::class,
        Illuminate\View\ViewServiceProvider::class,

        /*
         * Application Service Providers...
         */
        App\Providers\AppServiceProvider::class,
        App\Providers\AuthServiceProvider::class,
        App\Providers\EventServiceProvider::class,
        App\Providers\RouteServiceProvider::class,

        /*
         * Third party
         */
        Cartalyst\Sentinel\Laravel\SentinelServiceProvider::class,
        Barryvdh\Cors\ServiceProvider::class,
        Spatie\Fractal\FractalServiceProvider::class,
        Mpociot\Teamwork\TeamworkServiceProvider::class,
        LucaDegasperi\OAuth2Server\Storage\FluentStorageServiceProvider::class,
        LucaDegasperi\OAuth2Server\OAuth2ServerServiceProvider::class,
        Maatwebsite\Excel\ExcelServiceProvider::class,
        Spatie\Tail\TailServiceProvider::class,
        Clockwork\Support\Laravel\ClockworkServiceProvider::class,
        Tylercd100\LERN\LERNServiceProvider::class,
        Barryvdh\Debugbar\ServiceProvider::class,
        Vinkla\Hashids\HashidsServiceProvider::class

    ],

    /*
    |--------------------------------------------------------------------------
    | Class Aliases
    |--------------------------------------------------------------------------
    |
    | This array of class aliases will be registered when this application
    | is started. However, feel free to register as many as you wish as
    | the aliases are "lazy" loaded so they don't hinder performance.
    |
    */

    'aliases' => [

        'App'       => Illuminate\Support\Facades\App::class,
        'Artisan'   => Illuminate\Support\Facades\Artisan::class,
        'Auth'      => Illuminate\Support\Facades\Auth::class,
        'Blade'     => Illuminate\Support\Facades\Blade::class,
        'Bus'       => Illuminate\Support\Facades\Bus::class,
        'Cache'     => Illuminate\Support\Facades\Cache::class,
        'Config'    => Illuminate\Support\Facades\Config::class,
        'Cookie'    => Illuminate\Support\Facades\Cookie::class,
        'Crypt'     => Illuminate\Support\Facades\Crypt::class,
        'DB'        => Illuminate\Support\Facades\DB::class,
        'Eloquent'  => Illuminate\Database\Eloquent\Model::class,
        'Event'     => Illuminate\Support\Facades\Event::class,
        'File'      => Illuminate\Support\Facades\File::class,
        'Gate'      => Illuminate\Support\Facades\Gate::class,
        'Hash'      => Illuminate\Support\Facades\Hash::class,
        'Input'     => Illuminate\Support\Facades\Input::class,
        'Inspiring' => Illuminate\Foundation\Inspiring::class,
        'Lang'      => Illuminate\Support\Facades\Lang::class,
        'Log'       => Illuminate\Support\Facades\Log::class,
        'Mail'      => Illuminate\Support\Facades\Mail::class,
        'Password'  => Illuminate\Support\Facades\Password::class,
        'Queue'     => Illuminate\Support\Facades\Queue::class,
        'Redirect'  => Illuminate\Support\Facades\Redirect::class,
        'Redis'     => Illuminate\Support\Facades\Redis::class,
        'Request'   => Illuminate\Support\Facades\Request::class,
        'Response'  => Illuminate\Support\Facades\Response::class,
        'Route'     => Illuminate\Support\Facades\Route::class,
        'Schema'    => Illuminate\Support\Facades\Schema::class,
        'Session'   => Illuminate\Support\Facades\Session::class,
        'Storage'   => Illuminate\Support\Facades\Storage::class,
        'URL'       => Illuminate\Support\Facades\URL::class,
        'Validator' => Illuminate\Support\Facades\Validator::class,
        'View'      => Illuminate\Support\Facades\View::class,

        'Activation'=> Cartalyst\Sentinel\Laravel\Facades\Activation::class,
        'Reminder'  => Cartalyst\Sentinel\Laravel\Facades\Reminder::class,
        'Sentinel'  => Cartalyst\Sentinel\Laravel\Facades\Sentinel::class,
        'Fractal'   => Spatie\Fractal\FractalFacade::class,
        'Authorizer'=> LucaDegasperi\OAuth2Server\Facades\Authorizer::class,
        'Excel'     => Maatwebsite\Excel\Facades\Excel::class,
        'LERN'      => Tylercd100\LERN\Facades\LERN::class,
        'Debugbar'  => Barryvdh\Debugbar\Facade::class,
        'Hashids'   => Vinkla\Hashids\Facades\Hashids::class

    ],

];
brunogaspar commented 8 years ago

I recommend you to move all the package service provider to be before the application ones.

This should fix the issue for you.

zakiaziz commented 8 years ago

you mean like this?

    'providers' => [

        /*
         * Laravel Framework Service Providers...
         */
        Illuminate\Foundation\Providers\ArtisanServiceProvider::class,
        Illuminate\Auth\AuthServiceProvider::class,
        Illuminate\Broadcasting\BroadcastServiceProvider::class,
        Illuminate\Bus\BusServiceProvider::class,
        Illuminate\Cache\CacheServiceProvider::class,
        Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
        Illuminate\Routing\ControllerServiceProvider::class,
        Illuminate\Cookie\CookieServiceProvider::class,
        Illuminate\Database\DatabaseServiceProvider::class,
        Illuminate\Encryption\EncryptionServiceProvider::class,
        Illuminate\Filesystem\FilesystemServiceProvider::class,
        Illuminate\Foundation\Providers\FoundationServiceProvider::class,
        Illuminate\Hashing\HashServiceProvider::class,
        Illuminate\Mail\MailServiceProvider::class,
        Illuminate\Pagination\PaginationServiceProvider::class,
        Illuminate\Pipeline\PipelineServiceProvider::class,
        Illuminate\Queue\QueueServiceProvider::class,
        Illuminate\Redis\RedisServiceProvider::class,
        Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,
        Illuminate\Session\SessionServiceProvider::class,
        Illuminate\Translation\TranslationServiceProvider::class,
        Illuminate\Validation\ValidationServiceProvider::class,
        Illuminate\View\ViewServiceProvider::class,

        /*
         * Third party
         */
        Cartalyst\Sentinel\Laravel\SentinelServiceProvider::class,
        Barryvdh\Cors\ServiceProvider::class,
        Spatie\Fractal\FractalServiceProvider::class,
        Mpociot\Teamwork\TeamworkServiceProvider::class,
        LucaDegasperi\OAuth2Server\Storage\FluentStorageServiceProvider::class,
        LucaDegasperi\OAuth2Server\OAuth2ServerServiceProvider::class,
        Maatwebsite\Excel\ExcelServiceProvider::class,
        Spatie\Tail\TailServiceProvider::class,
        Clockwork\Support\Laravel\ClockworkServiceProvider::class,
        Tylercd100\LERN\LERNServiceProvider::class,
        Barryvdh\Debugbar\ServiceProvider::class,
        Vinkla\Hashids\HashidsServiceProvider::class,

        /*
         * Application Service Providers...
         */
        App\Providers\AppServiceProvider::class,
        App\Providers\AuthServiceProvider::class,
        App\Providers\EventServiceProvider::class,
        App\Providers\RouteServiceProvider::class,        

    ],

Unfortunately that gives me this error: screen shot 2016-04-19 at 10 27 58 am

brunogaspar commented 8 years ago

Yes, like that and i can't reproduce that on my end :\

zakiaziz commented 8 years ago

Just incase this helps:

I've also added this class:

<?php
namespace App\Lib\Sentinel;
use Cartalyst\Sentinel\Checkpoints\CheckpointInterface;
use Cartalyst\Sentinel\Users\UserInterface;

class SuperAdminApprovedCheckpoint implements CheckpointInterface
{
    public function login(UserInterface $user)
    {
        //
    }

    public function check(UserInterface $user)
    {
        //
    }

    public function fail(UserInterface $user = null)
    {
        //
    }

    protected function isSuperAdminApproved(UserInterface $user)
    {
        // this code block does not get reached
        dd($user);
    }
}

and in config/cartalyst.sentinel.php :

    'checkpoints' => [
        'throttle',
        'activation',
        'superAdminApproved'
    ],

and in AppServiceProver.php:

    public function register()
    {
        //
        Sentinel::addCheckpoint('superAdminApproved', new \App\Lib\Sentinel\SuperAdminApprovedCheckpoint);

    }
brunogaspar commented 8 years ago

@zakiaziz Is it working as expected now? Considering we're not being able to reproduce it's a bit difficult to help debug.

zakiaziz commented 8 years ago

I have not tried it again, got caught up with some other work. I will be getting around to this tomorrow or this weekend. Will follow up.

brunogaspar commented 8 years ago

👍

zakiaziz commented 8 years ago

I was still not able to make it work. I've manually added in some code in my controller to do this check.

brunogaspar commented 8 years ago

What exactly doesn't work? Are you still having the error you mentioned here?

zakiaziz commented 8 years ago

@brunogaspar yes that's the error I get

brunogaspar commented 8 years ago

Sorry but i can't really reproduce this issue.

Here are my 2 test apps

To note that i'm only registering the checkpoint, not doing anything extra.

Going to close as i don't see this as being a bug on our end. If you have a way to duplicate this on a fresh app, let me know.