在Laravel 5.4

时间:2017-05-18 14:52:49

标签: php session laravel-5.4

我有一种感觉,这是一个非常愚蠢的问题,我可能忽视了一些非常微小的问题,但无论如何我都很难过。

目前,我有一个应用程序,其中有几个页面受中间件保护。如果用户不满足这些中间件的要求,则会将其重定向到登录页面。现在,在他们登录后,我希望他们被发送回他们试图访问的页面。

我已经尝试了很多东西来实现这个目标,但都没有成功。我现在要做的是以下内容:

  1. 用户尝试访问管理页面(例如 / admin ):PagesController @ adminDashboard
  2. 当他们访问控制器中的overview()方法时(与index()相同,但对于管理员),会设置一个会话变量,其中包含他们尝试访问的网址( / admin )< / LI>
  3. 用户被重定向到登录页面并登录(SessionsController @ create和@store)
  4. 登录后,会将其重定向到具有预期网址的会话变量
  5. 这就是我尝试这样做的方式:

    PagesController

    public function adminDashboard()
    {
        $intended = '/admin';
        session('intended-url', $intended);
    
        //dd(session('intended-url');
    
        $schools = School::all();
        $articles = Article::all();
        $sights = Sight::all();
    
        return view('admin', compact('sights', 'articles', 'schools'));
    }
    

    SessionsController

    public function store()
    {
        /*
            ...
        */
    
        $intendedURL = session('intended-url');
    
        if($intendedURL != null)
        {
            return redirect($intendedURL);
        }
        else
        {
            return redirect()->home();
        }
    

    在这里和那里使用dd()几次,我发现它甚至没有在开始时设置会话变量(在PagesController中注释的dd()返回null)。

    我尝试使用Session :: put(),Session :: set(),在会话中使用方括号(['intention-url','/ admin']),但没有一个给出我正在寻找的结果:(

    有没有人对如何做到这一点有任何建议,或者可能采用不同的方式来实现同一目标,但效率更高?谢谢!

    编辑:我认为默认的Laravel重定向到目标页面不会在这里工作,因为我从头开始重写大部分登录系统以满足某些特定需求。除非有人知道重定向如何在幕后工作,我可以覆盖/重写它

2 个答案:

答案 0 :(得分:0)

如果您使用的是默认身份验证系统,则可以使用此功能将用户重定向到他们想要查看的页面:

return redirect()->intended('fallback/uri');

答案 1 :(得分:0)

为什么你不使用中间件只是制作新的中间件

php artisan make:middleware admin

并添加此公共函数句柄代码

if (!Auth::guest() && Auth::user()->admin) {

        return $next($request);
    }
     return redirect('/')->with('warning', 'This Area only For Admin');

在受保护的$ routeMiddleware

中将此代码添加到kernal中
protected $routeMiddleware = [
'admin' => \App\Http\Middleware\admin::class,
];

在用户表格中创建新列

$table->boolean('admin')->default(false);

现在您可以使用构造函数

 public function __construct()
{
    $this->middleware('admin');
}

注意: - 你在哪里添加$ this-&gt;中间件('admin');所有控制器都将为用户锁定,仅限访客管理员可以使用此控制器