From 6c552e653592946e544c4b826be0af57ee9793be Mon Sep 17 00:00:00 2001
From: icalF <laser.survivor@gmail.com>
Date: Mon, 4 Apr 2016 12:46:54 +0700
Subject: [PATCH] role based auth middleware finished

---
 .../Controllers/AdminDashboardController.php  | 15 -----
 app/Http/Controllers/ScheduleController.php   |  7 ++
 app/Http/Controllers/TpsController.php        |  6 ++
 app/Http/Controllers/UserController.php       |  6 ++
 app/Http/Kernel.php                           |  4 +-
 app/Http/Middleware/Authenticate.php          |  1 -
 app/Http/Middleware/AuthorizedManager.php     | 45 +++++++++++++
 app/Http/Middleware/AuthorizedScheduler.php   | 44 +++++++++++++
 app/Http/Middleware/AuthorizedUser.php        | 42 ++++++++++++
 .../PermissionsRequiredMiddleware.php         | 65 -------------------
 app/Http/routes.php                           | 10 +--
 app/User.php                                  |  5 +-
 .../2016_04_01_092434_create_roles_table.php  |  2 +
 ...016_04_02_172129_create_schedule_table.php | 34 ----------
 14 files changed, 163 insertions(+), 123 deletions(-)
 delete mode 100644 app/Http/Controllers/AdminDashboardController.php
 create mode 100644 app/Http/Middleware/AuthorizedManager.php
 create mode 100644 app/Http/Middleware/AuthorizedScheduler.php
 create mode 100644 app/Http/Middleware/AuthorizedUser.php
 delete mode 100644 app/Http/Middleware/PermissionsRequiredMiddleware.php
 delete mode 100644 database/migrations/2016_04_02_172129_create_schedule_table.php

