Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
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"/> <span
class="hidden-xs">{{ $name or '' }} </span> <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;
Не в сети
Это не по ларавелевским стандартам сделано.
$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.
Не в сети
Хорошо, спасибо за ответ! А насчет 2 вопроса не подскажете?
Не в сети
Не знаю как коротко вам объяснить. Есть разница между авторизаций и аутентификацией. В приведенных фрагментах только аутентификация. Вот где у вас должна быть авторизация, то есть проверка прав, там и проверяйте роль пользователя.
И снова, раз вы сами не тянете тему, по-максимуму используйте готовые решения, описанные в офф. документации. А также популярные компоненты сторонних авторов.
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.
Не в сети
Окей, спасибо!
Не в сети
Страницы 1