Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Целый год из-за армии не писал код. Решил вернуться в коддинг и установил новый Laravel 5 (последняя версия). Написал простой код авторизации, а авторизация не проходит. В чём дело?
Controller:
public function postAuthLogin(Request $request){
$data = $request->all(); // Все данные
$rules = [
'login_users' => 'required',
'password' => 'required'
];
$validator = Validator::make($data, $rules);
if(!$validator->fails()){
if(Auth::attempt(['login_users' => $data['login_users'], 'password' => $data['password']], $request->remember) ){
return redirect()->route('home')->with('successMessages', 'Вы успешно авторизовались!');
}else{
// Выполняется этот код!!!
return redirect()->back()->with('warningMessages', 'Логин и/или пароль не верны!');
}
}else{
return redirect()->back()->with('errors', $validator->messages());
}
}
Model User (врятли что-то даст)
class User extends Authenticatable{
use Notifiable;
protected $primaryKey = 'id_users';
protected $fillable = [
'login_users', 'mail_users', 'password',
];
protected $hidden = [
'password', 'remember_token',
];
}
Если что-то нужно будет, скину...Заранее спасибо!
Не в сети
Возможно ты не переопределил метод username() в LoginController и проверка происходит по стандартному полю email вместо login_users , как у тебя .
Не в сети
Возможно ты не переопределил метод username() в LoginController и проверка происходит по стандартному полю email вместо login_users , как у тебя .
А где это можно переопределить?
Да и вроде хватит того, что написал в Auth::attempt()
Не в сети
Да , верно , ничего не надо переопределять , т.к. ты используешь свой контроллер и механизм attempt() никак не связан с этим , он выбирает модель из БД по переданному массиву . Тогда , вероятнее всего , тебе нужно удостовериться , что переданное поле login_users соответствует полю непосредственно в твоей БД . Внутри userprovider'a создается builder для твоей модели и выполняется запрос к БД такого плана :
$user = User::select()->where( 'login_users', $data['login_users'] )->first();
Не в сети
Решил с нуля всё сделать, но эффект такой же, что сильно меня печалит, ибо на самом лёгком я запоролся. Код очень простой, но всё же авторизация не проходит. В БД всё норм. Т.к. простой запрос через Eloquent ORM проходит.
Контроллер:
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class LoginController extends Controller{
use AuthenticatesUsers;
protected $redirectTo = '/';
public function __construct(){
$this->middleware('guest')->except('logout');
}
public function getAuthLogin(){
return view('Auth.getAuthLogin');
}
public function postAuthLogin(Request $request){
$this->validate($request, [
'login_users' => 'required',
'password' => 'required',
]);
if(Auth::attempt( ['login_users' => $request->login_users, 'password' => $request->password] )){
return redirect()->route('home')->with('successMessages', 'Вы успешно авторизовались!');
}else{
return redirect()->back()->with('warningMessages', 'Логин и/или пароль не верны!');
}
}
}
Модель:
<?php
namespace App;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable{
use Notifiable;
protected $table = 'users';
protected $primaryKey = 'id_users';
protected $fillable = [
'login_users', 'mail_users', 'password',
];
protected $hidden = [
'password', 'remember_token',
];
}
Route:
Route::group(['middleware' => 'guest'], function(){
// Route::get('/', ['as' => 'welcome', 'uses' => 'HomeController@getWelcome']);
Route::group(['prefix' => 'auth'], function(){
Route::get('login', ['as' => 'Auth.getLogin', 'uses' => 'Auth\LoginController@getAuthLogin']);
Route::post('login', ['as' => 'Auth.postLogin', 'uses' => 'Auth\LoginController@postAuthLogin']);
});
});
В чём же проблема?
Изменено dima9595 (12.06.2017 15:17:02)
Не в сети
Ты в базу то надеюсь не вручную пользователя добавил? Ибо пароль хэшируется, и в недрах ларки он сравнивает хэши.
vendor/laravel/framework/src/Illuminate/Auth/EloquentUserProvider.php:126 (метод validateCredentials)
/**
* Validate a user against the given credentials.
*
* @param \Illuminate\Contracts\Auth\Authenticatable $user
* @param array $credentials
* @return bool
*/
public function validateCredentials(UserContract $user, array $credentials)
{
$plain = $credentials['password'];
return $this->hasher->check($plain, $user->getAuthPassword());
}
Не в сети
Ты в базу то надеюсь не вручную пользователя добавил? Ибо пароль хэшируется, и в недрах ларки он сравнивает хэши.
vendor/laravel/framework/src/Illuminate/Auth/EloquentUserProvider.php:126 (метод validateCredentials)
Лол, а что, сейчас уже так не работает? Да, вручную добавлял, но думал что если пароль захэшировать, то всё будет ок) Спасибо, завтра проверю)
Не в сети
covobo пишет:Ты в базу то надеюсь не вручную пользователя добавил? Ибо пароль хэшируется, и в недрах ларки он сравнивает хэши.
vendor/laravel/framework/src/Illuminate/Auth/EloquentUserProvider.php:126 (метод validateCredentials)Лол, а что, сейчас уже так не работает? Да, вручную добавлял, но думал что если пароль захэшировать, то всё будет ок) Спасибо, завтра проверю)
Если ты его "нормально" (через Illuminate\Hashing\BcryptHasher по дефолту) захэшировал - то должно работать.
Видос на тему - https://laracasts.com/series/laravel-5- … pisodes/13
Изменено covobo (13.06.2017 00:25:22)
Не в сети
dima9595 пишет:covobo пишет:Ты в базу то надеюсь не вручную пользователя добавил? Ибо пароль хэшируется, и в недрах ларки он сравнивает хэши.
vendor/laravel/framework/src/Illuminate/Auth/EloquentUserProvider.php:126 (метод validateCredentials)Лол, а что, сейчас уже так не работает? Да, вручную добавлял, но думал что если пароль захэшировать, то всё будет ок) Спасибо, завтра проверю)
Если ты его "нормально" (через Illuminate\Hashing\BcryptHasher по дефолту) захэшировал - то должно работать.
Видос на тему - https://laracasts.com/series/laravel-5- … pisodes/13
Хэшировал через encrypt. Позже попробую создать нового пользователя через регистрацию)
Не в сети
Через регистрацию пользователя добавил, но авторизация так же не проходит(
Не в сети
Через регистрацию пользователя добавил, но авторизация так же не проходит(
Должно работать.
Как ты определяешь прошла авторизация или нет?
Не в сети
Вывожу специальные сообщения на страницу.
return redirect()->back()->with('warningMessages', 'Логин и/или пароль не верны!');
Попробовал через
Auth::loginUsingId(1);
авторизоваться - вышло. Так что, как мне кажется, дело в AUth::attempt или в модели.
Не в сети
Вывожу специальные сообщения на страницу.
return redirect()->back()->with('warningMessages', 'Логин и/или пароль не верны!');
Попробовал через
Auth::loginUsingId(1);
авторизоваться - вышло. Так что, как мне кажется, дело в AUth::attempt или в модели.
Все, что делает attempt (в твоем случае) - это ищет модель по логину и сравнивает твой пароль в открытом виде (который ты вбил в форму авторизации) с хэшем.
Может у тебя несколько юзеров с одним логином?
Изменено covobo (13.06.2017 19:35:36)
Не в сети
Все, что делает attempt (в твоем случае) - это ищет модель по логину и сравнивает твой пароль в открытом виде (который ты вбил в форму авторизации) с хэшем.
Может у тебя несколько юзеров с одним логином?
Вот именно только 1 юзер.
Не в сети
Эта проблема решена!) Вместо encrypt нужно было bcrypt юзать для хэширования пароля.
Теперь другая проблема появилась: не выходит из аккаунта через Auth::logout(). Просто редиректит на главную страницу, а сессия остаётся.
Не в сети
сессия и должна оставаться, просто из сессии удаляется информация об авторизации
Не в сети
сессия и должна оставаться, просто из сессии удаляется информация об авторизации
проблема в том, что происходит просто редирект, а данные о пользователе остаются(
Не в сети
ну наверное только запуском под отладчиком можно разобраться что происходит в процессе выполнения запроса
Не в сети
Забыл ответить как я решил данную проблему:
Нужно было просто убрать $this->middleware('guest')->except('logout'); Какая же простая проблема была, а я в тот раз так закипишевал. Просто раньше я в контроллере не ставил проверку middleware.
Кстати, посоветуйте пожалуйста, как лучше работать с middleware, в роуте или контроллере?
Не в сети
Кстати, посоветуйте пожалуйста, как лучше работать с middleware, в роуте или контроллере?
В роутах.
Но порой возникает необходимость использовать middleware в контроллерах, ничего зазорного в этом нет, но должно быть обосновано)
Не в сети
о порой возникает необходимость использовать middleware в контроллерах
можно пример?:)
Не в сети
Страницы 1