From 8631bde4a80ef2fc74e78cc05ef2dc8cc29b4bd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Mallo?= Date: Sat, 11 Nov 2017 13:56:30 +0000 Subject: [PATCH 01/42] ADD #10 authenticate and admin role. --- app/Http/Controllers/Auth/LoginController.php | 18 +++++ app/Http/Controllers/HomeController.php | 16 ++++ app/Http/Kernel.php | 13 +-- app/Http/Middleware/CheckRole.php | 25 ++++++ app/Providers/ObserverServiceProvider.php | 1 - app/User.php | 18 +++++ app/User/Role.php | 12 +++ database/factories/PostsFactory.php | 1 + ...2017_11_11_084018_add_role_users_table.php | 32 ++++++++ database/seeds/RoleTableSeeder.php | 39 +++++++++ resources/views/admin/admin.blade.php | 9 ++- resources/views/auth/login.blade.php | 58 ++++++++++++++ .../views/auth/passwords/email.blade.php | 47 +++++++++++ .../views/auth/passwords/reset.blade.php | 70 ++++++++++++++++ resources/views/auth/register.blade.php | 54 +++++++++++++ resources/views/layouts/app.blade.php | 80 +++++++++++++++++++ resources/views/partials/navbar.blade.php | 20 ++++- routes/web.php | 12 +-- 18 files changed, 508 insertions(+), 17 deletions(-) create mode 100644 app/Http/Middleware/CheckRole.php create mode 100644 app/User/Role.php create mode 100644 database/migrations/2017_11_11_084018_add_role_users_table.php create mode 100644 database/seeds/RoleTableSeeder.php create mode 100644 resources/views/auth/login.blade.php create mode 100644 resources/views/auth/passwords/email.blade.php create mode 100644 resources/views/auth/passwords/reset.blade.php create mode 100644 resources/views/auth/register.blade.php create mode 100644 resources/views/layouts/app.blade.php diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php index b2ea669..ec223a2 100644 --- a/app/Http/Controllers/Auth/LoginController.php +++ b/app/Http/Controllers/Auth/LoginController.php @@ -3,7 +3,10 @@ namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; +use App\User; use Illuminate\Foundation\Auth\AuthenticatesUsers; +use Illuminate\Http\Request; +use Illuminate\Support\Facades\Auth; class LoginController extends Controller { @@ -36,4 +39,19 @@ public function __construct() { $this->middleware('guest')->except('logout'); } + + /** + * The user has been authenticated. + * + * @param Request $request + * @param User|null $user + * @return mixed + */ + protected function authenticated(Request $request, $user) + { + if ($user && $user->isAdmin()) { + return redirect()->route('admin.index')->with('success', 'Vous êtes connecté maître.'); + } + return redirect()->route('home.index')->with('success', 'Vous êtes connecté.'); + } } diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index d1f8a6e..a3af7dd 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -2,9 +2,25 @@ namespace App\Http\Controllers; +use Illuminate\Http\Request; + class HomeController extends Controller { + /** + * Create a new controller instance. + * + * @return void + */ + public function __construct() + { + $this->middleware('auth'); + } + /** + * Show the application dashboard. + * + * @return \Illuminate\Http\Response + */ public function index() { return view('home'); diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index 93bf68b..bf8d227 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -2,6 +2,8 @@ namespace App\Http; +use App\Http\Middleware\CheckRole; +use App\Http\Middleware\RedirectIfAuthenticated; use Illuminate\Foundation\Http\Kernel as HttpKernel; class Kernel extends HttpKernel @@ -51,11 +53,12 @@ class Kernel extends HttpKernel * @var array */ protected $routeMiddleware = [ - 'auth' => \Illuminate\Auth\Middleware\Authenticate::class, + 'auth' => \Illuminate\Auth\Middleware\Authenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, - 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, - 'can' => \Illuminate\Auth\Middleware\Authorize::class, - 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, - 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, + 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, + 'can' => \Illuminate\Auth\Middleware\Authorize::class, + 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, + 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, + 'role' => CheckRole::class ]; } diff --git a/app/Http/Middleware/CheckRole.php b/app/Http/Middleware/CheckRole.php new file mode 100644 index 0000000..26391ac --- /dev/null +++ b/app/Http/Middleware/CheckRole.php @@ -0,0 +1,25 @@ +user()->hasRole($role)) { + return redirect()->route('home.index')->with('danger', 'Vous ne pouvez pas avoir accès à cette page'); + } + return $next($request); + } +} diff --git a/app/Providers/ObserverServiceProvider.php b/app/Providers/ObserverServiceProvider.php index c80eb01..ca910cb 100644 --- a/app/Providers/ObserverServiceProvider.php +++ b/app/Providers/ObserverServiceProvider.php @@ -11,7 +11,6 @@ class ObserverServiceProvider extends ServiceProvider { - public function boot() { // Add obersations class diff --git a/app/User.php b/app/User.php index bd1d184..524b7b0 100644 --- a/app/User.php +++ b/app/User.php @@ -2,6 +2,7 @@ namespace App; +use App\User\Role; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Notifications\Notifiable; use Illuminate\Foundation\Auth\User as Authenticatable; @@ -35,4 +36,21 @@ public function posts(): BelongsTo { return $this->hasMany(Post::class); } + + /** + * @return bool + */ + public function isAdmin(): bool + { + return $this->roles === Role::ADMIN; + } + + /** + * @param string $role + * @return bool + */ + public function hasRole(string $role): bool + { + return $this->roles === $role; + } } diff --git a/app/User/Role.php b/app/User/Role.php new file mode 100644 index 0000000..a11592d --- /dev/null +++ b/app/User/Role.php @@ -0,0 +1,12 @@ + $faker->slug, 'content' => $faker->text(1000), 'image' => $faker->imageUrl(), + 'online' => true, 'category_id' => function () { return factory(\App\Category::class)->create()->id; }, diff --git a/database/migrations/2017_11_11_084018_add_role_users_table.php b/database/migrations/2017_11_11_084018_add_role_users_table.php new file mode 100644 index 0000000..1dc89b5 --- /dev/null +++ b/database/migrations/2017_11_11_084018_add_role_users_table.php @@ -0,0 +1,32 @@ +enum('roles', ['admin', 'member'])->default('member'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('users', function (Blueprint $table) { + // + }); + } +} diff --git a/database/seeds/RoleTableSeeder.php b/database/seeds/RoleTableSeeder.php new file mode 100644 index 0000000..c09c510 --- /dev/null +++ b/database/seeds/RoleTableSeeder.php @@ -0,0 +1,39 @@ + 'user', + 'display_name' => 'Simple user', + 'description' => 'Just a simple user' + ], [ + 'name' => 'moderator', + 'display_name' => 'Moderator', + 'description' => 'User can moderate comments and forum' + ], [ + 'name' => 'redactor', + 'display_name' => 'Redactor', + 'description' => 'User can write post' + ], [ + 'name' => 'admin', + 'display_name' => 'Admin', + 'description' => 'User can moderate all and can write/edit post' + ], [ + 'name' => 'root', + 'display_name' => 'Super Admin', + 'description' => 'Full access' + ] + ]); + } +} diff --git a/resources/views/admin/admin.blade.php b/resources/views/admin/admin.blade.php index 2f4922d..d42d8fc 100644 --- a/resources/views/admin/admin.blade.php +++ b/resources/views/admin/admin.blade.php @@ -59,7 +59,6 @@
-

