Как обезопасить модули с разрешением laravel, файловый менеджер или настройки?

Я создал две роли: администратор и редактор. Я могу закрепить меню этих модулей непосредственно в ресурсах /views/vendor/backpack/base/inc/sidebar.blade.php, используя

            @role('admin')
            <li class="header">{{ trans('backpack::base.administration') }}</li>
            <!-- ================================================ -->
            <!-- ==== Recommended place for admin menu items ==== -->
            <!-- ================================================ -->
            <li><a href="{{ url(config('backpack.base.route_prefix', 'admin') . '/dashboard') }}"><i class="fa fa-dashboard"></i> <span>{{ trans('backpack::base.dashboard') }}</span></a></li>
            <li><a href="{{ url(config('backpack.base.route_prefix', 'admin') . '/elfinder') }}"><i class="fa fa-files-o"></i> <span>File manager</span></a></li>
            <li><a href="{{ url(config('backpack.base.route_prefix', 'admin') . '/backup') }}"><i class="fa fa-hdd-o"></i> <span>Backups</span></a></li>
            <li><a href="{{ url(config('backpack.base.route_prefix', 'admin') . '/log') }}"><i class="fa fa-terminal"></i> <span>Logs</span></a></li>
            <li><a href="{{ url(config('backpack.base.route_prefix', 'admin') . '/setting') }}"><i class="fa fa-cog"></i> <span>Settings</span></a></li>
            <!-- ======================================= -->
            <li class="header">{{ trans('backpack::base.user') }}</li>
            <!-- Users, Roles Permissions -->
            <li class="treeview">
                <a href="#"><i class="fa fa-group"></i> <span>Users, Roles, Permissions</span> <i class="fa fa-angle-left pull-right"></i></a>
                <ul class="treeview-menu">
                    <li><a href="{{ url(config('backpack.base.route_prefix', 'admin') . '/user') }}"><i class="fa fa-user"></i> <span>Users</span></a></li>
                    <li><a href="{{ url(config('backpack.base.route_prefix', 'admin') . '/role') }}"><i class="fa fa-group"></i> <span>Roles</span></a></li>
                    <li><a href="{{ url(config('backpack.base.route_prefix', 'admin') . '/permission') }}"><i class="fa fa-key"></i> <span>Permissions</span></a></li>
                </ul>
            </li>
            @endrole
            <li><a href="{{ url(config('backpack.base.route_prefix', 'admin') . '/logout') }}"><i class="fa fa-sign-out"></i> <span>{{ trans('backpack::base.logout') }}</span></a></li>
        </ul>

Конечно, это еще не конец, так как вам все равно придется защищать доступ к модулю для редактора, вводя URL. В вендоре / рюкзаке / licensemanager/src/app/Http/Controllers/PermissionCrudController.php метод установки можно использовать

Auth::user()->hasRole('admin')

и выдает ошибку или перенаправление, но...

Это не очень хорошее решение (запись в модулях вендора). Что я должен делать? Как обеспечить редактору доступ к указанным модулям. Извините, если это слишком легко для вас, я только начинаю веселиться с Laravel

PS. https://github.com/spatie/laravel-permission/issues/507

1 ответ

Я бы порекомендовал создать промежуточное программное обеспечение, чтобы проверить наличие разрешения или роли, и заблокировать людей, используя role:admin или же permission:admin, что-то вроде этого:

PermissionMiddleware.php:

<?php
namespace App\Http\Middleware;
use Closure;
use Auth;
class PermissionMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next, $permission)
    {
        if (Auth::guest()) {
            return redirect('login');
        }
        if (! $request->user()->can($permission)) {
           abort(403);
        }
        return $next($request);
    }
}

RoleMiddleware.php:

<?php
namespace App\Http\Middleware;
use Closure;
use Auth;
class RoleMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next, $role)
    {
        if (Auth::guest()) {
            return redirect('login');
        }
        if (! $request->user()->hasRole($role)) {
           abort(403);
        }
        return $next($request);
    }
}

Затем вы сможете использовать их, когда будете писать маршруты для ваших CRUD. Если вы хотите перезаписать маршруты, созданные в Backpack\Base, вы можете легко это сделать, создав файл routes/backpack/base.php, Затем рюкзак загрузит этот файл, а не тот, который находится в пакете. См. https://github.com/laravel-backpack/base для получения более подробной информации.

Надеюсь, поможет!

Другие вопросы по тегам