会话不会永久存储 Laravel 5.5
Session doesn't get stored permanently Laravel 5.5
我正在创建一个类似博客的小型网站。该网站基本上有 3 个权限级别:管理员(可以 edit/remove 任何 post 并创建用户)、用户(可以上传 post 和图片)和访客(不需要帐户,只能浏览 posts).
我正在使用 Laravel 5.5 创建这个网站。
当有人登录时,经过身份验证后,我将他们的用户名和用户类型 (admin/user) 存储在会话中,登录后,他们将被重定向到各自的页面,如以下代码所示。
我覆盖了 AuthenticatesUsers 特征中的 'authenticated' 方法:
LoginController.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 - getUsername 和 getUserType 函数
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"
]
如果您正在使用 $request->session()->pull('username')
,它会从会话中获取数据,即用户名,并同时将其删除。
相反,您可以使用 laravel 的辅助方法 session()
来获取数据而不删除它。所以现在你可以使用 session('username')
来获取用户名。
更多信息请参考:https://laravel.com/docs/5.5/session
一些建议:
- 您可以使用 laravel 的内部 Auth 库来构建登录系统,该系统已经具有许多您不需要再次编写代码的功能。 https://laravel.com/docs/5.5/authentication
- 您还可以进行多用户身份验证(管理员和普通用户)。如果您想实现,请参考此 link:https://scotch.io/tutorials/user-authorization-in-laravel-54-with-spatie-laravel-permission
我正在创建一个类似博客的小型网站。该网站基本上有 3 个权限级别:管理员(可以 edit/remove 任何 post 并创建用户)、用户(可以上传 post 和图片)和访客(不需要帐户,只能浏览 posts).
我正在使用 Laravel 5.5 创建这个网站。
当有人登录时,经过身份验证后,我将他们的用户名和用户类型 (admin/user) 存储在会话中,登录后,他们将被重定向到各自的页面,如以下代码所示。
我覆盖了 AuthenticatesUsers 特征中的 'authenticated' 方法:
LoginController.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 - getUsername 和 getUserType 函数
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"
]
如果您正在使用 $request->session()->pull('username')
,它会从会话中获取数据,即用户名,并同时将其删除。
相反,您可以使用 laravel 的辅助方法 session()
来获取数据而不删除它。所以现在你可以使用 session('username')
来获取用户名。
更多信息请参考:https://laravel.com/docs/5.5/session
一些建议:
- 您可以使用 laravel 的内部 Auth 库来构建登录系统,该系统已经具有许多您不需要再次编写代码的功能。 https://laravel.com/docs/5.5/authentication
- 您还可以进行多用户身份验证(管理员和普通用户)。如果您想实现,请参考此 link:https://scotch.io/tutorials/user-authorization-in-laravel-54-with-spatie-laravel-permission