360° Dev

@@ -68,6 +67,7 @@
  • Dashboard
  • +
  • Aller sur le site
    • @@ -131,8 +131,13 @@
    -
    - - -
    +
    \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index 885eef7..f24d70c 100644 --- a/routes/web.php +++ b/routes/web.php @@ -17,8 +17,10 @@ Route::get('blog/categorie/{slug}', 'PostsController@category')->name('blog.category'); // Admin Dashboard -Route::prefix('admin')->group(function () { - Route::get('/', 'Admin\DashboardController@index')->name('admin.index'); - Route::resource('posts', 'Admin\PostsController'); - Route::resource('categories', 'Admin\CategoriesController'); -}); \ No newline at end of file +Route::group(['namespace' => 'Admin', 'prefix' => 'admin', 'middleware' => ['auth', 'role:admin']], function () { + Route::get('/', 'DashboardController@index')->name('admin.index'); + Route::resource('posts', 'PostsController'); + Route::resource('categories', 'CategoriesController'); +}); + +Auth::routes(); From 43d5072ef65ffb4ec04fa54860009b1d7b28c740 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Mallo?= Date: Sat, 11 Nov 2017 14:43:07 +0000 Subject: [PATCH 02/42] FIX #10 Redirect after login --- app/Http/Controllers/Auth/LoginController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php index ec223a2..d6d4bf0 100644 --- a/app/Http/Controllers/Auth/LoginController.php +++ b/app/Http/Controllers/Auth/LoginController.php @@ -28,7 +28,7 @@ class LoginController extends Controller * * @var string */ - protected $redirectTo = '/home'; + protected $redirectTo = '/'; /** * Create a new controller instance. From e351409b53f2e94b7ec2b9392e624fb0d07d4538 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Mallo?= Date: Sat, 11 Nov 2017 16:56:32 +0000 Subject: [PATCH 03/42] ADD #10 admin users. --- app/Http/Controllers/Admin/UserController.php | 19 +++++++++ app/User.php | 10 ++--- resources/views/admin/admin.blade.php | 5 +-- resources/views/admin/users/index.blade.php | 42 +++++++++++++++++++ routes/web.php | 3 +- 5 files changed, 68 insertions(+), 11 deletions(-) create mode 100644 app/Http/Controllers/Admin/UserController.php create mode 100644 resources/views/admin/users/index.blade.php diff --git a/app/Http/Controllers/Admin/UserController.php b/app/Http/Controllers/Admin/UserController.php new file mode 100644 index 0000000..0a8579f --- /dev/null +++ b/app/Http/Controllers/Admin/UserController.php @@ -0,0 +1,19 @@ +get(); + return response()->view('admin.users.index', compact('users')); + } +} \ No newline at end of file diff --git a/app/User.php b/app/User.php index 524b7b0..69ad597 100644 --- a/app/User.php +++ b/app/User.php @@ -16,18 +16,14 @@ class User extends Authenticatable * * @var array */ - protected $fillable = [ - 'name', 'email', 'password', - ]; + protected $fillable = ['name', 'email', 'password',]; /** * The attributes that should be hidden for arrays. * * @var array */ - protected $hidden = [ - 'password', 'remember_token', - ]; + protected $hidden = ['password', 'remember_token',]; /** * @return \Illuminate\Database\Eloquent\Relations\BelongsTo @@ -47,7 +43,7 @@ public function isAdmin(): bool /** * @param string $role - * @return bool + * @return bool True if the parameter role is the same as the connected user. */ public function hasRole(string $role): bool { diff --git a/resources/views/admin/admin.blade.php b/resources/views/admin/admin.blade.php index d42d8fc..7e7e61a 100644 --- a/resources/views/admin/admin.blade.php +++ b/resources/views/admin/admin.blade.php @@ -86,12 +86,11 @@
  • -
    Products
    +
    Utilisateurs
    diff --git a/resources/views/admin/users/index.blade.php b/resources/views/admin/users/index.blade.php new file mode 100644 index 0000000..44b60db --- /dev/null +++ b/resources/views/admin/users/index.blade.php @@ -0,0 +1,42 @@ +@extends('admin/admin') + +@section('content') + +
    +
    +

    Les utilisateurs

    + add + + + + + + + + + + + + @foreach($users as $user) + + + + + + + @endforeach + +
    #NomRoleActions
    {{ $user->id }}{{ $user->name }}{{ $user->roles }} + + mode_edit Editer + +
    + + {{ csrf_field() }} + +
    +
    +
    +
    + +@endsection \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index f24d70c..9359d93 100644 --- a/routes/web.php +++ b/routes/web.php @@ -19,8 +19,9 @@ // Admin Dashboard Route::group(['namespace' => 'Admin', 'prefix' => 'admin', 'middleware' => ['auth', 'role:admin']], function () { Route::get('/', 'DashboardController@index')->name('admin.index'); - Route::resource('posts', 'PostsController'); + Route::resource('posts', 'PostsController'); Route::resource('categories', 'CategoriesController'); + Route::resource('users', 'UserController'); }); Auth::routes(); From 99290f0a705a7a72b28a8af15564dc1bda837f45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Mallo?= Date: Sun, 12 Nov 2017 08:09:11 +0000 Subject: [PATCH 04/42] FIX #10 Delete auth middleware for Home access --- app/Http/Controllers/HomeController.php | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index a3af7dd..999a171 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -1,28 +1,21 @@ middleware('auth'); - } /** * Show the application dashboard. * * @return \Illuminate\Http\Response */ - public function index() + public function index(): Response { - return view('home'); + return response()->view('home'); } } From 8707989b65361194d177e4b8d621ebd3d1cfc1cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Mallo?= Date: Sun, 12 Nov 2017 08:18:42 +0000 Subject: [PATCH 05/42] ADD #10 Message flash for the front --- resources/views/layout.blade.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/resources/views/layout.blade.php b/resources/views/layout.blade.php index b26cb36..580d43f 100644 --- a/resources/views/layout.blade.php +++ b/resources/views/layout.blade.php @@ -15,6 +15,16 @@ @include('./partials/navbar')
    + @if (session()->has('success')) +
    +

    {{ session()->get('success') }}

    +
    + @endif + @if (session()->has('danger')) +
    +

    {{ session()->get('danger') }}

    +
    + @endif @yield('content')

    From 0b6b750a1c917ad3d904b7f293724becd631974d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Mallo?= Date: Sun, 12 Nov 2017 08:21:58 +0000 Subject: [PATCH 06/42] STD #10 phpdoc + use example --- app/Http/Middleware/CheckRole.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/Http/Middleware/CheckRole.php b/app/Http/Middleware/CheckRole.php index 26391ac..6412a87 100644 --- a/app/Http/Middleware/CheckRole.php +++ b/app/Http/Middleware/CheckRole.php @@ -5,6 +5,12 @@ use Closure; use Illuminate\Http\Request; +/** + * CheckRole + * + * The middleware that checks access to a part of the site with the role received as a parameter of the route. + * @example : ... 'middleware' => ['auth', 'role:admin']] ... + */ class CheckRole { /** From 1eed00018bd68640c820a61ee73f624b95c443da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Mallo?= Date: Sun, 12 Nov 2017 09:22:19 +0000 Subject: [PATCH 07/42] ADD #10 users admin --- app/Forms/Admin/AdminForm.php | 25 +++++++++ app/Forms/{ => Admin}/PostsForm.php | 10 +--- app/Forms/Admin/UsersForm.php | 25 +++++++++ .../Controllers/Admin/PostsController.php | 2 +- app/Http/Controllers/Admin/UserController.php | 56 ++++++++++++++++++- app/User.php | 2 +- resources/views/admin/users/edit.blade.php | 13 +++++ resources/views/admin/users/index.blade.php | 2 +- resources/views/partials/navbar.blade.php | 5 ++ 9 files changed, 129 insertions(+), 11 deletions(-) create mode 100644 app/Forms/Admin/AdminForm.php rename app/Forms/{ => Admin}/PostsForm.php (75%) create mode 100644 app/Forms/Admin/UsersForm.php create mode 100644 resources/views/admin/users/edit.blade.php diff --git a/app/Forms/Admin/AdminForm.php b/app/Forms/Admin/AdminForm.php new file mode 100644 index 0000000..3e370ba --- /dev/null +++ b/app/Forms/Admin/AdminForm.php @@ -0,0 +1,25 @@ + 'Enregistrer', + 'attr' => ['class' => 'btn btn waves-effect waves-light'] + ]); + $this->add('submit', 'submit', $defaultOptions); + } +} diff --git a/app/Forms/PostsForm.php b/app/Forms/Admin/PostsForm.php similarity index 75% rename from app/Forms/PostsForm.php rename to app/Forms/Admin/PostsForm.php index 96fa47b..9671631 100644 --- a/app/Forms/PostsForm.php +++ b/app/Forms/Admin/PostsForm.php @@ -1,16 +1,15 @@ add('submit', 'submit', [ - 'label' => 'Enregistrer', - 'attr' => ['class' => 'btn btn waves-effect waves-light'] - ]); + $this->addButton(); } } diff --git a/app/Forms/Admin/UsersForm.php b/app/Forms/Admin/UsersForm.php new file mode 100644 index 0000000..bde22b1 --- /dev/null +++ b/app/Forms/Admin/UsersForm.php @@ -0,0 +1,25 @@ +add('name', 'text') + ->add('email', 'text') + ->add('roles', 'select', [ + 'choices' => [Role::ADMIN => 'Admin', Role::MEMBER => 'Membre'], + 'empty_value' => '=== Select Role ===', + 'label' => false + ]); + + $this->addButton(); + } +} diff --git a/app/Http/Controllers/Admin/PostsController.php b/app/Http/Controllers/Admin/PostsController.php index 3f782b0..0e55af3 100644 --- a/app/Http/Controllers/Admin/PostsController.php +++ b/app/Http/Controllers/Admin/PostsController.php @@ -1,7 +1,7 @@ get(); return response()->view('admin.users.index', compact('users')); } -} \ No newline at end of file + + /** + * @param User $user + * @return Response + */ + public function edit(User $user): Response + { + $form = $this->form(UsersForm::class, [ + 'url' => route('users.update', $user), + 'method' => Method::PUT, + 'model' => $user + ]); + return response()->view('admin.users.edit', compact('user', 'form')); + } + + /** + * @param Request $request + * @param User $user + * @return View + */ + public function update(Request $request, User $user) + { + $data = [ + 'name' => $request->input('name'), + 'email' => $request->input('email'), + 'roles' => $request->input('roles') + ]; + if ($user->update($data)) { + return redirect(route('users.index'))->with('success', "L'utilisateur a bien été mis à jour"); + } + return redirect()->back(); + } + + /** + * @param User $user + * @return RedirectResponse + */ + public function destroy(User $user): RedirectResponse + { + if ($user->delete()) { + return redirect(route('users.index'))->with('success', "L'utilisateur a bien été supprimé."); + } + return redirect(route('users.index'))->with('error', "L'utilisateur n'a pas pu être supprimé."); + } +} diff --git a/app/User.php b/app/User.php index 69ad597..75d9fa0 100644 --- a/app/User.php +++ b/app/User.php @@ -16,7 +16,7 @@ class User extends Authenticatable * * @var array */ - protected $fillable = ['name', 'email', 'password',]; + protected $fillable = ['name', 'email', 'password', 'roles']; /** * The attributes that should be hidden for arrays. diff --git a/resources/views/admin/users/edit.blade.php b/resources/views/admin/users/edit.blade.php new file mode 100644 index 0000000..d0beab7 --- /dev/null +++ b/resources/views/admin/users/edit.blade.php @@ -0,0 +1,13 @@ +@extends('admin/admin') + +@section('content') + +
    +
    +

    Mettre à jour l'utilisateur {{ $user->name }}

    + + {!! form($form) !!} +
    +
    + +@endsection \ No newline at end of file diff --git a/resources/views/admin/users/index.blade.php b/resources/views/admin/users/index.blade.php index 44b60db..21e6674 100644 --- a/resources/views/admin/users/index.blade.php +++ b/resources/views/admin/users/index.blade.php @@ -23,7 +23,7 @@ {{ $user->name }} {{ $user->roles }} - + mode_edit Editer
    diff --git a/resources/views/partials/navbar.blade.php b/resources/views/partials/navbar.blade.php index 7028e88..be011da 100644 --- a/resources/views/partials/navbar.blade.php +++ b/resources/views/partials/navbar.blade.php @@ -9,6 +9,11 @@ + @auth + @if (auth()->user()->isAdmin()) + + @endif + @endauth