За последние 24 часа нас посетили 18034 программиста и 1607 роботов. Сейчас ищут 1334 программиста ...

Валидация и аунтификация

Тема в разделе "Laravel", создана пользователем Dimon2x, 19 май 2018.

  1. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    Не понимаю, как запустить метод auth из метода check, при успешной валидации?

    Много статей и не одной толковой.

    PHP:
    1. public function check(Request $request)
    2.     {
    3.        
    4.         if($this->validate($request,[
    5.             'password'=>'required|min:3',
    6.             'email' => 'required|email',
    7.         ])) {
    8.             return $this->auth();
    9.         }
    10.        
    11.     }
    12.    
    13.      public function auth(Request $request)
    14.     {
    15.        
    16.          $credentials = $request->only('email', 'password');
    17.        
    18.         if (Auth::attempt($credentials))
    19.         {
    20.             echo 'Данные правильные';
    21.         }
    22.         else {
    23.             echo 'Данные не правильные';
    24.         }
    25.     }
    Сейчас, после успешной валидации, отображается пустая страница.
     
  2. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    Немного переделал функцию, не знаю, как запустить auth

    PHP:
    1. public function check(Request $request)
    2.     {
    3.        
    4.          $validator = Validator::make($request->all(), [
    5.             'password'=>'required|min:3',
    6.             'email' => 'required|email',
    7.         ]);
    8.        
    9.             if ($validator->fails())
    10.             {
    11.                 return redirect()->back()->withErrors($validator->errors());
    12.             }
    13.            
    14.             else {
    15.                 return $this->auth(Request $request);
    16.             }
    17.  
    18.     }
    --- Добавлено ---
    Дошло return $this->auth($request);
     
  3. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    ты можешь его вообще не передавать он сам создастся так как указан Request или использовать хелпер тогда и он не нужен request()->name
     
  4. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    @nospiou А как авторизировать пользователя, после успешной проверки?

    PHP:
    1. public function auth(Request $request)
    2.     {
    3.          $credentials = $request->only('email', 'password');
    4.        
    5.         if (Auth::attempt($credentials))
    6.         {
    7.             if (Auth::check()) {
    8.                //что сюда писать?
    9.             }
    10.         }
    11.         else {
    12.              return redirect()->back();
    13.         }
    14.     }
    --- Добавлено ---
    Пробовал посмотреть, что в сессии, но просто так туда не залезть.
     
  5. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    attempt уже авторизовывает (пишутся куки) а вызвать можно как auth()->user()->id
    --- Добавлено ---
    dd(session()->toArray()) наверное
     
    Dimon2x нравится это.
  6. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    @nospiou А где это написано, что attempt уже авторизовывает?
     
  7. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    ну вот я писал апи на токене так все эти методы которые что то в сессию пишут пришлось выбрасывать attempt один из них)
    --- Добавлено ---
    Без него будет вот так
    PHP:
    1. $user = \App\User::where(['email' => request()->email])->first();
    2. $check = $user ? \Hash::check(request()->password, $user->password) : false;
    3. // ну и логин без сессии
    4. auth()->setUser($user)
    5. // или с сессией
    6. auth()->login($user)
    7. //и после него уже работает
    8. auth()->user()
     
  8. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    @Dimon2x, что ты воротишь, когда там всё уже готово в Laravel по этому поводу? Чуть подстраиваешь под свою задачу за пол часика, и радуешься
    --- Добавлено ---
    Illuminate\Foundation\Auth\AuthenticatesUsers - почитай код этого трейта, редкий случай, когда от кода Laravel не хочется беленькой хлебнуть
    --- Добавлено ---
    И да, Auth::attemp если вернул истину, в сессию уже всё, что надо записано.
     
    artoodetoo нравится это.
  9. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    @mkramer я пытаюсь создать свою регистрацию и авторизацию, для того, что бы бытл готов, если надо будет сделать сделать нестандартную регистрацию или авторизацию.
     
  10. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Разбери для начала тот код, что есть. Хотя, для "нестандартной" аутентификации/регистрации там пару методов трейта своими перекрываешь, и, опять же, радуешься. Но, чтоб знать, что перекрыть, надо почитать код. В доке этого не описано, насколько помнится, сам нашёл. Вот, к примеру, чтоб возвращался json, что я сделал в своём LoginController (мне заказали аутентификацию в всплывашке):
    PHP:
    1. protected function authenticated(Request $request, $user)
    2. {
    3.     $redirectTo = $request->session()->get("redirectAfterLogin", $this->localization->localizeURL("/"));
    4.     $request->session()->remove("redirectAfterLogin");
    5.     return ["redirectTo" => $redirectTo];
    6. }
    --- Добавлено ---
    Берёшь стандартный трейт, и выясняешь, чего каждая строчка делает. И понимаешь, что надо исправить для себя. Мы же для чего фреймворками пользуемся? Чтоб всё за нас сделано было
     
    Dimon2x нравится это.
  11. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    Ну не знаю как по мне то лучше переписать там 2 строчки кода:)
    А иногда не просто лучше а и нужно. К примеру тоже апи без сессии
    authenticated точно в даках есть
     
  12. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Ну я уже не помню, где нашёл, но нашёл. А код всё равно почитать стоит, забавный. Например, там сразу защита от брутфорса вшита во фреймворк
    --- Добавлено ---
    Я бы в таком случае свой guard сделал. А ещё для API есть https://laravel.com/docs/master/passport
     
  13. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    А нет вру есть только authenticate
    Ну это понятно. Просто attempt login и т.д они пишут сессии. Если ты авторизацию пустишь через гвард апи они будут ругаться на то что миделвера сессии не подключена а так ты нашел пользователя проверил если все ок вернул $user->createToken('app') и никакие сессии которыми ты и пользоваться не будешь не нужны.
     
  14. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
  15. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    Это немного другое. Это то как тебя будут определять. По токену в хедере или по кукам и сессии. Ну а сам логин (для получения того же токена) как по мне проще переписать где то в отдельном методе отдельном контроллере чем переопределять трейды. Вообщим суть в том что сама система авторизации мне нравится а вот контроллеры все равно нужно переписывать. И лучше сделать это явно.
    --- Добавлено ---
    Вот как пример один из трейдов куда не посмотри везде сессии. Переопределять все это как то совсем уж не круто.
    PHP:
    1.     protected function sendResetLinkFailedResponse(Request $request, $response)
    2.     {
    3.         return back()->withErrors(
    4.             ['email' => trans($response)]
    5.         );
    6.     }
     
  16. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    @nospiou, ну это дело не под api, для api там другой пакет, я ссылку кидал :)

    А для обычной системы сессии - самое то, тем более вариантов, где их хранить, Laravel предоставляет до фига.
    --- Добавлено ---
    P.S.
    PHP:
    1. protected function sendResetLinkResponse($response)
    2. {
    3.     return response()->json(["success" => true]);
    4. }
    5.  
    6. protected function sendResetLinkFailedResponse(Request $request, $response)
    7. {
    8.     return response("", 422)->json(["errors" => ["email" => __("passwords.user")]]);
    9. }
    Из моего проекта
     
  17. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    Ну так в паспорте или в стандартном драйвере апи всех эти плюшек нету) Все равно же нужно всю остальную логику писать. Там только процесс аутентификации) Под сессии согласен. Хотя могли бы и универсально написать) Есть еще разные dingo jwt-auth и т.д никак руки не доходят посмотреть. Паспорт с офф поддержкой все равно его использовать буду)
     
  18. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.108
    Симпатии:
    1.243
    Адрес:
    там-сям
    Дима, ответил тебе на форуме ларавель.
     
  19. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    Не понимаю, почему в роутере, не находит авторизированного пользователя (null), а если этот код поместить в любой контроллер, в любой метод, то находит?

    PHP:
    1.  dd($user = Auth::user());
     
  20. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Потому что файл с определениями роутов выполняется до всех middleware (в одном из них как раз и проверяется кука сессионная). Если тебе там уже требуется авторизованный юзер уже в определение роутов, ты что-то не так делаешь. Роуты не должны такой логики содержать. Это уже часть контроллеров, middleware и прочего.
    --- Добавлено ---
    Если роуты закешированы, этот файл вообще не выполняется, кстати.
     
  21. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    Делаю всё по доке.

    Не понимаю, почему ругается на Auth guard [user] is not defined.?

    В контроллере регистрации прописал

    PHP:
    1. use Illuminate\Support\Facades\Auth;
    PHP:
    1.     protected function guard()
    2.     {
    3.         return Auth::guard('user');
    4.     }
    --- Добавлено ---
    в IDE нету перехода по ссылке guard
     
  22. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    Изменил в LoginController перенаправление на корень, всё равно переходит на home почему?

    PHP:
    1. protected $redirectTo = '/';
    2.    
    3.     protected function redirectTo()
    4.     {
    5.         return '/';
    6.     }
     
  23. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.583
    Симпатии:
    1.761
    Ты как не программист... Что, в трейт не залезть? И если пишешь, что делаешь по доке, сразу ссылку давай.
    Фасады в LAravel специфически работают, IDE этого понять не в состоянии даже с пакетом ide-helper-а.

    А зачем ты меняешь guard? у тебя несколько моделей пользователей? Или не используется Eloquent?

    Потому что этот кастомный guuard ещё переопределить нужно. ТОлько нужно ли это тебе - я не уверен. Это нужно, если ты хочешь что-то другое использовать, не стандартный для Laravel путь проверки, войдён ли пользователь. А в твоём случае тебе оно надо?
     
  24. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
  25. Dimon2x

    Dimon2x Старожил

    С нами с:
    26 фев 2012
    Сообщения:
    2.210
    Симпатии:
    185
    @mkramer Правильным ли я способом узнаю роль пользователя?

    В базе создал строку role.

    В моделе User сделал метод

    PHP:
    1. public function isRole()
    2.     {
    3.         $role = $this::where('id', '=', Auth::id())->firstOrFail()->role;
    4.        
    5.         if($role == 'admin') return 'Админ';
    6.        
    7.         return 'Пользователь';
    8.     }
    Потом в контроллере обращаюсь к нему

    PHP:
    1. $userRole = $this->role->isRole();
    Передаю в вид и вывожу там

    Код (Text):
    1. {{$userRole}}