【问题标题】:Session doesn't get stored permanently Laravel 5.5会话不会永久存储 Laravel 5.5
【发布时间】:2017-12-01 17:37:01
【问题描述】:

我正在创建一个小型博客式网站。这个网站基本上有 3 个权限级别:管理员(可以编辑/删除任何帖子并创建用户)、用户(可以上传帖子和图片)和访客(不需要帐户,可以浏览帖子)。

我正在使用 Laravel 5.5 创建这个网站。

当有人登录时,通过身份验证后,我将他们的用户名和用户类型(管理员/用户)存储在会话中,登录后,他们被重定向到各自的页面,如下面的代码所示。

我在 AuthenticatesUsers trait 中覆盖了 'authenticated' 方法:

登录控制器.php

protected function authenticated(Request $request, $user)
{
    $type = $user->toArray()['type'];//get user type (admin/user)
    $username = $user->toArray()['username'];
    $request->session()->put('type', $type);
    $request->session()->put('username', $username);
    if ( $type == 'admin' ) {
        return redirect()->route('admin_home');
    }

    return redirect()->route('user_home');
}

上面的代码有效,我的用户在成功登录后被重定向。

但是,如果我的用户访问站点主页 (localhost:8000/),我希望用户看到管理员主页或用户主页(localhost:8000/ 只显示未登录访客的主页)

我使用以下代码做到了这一点:

Web.php

Route::get('/', 'ContentController@publicHome');

Route::middleware('auth')->group(function(){
    Route::get('/user/home', 'ContentController@userHome')->name('user_home');
    Route::get('/admin/home', 'ContentController@adminHome')->name('admin_home');
});

过滤用户是登录还是访客:

ContentController - publicHome 函数

public function publicHome(Request $request){
    $data = [];
    $data['home'] = 1;
    if($request->session()->has('type')){
        switch ($request->session()->pull('type')){
            case 'admin':
                return redirect()->route('admin_home');
            case 'user':
                return redirect()->route('user_home');
        }
    }
    return view('public.home', $data);
}

ContentController - userHome 函数

public function userHome(Request $request){
    $data = [];
    $data['username'] = $this->getUsername($request);
    $data['type'] = $this->getUserType($request);
//  dd($data); explanation for this line below
    return view('user.home', $data);
}

ContentController - adminHome 函数

public function adminHome(Request $request){
    $data = [];
    $data['username'] = $this->getUsername($request);
    $data['type'] = $this->getUserType($request);
    //dd($data);
    return view('admin.home', $data);
}

ContentController - 获取用户名和获取用户类型函数

public function getUsername(Request $request){
        return $request->session()->has('username') ? $request->session()->pull('username') : 'username not set';
}

public function getUserType(Request $request){
        return $request->session()->has('type') ? $request->session()->pull('type') : 'user type not set';
}

在加载视图之前,我使用了 dump 和 die 函数来查看 $data[] 数组

登录成功后:

array:2 [▼
  "username" => "testAdmin"
   "type" => "admin"
] //works correctly, session variables seem to be set

所以当我输入localhost:8000/ 时,我希望被重定向到/admin/home(或/user/home,具体取决于登录),但我只是被发送到localhost:8000/,就好像我没有登录一样。所以现在当我手动输入/admin/home 我得到以下转储和死亡输出:

array:2 [▼
  "username" => "username not set"
  "type" => "user type not set"
]

【问题讨论】:

    标签: php session laravel-5.5


    【解决方案1】:

    如果您使用$request->session()->pull('username'),它会从会话中获取数据,即用户名并同时将其删除。

    相反,您可以使用 laravel 的辅助方法 session() 来获取数据而不删除它。所以现在你可以使用session('username') 来获取用户名了。

    更多信息请参考:https://laravel.com/docs/5.5/session

    一些建议:

    1. 您可以使用 laravel 的内部 Auth 库来构建登录系统,该系统已经具有许多您不需要再次编码的功能。 https://laravel.com/docs/5.5/authentication
    2. 您还可以进行多用户身份验证(管理员和普通用户)。如果您想这样实现,请参考此链接:https://scotch.io/tutorials/user-authorization-in-laravel-54-with-spatie-laravel-permission

    【讨论】:

    • 非常感谢!这解决了问题。我显然需要阅读更多关于文档的内容。也感谢您的建议。最后一个问题:用户注销后是否会清除所有会话变量?我正在使用 Laravel Auth Scaffolding 附带的 logout 路由
    • @user3536523 从未尝试过。如果您想手动删除所有会话数据,您可以刷新它$request->session()->flush();
    猜你喜欢
    • 1970-01-01
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    • 2017-11-19
    • 2018-07-02
    • 2014-09-08
    • 2011-12-31
    • 1970-01-01
    相关资源
    最近更新 更多