diff --git a/app/Http/Controllers/AdminDashboardController.php b/app/Http/Controllers/AdminDashboardController.php
deleted file mode 100644
index d287d20..0000000
--- a/app/Http/Controllers/AdminDashboardController.php
+++ /dev/null
@@ -1,15 +0,0 @@
-<?php
-
-namespace App\Http\Controllers;
-
-use Illuminate\Http\Request;
-
-use App\Http\Requests;
-
-class AdminDashboardController extends Controller
-{
-    public function index()
-    {
-      return 'Admin';
-    }
-}
diff --git a/app/Http/Controllers/ScheduleController.php b/app/Http/Controllers/ScheduleController.php
index f21761e..953e9f7 100644
--- a/app/Http/Controllers/ScheduleController.php
+++ b/app/Http/Controllers/ScheduleController.php
@@ -8,6 +8,12 @@ use App\Http\Requests;
 
 class ScheduleController extends Controller
 {
+    public function __construct()
+    {
+        $this->middleware('auth');
+        $this->middleware('scheduler');        
+    }
+    
     public function index()
     {
         return Schedule::all();
@@ -48,3 +54,4 @@ class ScheduleController extends Controller
         Schedule::find($id)->delete();
         return Schedule::all();
     }
+}
\ No newline at end of file
diff --git a/app/Http/Controllers/TpsController.php b/app/Http/Controllers/TpsController.php
index 436e9bc..afe211c 100644
--- a/app/Http/Controllers/TpsController.php
+++ b/app/Http/Controllers/TpsController.php
@@ -8,6 +8,12 @@ use App\Http\Requests;
 
 class TpsController extends Controller
 {
+    public function __construct()
+    {
+        $this->middleware('auth');
+        $this->middleware('manager');
+    }
+    
     public function index()
     {
         return Tps::all();
diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php
index fe4904f..b7097e8 100644
--- a/app/Http/Controllers/UserController.php
+++ b/app/Http/Controllers/UserController.php
@@ -8,6 +8,12 @@ use App\Http\Requests;
 
 class UserController extends Controller
 {
+    public function __construct()
+    {
+        $this->middleware('auth');
+        $this->middleware('user');
+    }
+    
     public function index()
     {
         return User::all();
diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php
index 3efdcaa..1a79671 100644
--- a/app/Http/Kernel.php
+++ b/app/Http/Kernel.php
@@ -48,6 +48,8 @@ class Kernel extends HttpKernel
         'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
         'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
         'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
-        'permissions.required' => \App\Http\Middleware\PermissionsRequiredMiddleware::class,
+        'user' => \App\Http\Middleware\AuthorizedUser::class,
+        'manager' => \App\Http\Middleware\AuthorizedManager::class,
+        'scheduler' => \App\Http\Middleware\AuthorizedScheduler::class,
     ];
 }
diff --git a/app/Http/Middleware/Authenticate.php b/app/Http/Middleware/Authenticate.php
index c09d7cd..7ddc5c3 100644
--- a/app/Http/Middleware/Authenticate.php
+++ b/app/Http/Middleware/Authenticate.php
@@ -17,7 +17,6 @@ class Authenticate
      */
     public function handle($request, Closure $next, $guard = null)
     {
-        // dd($request);
         if (Auth::guard($guard)->guest()) {
             if ($request->ajax() || $request->wantsJson()) {
                 return response('Unauthorized.', 403);
diff --git a/app/Http/Middleware/AuthorizedManager.php b/app/Http/Middleware/AuthorizedManager.php
new file mode 100644
index 0000000..e4f943e
--- /dev/null
+++ b/app/Http/Middleware/AuthorizedManager.php
@@ -0,0 +1,45 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use Closure;
+use Illuminate\Support\Facades\Auth;
+use App\Tps;
+
+class AuthorizedManager
+{
+    /**
+     * Handle an incoming request.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @param  \Closure  $next
+     * @return mixed
+     */
+    public function handle($request, Closure $next)
+    {
+        $user = Auth::user();
+        $role = $user->role();
+        $param = $request->route()->parameters();
+        $tps_id = !$param ? null : $param['tps'];
+        $tps = Tps::find($tps_id);
+        $mgr_id = !$tps ? null : $tps->id_manager;
+
+        if (!$tps_id) 
+        {
+            if ($role == 'admin')
+            {
+                return $next($request);
+            }
+            else
+            {
+                return redirect('/')->with('error', 'Not authorized');
+            }
+        }
+        else if ($mgr_id && $user->id == $mgr_id)
+        {
+            return $next($request);
+        }
+
+        return redirect('/')->with('error', 'Not authorized');
+    }
+}
diff --git a/app/Http/Middleware/AuthorizedScheduler.php b/app/Http/Middleware/AuthorizedScheduler.php
new file mode 100644
index 0000000..42d4a6e
--- /dev/null
+++ b/app/Http/Middleware/AuthorizedScheduler.php
@@ -0,0 +1,44 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use Closure;
+use Illuminate\Support\Facades\Auth;
+
+class AuthorizedScheduler
+{
+    /**
+     * Handle an incoming request.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @param  \Closure  $next
+     * @return mixed
+     */
+    public function handle($request, Closure $next)
+    {
+        $user = Auth::user();
+        $role = $user->role();
+        $param = $request->route()->parameters();
+        $tps_id = $request->input('id_tps');
+        $tps = !$tps_id ? null : Tps::find($tps_id);
+        $mgr_id = !$tps ? null : $tps->id_manager;
+
+        if (!$tps_id)
+        {
+            if ($role == 'admin')
+            {
+                return $next($request);
+            }
+            else
+            {
+                return redirect('/')->with('error', 'Not authorized');
+            }
+        }
+        else if ($mgr_id && $user->id == $mgr_id)
+        {
+            return $next($request);
+        }
+
+        return redirect('/')->with('error', 'Not authorized');
+    }
+}
diff --git a/app/Http/Middleware/AuthorizedUser.php b/app/Http/Middleware/AuthorizedUser.php
new file mode 100644
index 0000000..b19481a
--- /dev/null
+++ b/app/Http/Middleware/AuthorizedUser.php
@@ -0,0 +1,42 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use Closure;
+use Illuminate\Support\Facades\Auth;
+
+class AuthorizedUser
+{
+    /**
+     * Handle an incoming request.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @param  \Closure  $next
+     * @return mixed
+     */
+    public function handle($request, Closure $next)
+    {
+        $user = Auth::user();
+        $role = $user->role();
+        $id = !$request->route()->parameters() ? null : 
+                $request->route()->parameters()['user'];
+
+        if (!$id) 
+        {
+            if ($role == 'admin')
+            {
+                return $next($request);
+            }
+            else
+            {
+                return redirect('/')->with('error', 'Not authorized');
+            }
+        }
+        else if ($user->id == $id)
+        {
+            return $next($request);
+        }
+
+        return redirect('/')->with('error', 'Not authorized');
+    }
+}
diff --git a/app/Http/Middleware/PermissionsRequiredMiddleware.php b/app/Http/Middleware/PermissionsRequiredMiddleware.php
deleted file mode 100644
index fd328f0..0000000
--- a/app/Http/Middleware/PermissionsRequiredMiddleware.php
+++ /dev/null
@@ -1,65 +0,0 @@
-<?php
-
-namespace App\Http\Middleware;
-
-use Closure;
-
-class PermissionsRequiredMiddleware
-{
-    /**
-     * Handle an incoming request.
-     *
-     * @param  \Illuminate\Http\Request  $request
-     * @param  \Closure  $next
-     * @return mixed
-     */
-    public function handle($request, Closure $next)
-    {    
-        return \Auth::user();
-        // Check if a user is logged in.
-        if (!$user = $request->user())
-        {
-            return redirect()->guest('login');
-        }
-
-        // Get the current route.
-        $route = $request->route();
-
-        // Get the current route actions.
-        $actions = $route->getAction();
-
-        // Check if we have any permissions to check the user has.
-        if (!$permissions = isset($actions['permissions']) ? $actions['permissions'] : null)
-        {    
-            // No permissions to check, allow access.
-            return abort(403);
-        }
-
-        // Fetch all of the matching user permissions.
-        $userPermissions = array_fetch($user->permissions()->whereIn('slug', (array) $permissions)->get()->toArray(), 'slug');
-
-        // Turn the permissions we require into an array.
-        $permissions = (array) $permissions;
-
-        // Check if we require all permissions, or just one.
-        if (isset($actions['permissions_require_all']))
-        {
-            // If user has EVERY permission required.
-            if (count($permissions) == count($userPermissions))
-            {    
-                // Access is granted.
-                return $next($request);
-            }
-        } else {
-            // If the user has the permission.
-            if (count($userPermissions) >= 1)
-            {
-                // Access is granted and the rest of the permissions are ignored.
-                return $next($request);
-            }
-        }
-
-        // If we reach this far, the user does not have the required permissions.
-        return abort(404);
-    }
-}
diff --git a/app/Http/routes.php b/app/Http/routes.php
index d5ef42b..558ea36 100644
--- a/app/Http/routes.php
+++ b/app/Http/routes.php
@@ -11,12 +11,12 @@
 |
 */
 
-Route::group(['middleware' => ['web', ]], function () {
+Route::group(['middleware' => 'web'], function () {
     Route::auth();
     Route::get('/', 'HomeController@index');              // homnya kan cm 1 
     Route::get('/home', 'HomeController@index');
-});
 
-Route::resource('user', 'UserController');
-Route::resource('tps', 'TpsController');
-Route::resource('schedule', 'ScheduleController');
+    Route::resource('user', 'UserController');
+    Route::resource('tps', 'TpsController');
+    Route::resource('schedule', 'ScheduleController');
+});
diff --git a/app/User.php b/app/User.php
index 3fa6df9..6f4666a 100644
--- a/app/User.php
+++ b/app/User.php
@@ -24,9 +24,10 @@ class User extends Authenticatable
         'password', 'remember_token',
     ];
 
-    public function roles()
+    public function role()
     {
-        return $this->belongsTo('App\Role');
+        // $this->belongsTo('App\Role');
+        return Role::find($this->role_id)->name;
     }
 
     public function schedule()
diff --git a/database/migrations/2016_04_01_092434_create_roles_table.php b/database/migrations/2016_04_01_092434_create_roles_table.php
index 0b22c92..dbad67f 100644
--- a/database/migrations/2016_04_01_092434_create_roles_table.php
+++ b/database/migrations/2016_04_01_092434_create_roles_table.php
@@ -3,6 +3,8 @@
 use Illuminate\Database\Schema\Blueprint;
 use Illuminate\Database\Migrations\Migration;
 
+use App\Role;
+
 class CreateRolesTable extends Migration 
 {
     /**
diff --git a/database/migrations/2016_04_02_172129_create_schedule_table.php b/database/migrations/2016_04_02_172129_create_schedule_table.php
deleted file mode 100644
index d45e5c1..0000000
--- a/database/migrations/2016_04_02_172129_create_schedule_table.php
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-
-use Illuminate\Database\Schema\Blueprint;
-use Illuminate\Database\Migrations\Migration;
-
-class CreateScheduleTable extends Migration
-{
-    /**
-     * Run the migrations.
-     *
-     * @return void
-     */
-    public function up()
-    {
-        Schema::create('schedule', function(Blueprint $table)
-        {
-            $table->increments('id');
-            $table->integer('id_tps')->unsigned();
-            $table->integer('id_user')->unsigned();
-            $table->timestamp('time');
-            $table->timestamps();
-        }); 
-    }
-
-    /**
-     * Reverse the migrations.
-     *
-     * @return void
-     */
-    public function down()
-    {
-        Schema::drop('schedule');
-    }
-}
-- 
GitLab