Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 15.10.2018 13:20:47

Проблема с авторизацией на сайте.

Laravel 5.4

В общем, если коротко: устроился джуном, дали чужой проект, сказали привести в порядок авторизацию для админов. Уже 2 дня пробую исправить авторизацию на сайте и не могу сдвинутся с мертвой точки, пишу-пишу, пробую-пробую, в итоге либо ошибки, либо ничего не меняется. Пожалуйста, взгляните на код, может у вас быстро появятся идеи и вы сможете мне помочь иди подтолкнуть к решению. Спасибо!

Вопроса два:

1) При выходе с аккаунта (logout), сессия не заканчивается и браузерной стрелочкой "назад" можно вернуться в админ-панель и продолжить что-то делать.

2) Т. к. это админ-панель требуется сделать проверку на роль пользователя в системе, роль должна быть больше 1, казалось бы проще некуда, но я пытался много раз поставить условие, в итоге глухо. Вероятнее всего подводит моя логика, т. к. я джун.

Вот вырезка из контроллера DashboardController, где авторизация и выход:

        public function auth(Request $request)
    {
        $error = 1;
        $users = DB::table('users')->where('email', $request->login)->where('status', 0)->first();

        if (!is_null($users)) {
            if ($users->password == md5($request->password)) {
                session(['b2b.auth.isActive' => true, 'b2b.auth.name' => $users->fio, 'b2b.auth.id' => $users->id]);
                return redirect()->route('admin::home');
            } else return view('admin.auth.login', array('error' => $error));
        } else return view('admin.auth.login', array('error' => $error));
    }

        public function logout(Request $request)
    {
        $request->session()->flush();
        return redirect()->route('admin::auth::view');
    }

Вот маршруты web.php:

        //Авторизация
    
    Route::get('/admin/auth', function (){
        return view('admin.auth.login');
    });
    
    
    Route::name('admin::')->prefix('admin')->group(function(){
        //Авторизация
        Route::name('auth::')->prefix('auth')->group(function(){
                    Route::name('view')->get('view', 'Admin\DashboardController@auth');
                    Route::name('act')->post('act', 'Admin\DashboardController@auth');
                    Route::name('logout')->get('logout', 'Admin\DashboardController@logout');
        });

Это вырезка из шаблона админки, где можно выйти из аккаунта:

    <ul class="nav navbar navbar-top-links navbar-right mbn">
                    <li class="dropdown topbar-user"><a data-hover="dropdown" href="#" class="dropdown-toggle"><img
                                    src="https://s3.amazonaws.com/uifaces/faces/twitter/kolage/48.jpg" alt=""
                                    class="img-responsive img-circle"/>&nbsp;<span
                                    class="hidden-xs">{{ $name or '' }} </span>&nbsp;<span
                                    class="caret"></span></a>
                        <ul class="dropdown-menu dropdown-user pull-right">
                            <li><a href="{{route('admin::auth::logout') }}"
                                   onclick="event.preventDefault(); document.getElementById('logout-form').submit();"><i
                                            class="fa fa-key"></i> {{ __('Выйти') }}</a></li>
                        </ul>
                    </li>
                </ul>
                <form id="logout-form" action="{{route('admin::auth::logout')}}" method="GET" style="display: none;">
                    {{ csrf_field() }}
                </form>

А это модель Users:

    protected $table = 'users';

    protected $fillable = [
        'role',
        'email',
        'password',
        'company_name',
        'status',
        'id_client',
        'fio',
        'more',
        'telephone'
    ];

    public $timestamps = true;

    public static function isActive()
    {
        return session('auth.isActive');
    }


    public static function getName()
    {
        return session('name');
    }

    public static function getId()
    {
        return session('id');
    }

    public static function getReservCount()
    {
        return DB::table('temp_reserv')->where('id_users', self::getId())->count();
    }

    public static function getRole()
    {
        $id = self::getId();
        $id_client = DB::table('users')->where('id', $id)->first();
        return !is_null($id_client) ? $id_client->role : 0;
    }

    public static function b2b_isActive()
    {
        return session('b2b.auth.isActive');
    }


    public static function b2b_getName()
    {
        return session('b2b.name');
    }

    public static function b2b_getId()
    {
        return session('b2b.id');
    }

    public static function b2b_getRole()
    {
        $id = self::b2b_getId();
        $id_client = DB::table('users')->where('id', $id)->first();
        return $id_client->role;

Не в сети

#2 15.10.2018 15:38:05

Re: Проблема с авторизацией на сайте.

Это не по ларавелевским стандартам сделано.

$request->session()->flush() должна удалять сессионные данные. Если можно таки вернуться и что-то сделать, вероятно нет никаких проверок препятствующих этому. (я здесь не употребляю слов вроде "мидлварь" или "гард", т.к. похоже они просто не используются)

Я бы посоветовал сделать с нуля, используя как пример стандартный проекта Laravel, как в документации описано. "Наводить порядок" может сеньор, но никак не джун.

Изменено artoodetoo (15.10.2018 15:38:37)


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

#3 15.10.2018 15:40:19

Re: Проблема с авторизацией на сайте.

Хорошо, спасибо за ответ! А насчет 2 вопроса не подскажете?

Не в сети

#4 15.10.2018 16:03:52

Re: Проблема с авторизацией на сайте.

Не знаю как коротко вам объяснить. Есть разница между авторизаций и аутентификацией. В приведенных фрагментах только аутентификация. Вот где у вас должна быть авторизация, то есть проверка прав, там и проверяйте роль пользователя.

И снова, раз вы сами не тянете тему, по-максимуму используйте готовые решения, описанные в офф. документации. А также популярные компоненты сторонних авторов.

https://php.ru/forum/threads/avtorizaci … ija.53234/
https://laravel.ru/docs/v5/authorization


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

#5 16.10.2018 07:24:28

Re: Проблема с авторизацией на сайте.

Окей, спасибо!

Не в сети

Подвал раздела