I have a page with a some content on it and a comments section. Comments can only be left by users who are signed in so I have added a login form to the page for users to sign in with (this only shows if they are not already logged in).
The problem I have is that when the user signs in they get redirected back to the home page and not the page they were previously on.
I have not changed the login method from the out of the box set-up.
Can anyone suggest a simple way to set the redirect url. My thoughts are that it would be good to be able to set it in the form.
Solution for laravel 5.3:
In loginController overwrite the showLoginForm() function as this one:
public function showLoginForm()
{
if(!session()->has('url.intended'))
{
session(['url.intended' => url()->previous()]);
}
return view('auth.login');
}
It will set the "url.intended" session variable, that is the one that laravel uses to look for the page which you want to be redirected after the login, with the previous url.
It also checks if the variable has been set, in order to avoid the variable to be set with the login url if the user submit the form with an error.
For Laravel 5.5, following code worked for me by just updating LoginController.php
public function showLoginForm()
{
session(['link' => url()->previous()]);
return view('auth.login');
}
protected function authenticated(Request $request, $user)
{
return redirect(session('link'));
}
Please use redirect()->intended() instead in Laravel 5.1
You can also see more about it here: http://laravel.com/docs/5.1/authentication
For Laravel 5.3
inside App/Http/Controllers/Auth/LoginController
add this line to the __construct() function
$this->redirectTo = url()->previous();
So the full code will be
public function __construct()
{
$this->redirectTo = url()->previous();
$this->middleware('guest', ['except' => 'logout']);
}
It works like a charm for me i'm using laravel 5.3.30
For Laravel 5.4, following code worked for me by just updating LoginController.php
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\URL;
public function __construct()
{
$this->middleware('guest', ['except' => 'logout']);
Session::put('backUrl', URL::previous());
}
public function redirectTo()
{
return Session::get('backUrl') ? Session::get('backUrl') : $this->redirectTo;
}
The Laravel 5.6, When user insert wrong credentials then login page will reload and session(['link' => url()->previous()]); will take login URL in link variable. So the user will redirect to a login page again or redirect to /home if login success. So to avoid these below code working for me! After that no matter how much time user insert wrong credentials he will redirect after login to exactly where he was before login page.
Update or overwrite public function showLoginForm() in LoginController.
public function showLoginForm()
{
if (session('link')) {
$myPath = session('link');
$loginPath = url('/login');
$previous = url()->previous();
if ($previous = $loginPath) {
session(['link' => $myPath]);
}
else{
session(['link' => $previous]);
}
}
else{
session(['link' => url()->previous()]);
}
return view('auth.login');
}
Also, Update or Overwrite protected function authenticated(Request $request, $user) in LoginController.
protected function authenticated(Request $request, $user)
{
return redirect(session('link'));
}
If you want to redirect always to /home except for those pages with comments, then you should overwrite your redirectTo method in your LoginController:
public function redirectTo()
{
return session('url.intended') ?? $this->redirectTo;
}
On all pages where you want to remain on the site, you should store the url for one request in the session:
public function show(Category $category, Project $project){
// ...
session()->flash('url.intended' , '/' . request()->path());
}
Redirect to login with the current's page url as a query string:
login
In your LoginController check if exists and save the query string in session then redirect to the url after login
public function __construct() {
parent::__construct();
if ( \request()->get( 'redirect_to' ) ) {
session()->put( 'redirect.url', \request()->get( 'redirect_to' ) );
}
$this->middleware( 'guest' )->except( 'logout' );
}
protected function authenticated(Request $request, $user) {
if(session()->has('redirect.url') {
return redirect( session()->get( 'redirect.url' ) );
}
}
Look into laravel cheat sheet
and use:
URL::previous();
to go to the previous page.
Laravel 5
(maybe 6 also, not tested, if someone knows it please update the answer)
add this to LoginController:
protected function redirectTo(){
return url()->previous();
}
Note: if present the field $redirectTo , remove it
in your RedirectIfAuthenticated.php change this code
public function handle($request, Closure $next, $guard = null)
{
if (Auth::guard($guard)->check()) {
return redirect()->intended('/contactus');
}
return $next($request);
}
please notice to :
return redirect()->intended('/contactus');
Inside your template file you can just use:
{{ url()->previous() }}
To redirect from the controller you should use
return redirect()->back();
or Just
return back();
use Illuminate\Support\Facades\Redirect;
public function Show_Login_Form()
{
$back = Session::put('url_back',url()->previous());
$current = url()->current();
if(Session::get('user_id'))
{
if ($back == $current) { // don't back Login Form
return Redirect::to('home');
}
elseif (Session::has('url_back')) {
return Redirect::to('home');
}
else{
return redirect()->back();
}
}
else{
if ($back == $current) {
return Redirect::to('home');
}
else{
Session::put('url_back',url()->previous());
}
return view('account.customer-account.login');
}
}
public function signin_user(Request $request) // Login post
{
$username = $request->input_username_login;
$password = md5($request->input_password_login);
$result = DB::table('tbl_user')
->where([['user_email',$username],['user_password',$password]])
->orWhere([['user_phone',$username],['user_password',$password]])
->first();
if($result){
Session::put('user_id', $result->user_id );
Session::put('user_name', $result->user_name);
Session::put('user_username', $result->user_username);
Session::put('user_avatar', $result->user_avatar);
return Redirect::to(Session::get('url_back')); // Back page after login
} else {
Session::put('message_box', 'Error !!!');
return redirect()->back();
}
}
You can use redirect back with Laravel 5:
<?php namespace App\Http\Controllers;
use Redirect;
class SomeController extends Controller {
public function some_method() {
return Redirect::back()
}
}
Use Thss
return Redirect::back('back-url')
Laravel 6.x. Now Problem is the First-time Login successfully working fine It redirects to the site where I need to be but second or more time login failed It redirect to the login page. Why?
In RedirectIfAuthenticated file
public function handle($request, Closure $next, $guard = null)
{
if (Auth::guard($guard)->check()) {
return redirect(RouteServiceProvider::HOME);
}
return $next($request);
}
In RouteServiceProvider file
public const HOME = '/index/dashboard/';
In HomeController file
public function index()
{
if ((Auth::user())->user_role == 'admin')
{
$title='admin dashboard';
return view('admin-dashboard',compact('title'));
}
else{
return view('login-page');
}
}
I can not tell you for sure without more details. but one thing you can check is that you have set the right redirect url in the RedirectIfAuthenticated middleware.
I want Laravel to redirect to '/dashboard' instead, Laravel keeps taking me to '/' after login.
LoginController.php
public function redirectPath()
{
return '/dasboard';
}
Middleware
if (Auth::guard($guard)->check())
{
return redirect()->intended('/dashboard');
}
protected function authenticated()
{
return redirect('/home');
}
I want to fetch data only when the auth is an admin.
The User controller:
public function index()
{
if (auth::user()->type == 'admin') {
return User::where('type','!=','admin')->latest()->paginate(100);
}
}
I got an error:
Trying to get property 'type' of non-object.
This code:
if (auth::user()->type == 'admin') {
should be.
if (auth()->check() && auth()->user()->type == 'admin') {
Explanation:
auth()->check() -- makes sure there is a user logged in.
&& -- stops after the first check if it is false
auth()->user()->type -- gets the type attribute from the user
If you are using role based authentication then You can check user role by creating the function in user model
USER MODEL
public function isAdministrator()
{
return $this->hasRole('admin');
}
USER CONTROLLER
class userController
{
public function index()
{
if(Auth::user()->isAdministrator())
{
# code...
}
}
Try this: Create middleware and pass route through middleware, it will work
public function handle($request, Closure $next)
{
if (auth()->user() && auth()->user()->type != 'admin')
{
return redirect('/unauthorized');
}
return $next($request);
}
You can use the method hasRole to check whether the role is admin or not.
public function index()
{
if (auth::user()->hasRole('admin')) {
return User::latest()->paginate(100);
}
}
i have level column in user table , i wanna redirect to their panel in laravel after login but i dont know where check and redirect user???
i try to login safty
Can this code be correct?
protected function authenticated(Request $request, $user)
{
if(auth()->user()->isAdmin())
{
return redirect('/admin/panel');
} elseif(auth()->user()->isWriter())
{
return redirect('/writer/panel');
}
return redirect('/user/panel');
}
Overwrite redirectPath() method to your LoginController.
class LoginController extends Controller
{
use AuthenticatesUsers;
public function redirectPath()
{
if (auth()->user()->isAdmin())
{
return '/admin/panel';
}
elseif (auth()->user()->isWriter())
{
return '/writer/panel';
}
return '/user/panel';
}
}
In LoginController that uses Illuminate\Foundation\Auth\AuthenticatesUsers trait for authentication you must override the redirectTo() method and write your own logic. so you must something like this code:
protected function redirectTo(){
$user = User::whereId(Auth::id())->first();
if(isset($user)){
if($user->role == 'admin'){
return '/admin/panel'; //path to admin panel
}elseif($user->role == 'writer'){
return '/writer/panle'; //path to writer panel
}
}
return '/';
}