From 0c9bc7c0cd1893e8d36f5e5167454f42184f982f Mon Sep 17 00:00:00 2001 From: Ibrahim Khalil Date: Thu, 23 Nov 2023 12:45:12 +0600 Subject: [PATCH] u 23nov2023 --- .../Backend/AuthenticationController.php | 21 +- .../Backend/PermissionController.php | 91 ++++++++ .../Controllers/Backend/RoleController.php | 98 +++++++++ app/Http/Controllers/Controller.php | 9 + app/Http/Controllers/PermissionController.php | 65 ------ app/Http/Kernel.php | 1 + app/Http/Middleware/checkAuth.php | 17 +- app/Http/Middleware/checkRole.php | 14 +- .../Backend/Permission/SaveRequest.php | 28 +++ .../Requests/Backend/Role/AddNewRequest.php | 30 +++ .../Requests/Backend/Role/UpdateRequest.php | 32 +++ composer.json | 1 + composer.lock | 64 +++++- .../2023_10_12_031415_create_roles_table.php | 10 +- resources/views/backend/layouts/app.blade.php | 8 +- .../views/backend/permission/index.blade.php | 206 ++++++++++++++++++ resources/views/backend/role/create.blade.php | 85 ++++++++ resources/views/backend/role/edit.blade.php | 86 ++++++++ resources/views/backend/role/index.blade.php | 168 ++++++++++++++ resources/views/backend/user/index.blade.php | 2 +- routes/web.php | 13 +- 21 files changed, 957 insertions(+), 92 deletions(-) create mode 100644 app/Http/Controllers/Backend/PermissionController.php create mode 100644 app/Http/Controllers/Backend/RoleController.php delete mode 100644 app/Http/Controllers/PermissionController.php create mode 100644 app/Http/Requests/Backend/Permission/SaveRequest.php create mode 100644 app/Http/Requests/Backend/Role/AddNewRequest.php create mode 100644 app/Http/Requests/Backend/Role/UpdateRequest.php create mode 100644 resources/views/backend/permission/index.blade.php create mode 100644 resources/views/backend/role/create.blade.php create mode 100644 resources/views/backend/role/edit.blade.php create mode 100644 resources/views/backend/role/index.blade.php diff --git a/app/Http/Controllers/Backend/AuthenticationController.php b/app/Http/Controllers/Backend/AuthenticationController.php index cab4e6f..21ea1fd 100644 --- a/app/Http/Controllers/Backend/AuthenticationController.php +++ b/app/Http/Controllers/Backend/AuthenticationController.php @@ -48,11 +48,14 @@ public function signInCheck(SignInRequest $request) try { $user = User::where('contact_en', $request->username)->orWhere('email', $request->username)->first(); if ($user) { - if (Hash::check($request->password, $user->password)) { - $this->setSession($user); - return redirect()->route('dashboard')->with('success', 'Successfully Logged In'); + if ($user->status == 1) { + if (Hash::check($request->password, $user->password)) { + $this->setSession($user); + return redirect()->route('dashboard')->with('success', 'Successfully Logged In'); + } else + return redirect()->route('login')->with('error', 'Username or Password is wrong!'); } else - return redirect()->route('login')->with('error', 'Username or Password is wrong!'); + return redirect()->route('login')->with('error', 'You are not an active user! Please contact to Authority'); } else return redirect()->route('login')->with('error', 'Username or Password is wrong!'); } catch (Exception $e) { @@ -68,8 +71,8 @@ public function setSession($user) 'userId' => encryptor('encrypt', $user->id), 'userName' => encryptor('encrypt', $user->name_en), 'emailAddress' => encryptor('encrypt', $user->email), - 'role_id'=> encryptor('encrypt',$user->role_id), - 'accessType'=> encryptor('encrypt',$user->full_access), + 'role_id' => encryptor('encrypt', $user->role_id), + 'accessType' => encryptor('encrypt', $user->full_access), 'role' => encryptor('encrypt', $user->role->type), 'roleIdentitiy' => encryptor('encrypt', $user->role->identity), 'language' => encryptor('encrypt', $user->language), @@ -84,8 +87,8 @@ public function signOut() return redirect('login')->with('danger', 'Succesfully Logged Out'); } -public function show(User $data) + public function show(User $data) { - return view('backend.user.profile', compact('data')); + return view('backend.user.profile', compact('data')); } -} \ No newline at end of file +} diff --git a/app/Http/Controllers/Backend/PermissionController.php b/app/Http/Controllers/Backend/PermissionController.php new file mode 100644 index 0000000..d50078f --- /dev/null +++ b/app/Http/Controllers/Backend/PermissionController.php @@ -0,0 +1,91 @@ +get(); + return view('backend.permission.index', compact('role', 'permission')); + } + + /** + * Show the form for creating a new resource. + */ + public function create() + { + // + } + + /** + * Store a newly created resource in storage. + */ + public function store(Request $request) + { + // + } + + public function save(SaveRequest $request, $role) + { + try { + // delete permission before saved + Permission::where('role_id', encryptor('decrypt', $role))->delete(); + foreach ($request->permission as $permission) { + $data = new Permission; + $data->role_id = encryptor('decrypt', $role); + $data->name = $permission; + $data->save(); + } + $this->notice::success('Permission saved'); + return redirect()->route('role.index'); + } catch (Exception $e) { + $this->notice::error('Please try again'); + dd($e); + return redirect()->back()->withInput(); + } + } + + /** + * Display the specified resource. + */ + public function show(Permission $permission) + { + // + } + + /** + * Show the form for editing the specified resource. + */ + public function edit(Permission $permission) + { + // + } + + /** + * Update the specified resource in storage. + */ + public function update(Request $request, Permission $permission) + { + // + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(Permission $permission) + { + // + } +} diff --git a/app/Http/Controllers/Backend/RoleController.php b/app/Http/Controllers/Backend/RoleController.php new file mode 100644 index 0000000..f507bfe --- /dev/null +++ b/app/Http/Controllers/Backend/RoleController.php @@ -0,0 +1,98 @@ +name=$request->Name; + $data->identity=$request->Identity; + if($data->save()){ + $this->notice::success('Successfully saved'); + return redirect()->route('role.index'); + } + }catch(Exception $e){ + dd($e); + $this->notice::error('Please try again'); + return redirect()->back()->withInput(); + } + } + + /** + * Display the specified resource. + */ + public function show($id) + { + // + } + + /** + * Show the form for editing the specified resource. + */ + public function edit($id) + { + $role=Role::findOrFail(encryptor('decrypt',$id)); + return view('backend.role.edit',compact('role')); + } + + /** + * Update the specified resource in storage. + */ + public function update(UpdateRequest $request, $id) + { + try{ + $data=Role::findOrFail(encryptor('decrypt',$id)); + $data->name=$request->Name; + $data->identity=$request->Identity; + if($data->save()){ + $this->notice::success('Successfully updated'); + return redirect()->route('role.index'); + } + }catch(Exception $e){ + $this->notice::error('Please try again'); + //dd($e); + return redirect()->back()->withInput(); + } + } + + /** + * Remove the specified resource from storage. + */ + public function destroy($id) + { + $data= Role::findOrFail(encryptor('decrypt',$id)); + if($data->delete()){ + $this->notice::warning('Deleted Permanently!'); + return redirect()->back(); + } + } +} diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php index 77ec359..4e91b99 100644 --- a/app/Http/Controllers/Controller.php +++ b/app/Http/Controllers/Controller.php @@ -5,8 +5,17 @@ use Illuminate\Foundation\Auth\Access\AuthorizesRequests; use Illuminate\Foundation\Validation\ValidatesRequests; use Illuminate\Routing\Controller as BaseController; +use Toastr; class Controller extends BaseController { + public $notice; + + public function __construct() + { + $this->notice = new Toastr(); + } + use AuthorizesRequests, ValidatesRequests; } + \ No newline at end of file diff --git a/app/Http/Controllers/PermissionController.php b/app/Http/Controllers/PermissionController.php deleted file mode 100644 index 567f4e3..0000000 --- a/app/Http/Controllers/PermissionController.php +++ /dev/null @@ -1,65 +0,0 @@ - \App\Http\Middleware\Authenticate::class, 'checkrole' => \App\Http\Middleware\checkRole::class, + 'checkauth' => \App\Http\Middleware\checkAuth::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'auth.session' => \Illuminate\Session\Middleware\AuthenticateSession::class, 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class, diff --git a/app/Http/Middleware/checkAuth.php b/app/Http/Middleware/checkAuth.php index 53ccfc9..62016c2 100644 --- a/app/Http/Middleware/checkAuth.php +++ b/app/Http/Middleware/checkAuth.php @@ -3,8 +3,10 @@ namespace App\Http\Middleware; use Closure; +use App\Models\User; //custom use Illuminate\Http\Request; -use Symfony\Component\HttpFoundation\Response; +use Session; //custom +use App\Models\Permission; //custom class checkAuth { @@ -13,8 +15,17 @@ class checkAuth * * @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next */ - public function handle(Request $request, Closure $next): Response + public function handle(Request $request, Closure $next) { - return $next($request); + if (!Session::has('userId') || Session::has('userId') == null) { + return redirect()->route('logOut'); + } else { + $user = User::where('status', 1)->where('id', currentUserId())->first(); + if (!$user) + return redirect()->route('logOut'); + else + return $next($request); + } + return redirect()->route('logOut'); } } diff --git a/app/Http/Middleware/checkRole.php b/app/Http/Middleware/checkRole.php index 6119e31..0c0e4c8 100644 --- a/app/Http/Middleware/checkRole.php +++ b/app/Http/Middleware/checkRole.php @@ -20,13 +20,23 @@ public function handle(Request $request, Closure $next) if (!Session::has('userId') || Session::has('userId') == null) { return redirect()->route('logOut'); } else { - $user = User::find(currentUserId()); + $user = User::where('status', 1)->where('id', currentUserId())->first(); if (!$user) { return redirect()->route('logOut'); } else if ($user->full_access == "1") { return $next($request); } else { - return $next($request); + $auto_accept = array("POST", "PUT"); + if (in_array($request->route()->methods[0], $auto_accept)) { + return $next($request); + } else { + if (Permission::where('role_id', $user->role_id)->where('name', $request->route()->getName())->exists()) + return $next($request); + else { + \Toastr::warning("You don't have permission to access this page"); + return redirect()->back(); + } + } } } return redirect()->route('logOut'); diff --git a/app/Http/Requests/Backend/Permission/SaveRequest.php b/app/Http/Requests/Backend/Permission/SaveRequest.php new file mode 100644 index 0000000..e5bec7c --- /dev/null +++ b/app/Http/Requests/Backend/Permission/SaveRequest.php @@ -0,0 +1,28 @@ +|string> + */ + public function rules(): array + { + return [ + 'permission'=>'required' + ]; + } +} diff --git a/app/Http/Requests/Backend/Role/AddNewRequest.php b/app/Http/Requests/Backend/Role/AddNewRequest.php new file mode 100644 index 0000000..e747256 --- /dev/null +++ b/app/Http/Requests/Backend/Role/AddNewRequest.php @@ -0,0 +1,30 @@ +|string> + */ + public function rules(): array + { + return [ + 'Identity'=>'required|max:30|alpha:ascii|unique:roles,identity', + 'Name'=>'required|max:30|unique:roles,name' + ]; + } +} + \ No newline at end of file diff --git a/app/Http/Requests/Backend/Role/UpdateRequest.php b/app/Http/Requests/Backend/Role/UpdateRequest.php new file mode 100644 index 0000000..da519e7 --- /dev/null +++ b/app/Http/Requests/Backend/Role/UpdateRequest.php @@ -0,0 +1,32 @@ +|string> + */ + public function rules(Request $r): array + { + $id=encryptor('decrypt',$r->uptoken); + return [ + 'Identity'=>'required|max:30|alpha:ascii|unique:roles,identity,'.$id, + 'Name'=>'required|max:30|unique:roles,name,'.$id + ]; + } +} + \ No newline at end of file diff --git a/composer.json b/composer.json index e886706..a839568 100644 --- a/composer.json +++ b/composer.json @@ -6,6 +6,7 @@ "license": "MIT", "require": { "php": "^8.1", + "brian2694/laravel-toastr": "^5.58", "guzzlehttp/guzzle": "^7.2", "laravel/framework": "^10.10", "laravel/sanctum": "^3.3", diff --git a/composer.lock b/composer.lock index b49b837..366940e 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,70 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "283e34281449c1c77bfa692414cd4a55", + "content-hash": "da2e44149d81ccf73d7aaef91083caa6", "packages": [ + { + "name": "brian2694/laravel-toastr", + "version": "5.58", + "source": { + "type": "git", + "url": "https://github.com/brian2694/laravel-toastr.git", + "reference": "6c7d1c6a959b7042757865d3df0c2f57b912f2c1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/brian2694/laravel-toastr/zipball/6c7d1c6a959b7042757865d3df0c2f57b912f2c1", + "reference": "6c7d1c6a959b7042757865d3df0c2f57b912f2c1", + "shasum": "" + }, + "require": { + "illuminate/session": ">=5.2.7", + "illuminate/support": ">=5.2.7", + "php": ">=5.5.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Brian2694\\Toastr\\ToastrServiceProvider" + ], + "aliases": { + "Toastr": "Brian2694\\Toastr\\Facades\\Toastr" + } + } + }, + "autoload": { + "files": [ + "src/helper.php" + ], + "psr-4": { + "Brian2694\\Toastr\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "brian2694", + "email": "briansanchez2694@gmail.com" + } + ], + "description": "toastr.js for Laravel", + "homepage": "https://github.com/brian2694/laravel-toastr", + "keywords": [ + "laravel", + "notification", + "php", + "toastr" + ], + "support": { + "issues": "https://github.com/brian2694/laravel-toastr/issues", + "source": "https://github.com/brian2694/laravel-toastr/tree/5.58" + }, + "time": "2023-10-31T20:35:36+00:00" + }, { "name": "brick/math", "version": "0.11.0", diff --git a/database/migrations/2023_10_12_031415_create_roles_table.php b/database/migrations/2023_10_12_031415_create_roles_table.php index a72f7a1..ed5a0cf 100644 --- a/database/migrations/2023_10_12_031415_create_roles_table.php +++ b/database/migrations/2023_10_12_031415_create_roles_table.php @@ -15,29 +15,29 @@ public function up(): void { Schema::create('roles', function (Blueprint $table) { $table->id(); - $table->string('type', 20)->unique(); + $table->string('name', 20)->unique(); $table->string('identity', 30)->unique(); $table->timestamps(); }); DB::table('roles')->insert([ [ - 'type'=> 'Super Admin', + 'name'=> 'Super Admin', 'identity'=> 'superadmin', 'created_at'=> Carbon::now() ], [ - 'type'=> 'Admin', + 'name'=> 'Admin', 'identity'=> 'admin', 'created_at'=> Carbon::now() ], [ - 'type'=> 'Instructor', + 'name'=> 'Instructor', 'identity'=> 'instructor', 'created_at'=> Carbon::now() ], [ - 'type'=> 'Student', + 'name'=> 'Student', 'identity'=> 'student', 'created_at'=> Carbon::now() ] diff --git a/resources/views/backend/layouts/app.blade.php b/resources/views/backend/layouts/app.blade.php index 011a49c..e464ea8 100644 --- a/resources/views/backend/layouts/app.blade.php +++ b/resources/views/backend/layouts/app.blade.php @@ -261,12 +261,12 @@ class="feather feather-log-out">
  • + +
    + +
    +
    +
    +
    +
    +

    All Role List

    + + Add new +
    +
    +

    {{$role->type}}

    + @php + $routes=array(); + $auto_accept=array('GET',"DELETE"); + $permissions=array(); + foreach($permission as $perm){ + $permissions[$perm->name]=$perm->name; + } + @endphp + @foreach(Illuminate\Support\Facades\Route::getRoutes() as $v) + @if($v->getPrefix()=="/admin") + @php + $rl=explode('.',$v->getName()); + if(isset($rl[1])) + $routes[$rl[0]][]=array("method"=>$v->methods[0],"function"=>$rl[1]); + @endphp + @endif + @endforeach +
    + @csrf +
    + @forelse($routes as $k=>$r) +
    + {{__($k)}} + @if($r) +
      + @foreach($r as $name) + @if(in_array($name['method'],$auto_accept)) +
    • + @if(in_array($k.'.'.$name['function'],$permissions)) + + {{__($name['function'])}} + @else + + {{__($name['function'])}} + @endif +
    • + @endif + @endforeach +
    + @endif +
    + @empty + + @endforelse +
    + + +
    +
    +
    + +
    +
    +
    + {{--
    +
    + @forelse ($data as $d) +
    +
    +
    + +
    +
    +
    +
    + +
    +

    {{$d->name_en}}

    +

    {{$d->role?->type}}

    +
      +
    • + #Sl.{{$d->id}} +
    • +
    • + Phone No. + :{{$d->contact_en}} +
    • +
    • + Email:{{$d->email}} +
    • +
    • + Created At. + :{{$d->created_at}} +
    • +
    + Read More +
    +
    +
    +
    + @empty +
    +
    +
    +
    +

    User Not Found

    +
    +
    +
    +
    + @endforelse +
    +
    --}} +
    +
    +
    + +
    +
    + +@endsection + +@push('scripts') + + + + + + +@endpush \ No newline at end of file diff --git a/resources/views/backend/role/create.blade.php b/resources/views/backend/role/create.blade.php new file mode 100644 index 0000000..54aacdd --- /dev/null +++ b/resources/views/backend/role/create.blade.php @@ -0,0 +1,85 @@ +@extends('backend.layouts.app') +@section('title', 'Add Role') + +@push('styles') + + + +@endpush + +@section('content') + +
    + +
    + +
    +
    +
    +

    Add Role

    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    Basic Info
    +
    +
    +
    + @csrf +
    +
    +
    + + +
    + @if($errors->has('Identity')) + {{ $errors->first('Identity') }} + @endif +
    +
    +
    + + +
    + @if($errors->has('Name')) + {{ $errors->first('Name') }} + @endif +
    +
    + + +
    +
    +
    +
    +
    +
    +
    + +
    +
    + +@endsection + +@push('scripts') + + + + + + + +@endpush \ No newline at end of file diff --git a/resources/views/backend/role/edit.blade.php b/resources/views/backend/role/edit.blade.php new file mode 100644 index 0000000..f2c2e3c --- /dev/null +++ b/resources/views/backend/role/edit.blade.php @@ -0,0 +1,86 @@ +@extends('backend.layouts.app') +@section('title', 'Update Role') + +@push('styles') + + + +@endpush + +@section('content') + +
    + +
    + +
    +
    +
    +

    Edit Role

    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    Basic Info
    +
    +
    +
    + @csrf + @method('PATCH') + +
    +
    +
    + + +
    + @if($errors->has('Identity')) + {{ $errors->first('Identity') }} + @endif +
    +
    +
    + + +
    + @if($errors->has('Name')) + {{ $errors->first('Name') }} + @endif +
    +
    + + +
    +
    +
    +
    +
    +
    +
    + +
    +
    + +@endsection + +@push('scripts') + + + + + + + +@endpush \ No newline at end of file diff --git a/resources/views/backend/role/index.blade.php b/resources/views/backend/role/index.blade.php new file mode 100644 index 0000000..a79650a --- /dev/null +++ b/resources/views/backend/role/index.blade.php @@ -0,0 +1,168 @@ +@extends('backend.layouts.app') +@section('title', trans('Role List')) + +@push('styles') + + +@endpush + +@section('content') + +
    + +
    + +
    +
    +
    +

    Role List

    +
    +
    +
    + +
    +
    + +
    + +
    +
    +
    +
    +
    +

    All Role List

    + + Add new +
    +
    +
    + + + + + + + + + + + @forelse ($data as $d) + + + + + + + @empty + + + + @endforelse + +
    {{__('#')}}{{__('Name')}}{{__('Identity')}}{{__('Action')}}
    {{++$loop->index}}{{$d->name}}{{$d->identity}} + + + +
    + @csrf + @method('DELETE') +
    +
    No User Found
    +
    +
    +
    +
    +
    +
    + @forelse ($data as $d) +
    +
    +
    + +
    +
    +
    +
    + +
    +

    {{$d->name_en}}

    +

    {{$d->role?->type}}

    +
      +
    • + #Sl.{{$d->id}} +
    • +
    • + Phone No. + :{{$d->contact_en}} +
    • +
    • + Email:{{$d->email}} +
    • +
    • + Created At. + :{{$d->created_at}} +
    • +
    + Read More +
    +
    +
    +
    + @empty +
    +
    +
    +
    +

    User Not Found

    +
    +
    +
    +
    + @endforelse +
    +
    +
    +
    +
    + +
    +
    + +@endsection + +@push('scripts') + + + + +@endpush \ No newline at end of file diff --git a/resources/views/backend/user/index.blade.php b/resources/views/backend/user/index.blade.php index dfa11a0..8426878 100644 --- a/resources/views/backend/user/index.blade.php +++ b/resources/views/backend/user/index.blade.php @@ -66,7 +66,7 @@ class="nav-link btn-primary mr-1 show active">List View
  • {{$d->name_en}} {{$d->email}} {{$d->contact_en}} - {{$d->role?->type}} + {{$d->role?->name}} @if($d->status==1){{__('Active')}} @else{{__('Inactive')}} @endif diff --git a/routes/web.php b/routes/web.php index 4fb5ed0..ba37a1a 100644 --- a/routes/web.php +++ b/routes/web.php @@ -5,6 +5,8 @@ use App\Http\Controllers\Backend\UserController as user; use App\Http\Controllers\Backend\DashboardController as dashboard; use App\Http\Controllers\Backend\Courses\CourseCategoryController as courseCategory; +use App\Http\Controllers\Backend\RoleController as role; +use App\Http\Controllers\Backend\PermissionController as permission; /* |-------------------------------------------------------------------------- @@ -25,11 +27,17 @@ Route::resource('/courseCategory', courseCategory::class); - -Route::middleware(['checkrole'])->group(function () { +Route::middleware(['checkauth'])->prefix('admin')->group(function () { Route::get('/dashboard', [dashboard::class, 'index'])->name('dashboard'); +}); + +Route::middleware(['checkrole'])->prefix('admin')->group(function () { Route::resource('/user', user::class); Route::get('/userProfile', [auth::class, 'show'])->name('userProfile'); + Route::resource('user',user::class); + Route::resource('role',role::class); + Route::get('permission/{role}',[permission::class,'index'])->name('permission.list'); + Route::post('permission/{role}',[permission::class,'save'])->name('permission.save'); }); @@ -43,3 +51,4 @@ // Route::get('/dashboard', function () { // return view('welcome'); // })->name('dashboard'); + \ No newline at end of file