Как частично авторизовать пользователя после регистрации в Laravel

#laravel #login #routes

#laravel #аутентификация #маршруты

Вопрос:

После заполнения формы я хочу, чтобы пользователь сначала перенаправлялся на страницу, в содержимом которой является успешная регистрация. Теперь проблема в том, что он автоматически перенаправляется пользователю mypage .

Модель ПОЛЬЗОВАТЕЛЯ

 public function register($data){
try {
    $this->name = $data['name'];
    $this->email = $data['email'];
    $this->password = $data['password'];
    $this->save();
    return $this;
} catch (Exception $e) {
    Log::error(get_class().':register(): '.$e->getMessage());
    return false;
}
}
  

Auth RegisterController

 public function registComplete(User $user){
    $data = Session::get('user');
    $data['password'] = Hash::make($data['password']);
    $rtn = $user->register($data);

    Auth::guard('user')->login($rtn);

    return redirect('/regist/complete');
}
  

в моем /regist/complete маршруте указано на функцию, которая будет отображать страницу благодарности. И оттуда пользователь может нажать кнопку, чтобы быть перенаправленным пользователям mypage , это будет единственный раз, когда они могут быть перенаправлены.

Вид

 <div class="regist_cont">
        <div class="rgstdn_message">
            <p class="redbig_message">Thanks for registering.</p>
            <p>You can now visit your profile</p>

        </div>
        <a class="btn btn_red" href="{{ url('/mypage') }}">MY PAGE</a>
    </div>
  

Если я удалю Auth::guard('user')->login($rtn); , пользователь не войдет в систему автоматически. Но я не могу заставить их войти в систему при нажатии кнопки mypage. Как я могу этого добиться?

Ответ №1:

Вы можете добавить нижеприведенную строку на свой контроллер

 protected $redirectTo = '/regist/complete';
  

это перезапишет перенаправление по умолчанию на вашу страницу

Комментарии:

1. Тогда как я могу войти в систему пользователя, если он нажмет кнопку gotomypage?

2. Контроллер не является подходящим местом для проверки подлинности пользователя или нет. Для этого вы должны использовать промежуточное программное обеспечение. Чтобы получить информацию о том, что такое промежуточное программное обеспечение, проверьте здесь laravel.com/docs/master/middleware

3. вы можете просто использовать этот метод в своем классе промежуточного программного обеспечения: public function handle($request, Closure $next) { //check here if the user is authenticated if ( ! $this->auth->user() ) { // here you should redirect to login } return $next($request); }

4. вам также необходимо внести изменения в свой Route

Ответ №2:

После изучения я могу сделать это с помощью Session .

Auth RegisterController

 public function registComplete(User $user){
    $data = Session::get('user');
    $data['password'] = Hash::make($data['password']);
    $rtn = $user->register($data);

    Session::put('log', $rtn);
    Session::save();

    return redirect('/regist/complete');
}

public function registSuccess(){
    Auth::guard('user')->login(Session::get('log'));

    return view('user.register.registComplete');
}
  

Поскольку я также использую учетные записи в социальных сетях, я делаю это в my UserController при перенаправлении на mypage.

 public function index()
{
    if(Session::exists('log')){
        Session::forget('log');
    }

    return view('user.dashboard')->with([
        'user' => Auth::user(),
    ]);
}
  

На данный момент я могу добиться того, чего хочу. Если у вас есть другой лучший подход, я тоже открыт для этого.