Search code examples
laravelauthenticationmiddleware

two users auth in a single table in laravel 5.2


I'm trying to build an online shop website using laravel framework

I have a table with these column : id, username, password, division_id

where division_id refers to a table called division with: id, division_type

and I have two division type : Admin and Customers

I'm trying to divide permission to access a certain number of pages based on their division_id such as admin can access Admin panel but not Customer, and customer can access Customer panel such as product-order page but not admin.

Both types can do almost everything in their accessible pages, and my main pages will have an Admin Panel, a customer Panel, and main website.

How can I do that in my project using only a single table and middle-ware group?

P.S. I'm new to this forum


Solution

  • For this Middleware, you just need to check if the division required to view the site is the same as the division that the user belongs to. In the handle function, you can pass a 3rd argument that represents a division name, such as customer

    When you add the Middleware to your routes, you can pass the name of the division as an argument to the handle function like so:

    'middleware' => ['division:customer']
    

    Implementing this in an Route Group may look something like this:

    Route::group(['prefix' => 'customer', 'middleware' => ['division:customer']], funtion(){
        //route definitions for all these routes will require a "division" type of "customer"
    });
    

    Or you could apply it to route resources for RESTful routing:

    Route::resource('customer', 'CustomerController')->middleware(['divison:customer']);
    

    Or you could just apply it to a specific route:

    Route::get('customer/{id}', 'CustomerController@show')->middleware(['division:customer']);
    

    In your handle function you can access that value as the 3rd argument:

    public function handle($request, Closure $next, Division $division)
    

    To make the process of automagically resolving a dependency by something other than the primary key easy, we'll go ahead and pop open our App\Providers\RouteServiceProvider and add some magic inside of the boot function.

    public function boot(Router $router)
    {
        parent::boot($router);
    
        $router->bind('division', function($value) {
            return Division::where(function($query) use($value){
                if (is_int($value)) {
                    return $query->where('id', $value)->first();
                } else { 
                    return $query->where('type', ucfirst($value))->first();
                }
    
                return null;
            });
        });
    

    Now, back to the Middleware, we can easily make a comparison against the $division in our handle function, and our authorized user.

    if(app()->user()->division->type == $division->type) {
        return $next($request);
    }
    
    abort(403, 'You are not authorized to view this page!');