محدود کردن دسترسی بر اساس نقش (Role Based Access Control) نوعی مدیریت دسترسی است که در آن هر کاربر دارای یک نقش (Role) بوده و هر نقش دارای یک مجموعه دسترسی است. در این سؤال قرار است این سیستم را پیادهسازی کنید.
جزئیات پروژه
پروژهی اولیه را از این لینک دانلود کنید. ساختار فایلهای این پروژه بهصورت زیر است:
rbac_inital
├── app
│ ├── Console
│ │ └── Kernel.php
│ ├── Exceptions
│ │ └── Handler.php
│ ├── Http
│ │ ├── Controllers
│ │ │ ├── Controller.php
│ │ │ └── RBACController.php
│ │ ├── Middleware
│ │ │ ├── Authenticate.php
│ │ │ ├── EncryptCookies.php
│ │ │ ├── PreventRequestsDuringMaintenance.php
│ │ │ ├── RedirectIfAuthenticated.php
│ │ │ ├── TrimStrings.php
│ │ │ ├── TrustHosts.php
│ │ │ ├── TrustProxies.php
│ │ │ └── VerifyCsrfToken.php
│ │ └── Kernel.php
│ ├── Models
│ │ ├── Permission.php
│ │ ├── Role.php
│ │ └── User.php
│ └── Providers
│ ├── AppServiceProvider.php
│ ├── AuthServiceProvider.php
│ ├── BroadcastServiceProvider.php
│ ├── EventServiceProvider.php
│ └── RouteServiceProvider.php
├── bootstrap
│ ├── cache
│ │ ├── packages.php
│ │ └── services.php
│ └── app.php
├── config
│ ├── app.php
│ ├── auth.php
│ ├── broadcasting.php
│ ├── cache.php
│ ├── cors.php
│ ├── database.php
│ ├── filesystems.php
│ ├── hashing.php
│ ├── logging.php
│ ├── mail.php
│ ├── queue.php
│ ├── services.php
│ ├── session.php
│ └── view.php
├── database
│ ├── factories
│ │ └── UserFactory.php
│ ├── migrations
│ │ ├── 2014_10_12_000000_create_users_table.php
│ │ ├── 2014_10_12_100000_create_password_resets_table.php
│ │ ├── 2019_08_19_000000_create_failed_jobs_table.php
│ │ ├── 2020_09_27_092338_create_roles_table.php
│ │ ├── 2020_09_27_092758_create_permissions_table.php
│ │ ├── 2020_09_27_092917_create_permission_role_table.php
│ │ └── 2020_09_27_093704_create_role_user_table.php
│ ├── seeders
│ │ └── DatabaseSeeder.php
│ └── database.db
├── public
│ ├── favicon.ico
│ ├── index.php
│ ├── robots.txt
│ └── web.config
├── resources
│ ├── css
│ │ └── app.css
│ ├── js
│ │ ├── app.js
│ │ └── bootstrap.js
│ ├── lang
│ │ └── en
│ │ ├── auth.php
│ │ ├── pagination.php
│ │ ├── passwords.php
│ │ └── validation.php
│ └── views
│ └── welcome.blade.php
├── routes
│ ├── api.php
│ ├── channels.php
│ ├── console.php
│ └── web.php
├── storage
│ ├── app
│ │ └── public
│ ├── framework
│ │ ├── cache
│ │ │ └── data
│ │ ├── sessions
│ │ ├── testing
│ │ └── views
│ └── logs
│ └── laravel.log
├── tests
│ ├── Feature
│ │ └── RBACSampleTest.php
│ ├── Unit
│ ├── CreatesApplication.php
│ └── TestCase.php
├── README.md
├── artisan
├── composer.json
├── composer.lock
├── package.json
├── phpunit.xml
├── server.php
└── webpack.mix.js
راهاندازی پروژه
برای اجرای پروژه، باید php
و composer
را از قبل نصب کرده باشید.
- ابتدا پروژهی اولیه را دانلود و از حالت فشرده خارج کنید.
- دستور
composer install
را در پوشهی اصلی پروژه برای نصب نیازمندیها اجرا کنید.
مدلها
مدلها در پروژه اولیه داده شده است. همچنین میتوانید با اجرای دستور php artisan migrate
مایگریشنها را اجرا کرده و پایگاه داده را به طور کامل داشته باشید. در این پروژه از پایگاه دادهی SQLite استفاده شده است. در ادامه، لیست مدلها و توضیحات آمده است:
-
User
: مدل کاربر که دارای فیلدهایname
،email
وpassword
است؛ فیلدهایname
وpassword
را میتوانید دلخواه مقدار دهید. -
Role
: مدل نقش که دارای فیلدname
است -
Permission
: مدل دسترسی که دارای فیلدname
است
علاوه بر این مدلها، دو جدول permission_role
و role_user
نیز وجود دارند که جدولهای رابطه هستند.
شما باید متدهای زیر را در کلاس RBACController
پیادهسازی کنید:
-
createRole($name)
: این متد با ورودی گرفتن نام نقش آن را اضافه میکند. -
addPermissionToRole($class, $function, $role)
: این متد با گرفتن نام کلاس، نام متد و نام نقش، اجازه دسترسی یک نقش به یک متد از یک کلاس را میدهد. -
addUser($email)
: این متد یک کاربر با ایمیل داده شده را ایجاد میکند. -
addRoleToUser($role, $email)
: این متد با با دریافت نام نقش و ایمیل کاربر، آن نقش را به کاربر مورد نظر میدهد. هر کاربر میتواند چند نقش داشته باشد.
برنامهی شما به این صورت داوری میشود که کلاسی با ارثبری از کنترلر اصلی لاراول (App\Http\Controllers\Controller
) به کد شما اضافه میشود. شما باید چهار متد create
، update
، store
و edit
را در کلاس Controller
طوری پیادهسازی کنید که بهترتیب چهار دسترسی create
، update
، store
و edit
برای کلاسی که از Controller
ارثبری کرده است را بررسی کند. در صورتی که برای کاربر لاگینشده دسترسی موردنظر وجود نداشته باشد، متد موجود در Controller
باید عدد 403
را برگرداند (return 403;
). در غیر اینصورت، این متدها نباید مقداری را برگردانند. تضمین میشود که هنگام تست این متدها، کاربر در سایت لاگین کرده است (با استفاده از Auth::user()
میتوانید اطلاعات کاربر را دریافت کنید).
توجه: شما تنها مجاز به تغییر فایلهای موجود در پوشهی /app
هستید.
آنچه باید آپلود کنید
پس از اعمال تغییرات، کل پروژه به غیر از پوشهی vendor
را Zip کرده و آپلود کنید. نام فایل Zip اهمیتی ندارد.
ارسال پاسخ برای این سؤال