Laravel5.5+ 区分前后端用户登录

举报
lxw1844912514 发表于 2022/03/27 02:11:34 2022/03/27
【摘要】 Laravel 的用户认证是通过 Auth Facade 门脸实现的,手动认证可是使用  Auth::login() 或 Auth::attempt() 这两个方法实现.以下内容纯属个人实现,也许有更优的实现方式.对于识别前后端的用户,可以使用 Auth::guard() 方法实现,前端默认为 web 看守,Auth::...

Laravel 的用户认证是通过 Auth Facade 门脸实现的,手动认证可是使用  Auth::login() 或 Auth::attempt() 这两个方法实现.

以下内容纯属个人实现,也许有更优的实现方式.

对于识别前后端的用户,可以使用 Auth::guard() 方法实现,前端默认为 web 看守,Auth::guard('web') ,后端用户使用 admin 看守, Auth::guard('admin') .
1.新建 guard 看守

在 config/auth.php 中新建 admin 看守


    
  1. 'guards' => [
  2. 'web' => [
  3. 'driver' => 'session',
  4. 'provider' => 'users',
  5. ],
  6. 'api' => [
  7. 'driver' => 'token',
  8. 'provider' => 'users',
  9. ],
  10. 'admin' => [
  11. 'driver' => 'session',
  12. 'provider' => 'users'
  13. ]
  14. ]

看守的提供者 provider 不变,还是 users .


    
  1. 'providers' => [
  2. 'users' => [
  3. 'driver' => 'eloquent',
  4. 'model' => App\Models\User::class,
  5. 'table' => 'users',
  6. ],
  7. // 'users' => [
  8. // 'driver' => 'database',
  9. // 'table' => 'users',
  10. // ],
  11. ],

这样做的好处是前后端的用户可以放在一张 users 表中,只需要利用状态区分用户就好了,比如 user_status = 1 的是前端用户, user_status = 2 的是后端用户.
2. 新建两个中间件,区分前后端用户登录

将新建的中间件添加到 app/Http/Kernel.php 中


    
  1. protected $routeMiddleware = [
  2. ....
  3. 'adminVerify' => \App\Http\Middleware\AdminVerify::class,
  4. 'frontVerify' => \App\Http\Middleware\FrontVerify::class,
  5. ];

在区分前后端用户登录这个功能中,可以废弃默认 Auth 认证中间件 guest.

'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,

   

这样做的好处是简化了中间件的使用,不用两套系统公用一个 guest 中间件.

我们使用 adminVerify 中间件来做后端认证,所有的后端路由都必须通过这个中间件. adminVerify 中间件如下

   


    
  1. <?php
  2. namespace App\Http\Middleware;
  3. use Closure;
  4. use Illuminate\Support\Facades\Auth;
  5. class AdminVerify
  6. {
  7. /**
  8. * Handle an incoming request.
  9. *
  10. * @param \Illuminate\Http\Request $request
  11. * @param \Closure $next
  12. * @return mixed
  13. */
  14. public function handle($request, Closure $next)
  15. {
  16. $current_uri = $request->getRequestUri();
  17. $ignore_uri = [
  18. '/admin/login',
  19. '/admin/logout'
  20. ];
  21. if (in_array($current_uri, $ignore_uri)) {
  22. return $next($request);
  23. } else {
  24. if (Auth::guard('admin')->check()) {
  25. return $next($request);
  26. } else {
  27. return redirect('/admin/login');
  28. }
  29. }
  30. }
  31. }

使用 frontVerify 中间件来做前端认证,所有的前端路由都必须通过这个中间件. frontVerify 中间件如下


    
  1. <?php
  2. namespace App\Http\Middleware;
  3. use Closure;
  4. use Illuminate\Support\Facades\Auth;
  5. class FrontVerify
  6. {
  7. /**
  8. * Handle an incoming request.
  9. *
  10. * @param \Illuminate\Http\Request $request
  11. * @param \Closure $next
  12. * @return mixed
  13. */
  14. public function handle($request, Closure $next)
  15. {
  16. $current_uri = $request->getRequestUri();
  17. $ignore_uri = [
  18. '/login',
  19. '/logout'
  20. ];
  21. if (in_array($current_uri, $ignore_uri)) {
  22. return $next($request);
  23. } else {
  24. if (Auth::guard('web')->check()) {
  25. return $next($request);
  26. } else {
  27. return redirect('/login');
  28. }
  29. }
  30. }
  31. }

3. 路由设置

默认所有的前端路由都没有前缀,所有的后端路由都带有 admin 前缀. 路由设置如下.


    
  1. // ==== 前后端登录
  2. // 前端
  3. Route::group(['middleware' => ['frontVerify']], function () {
  4. Route::get('/', 'Front\LoginController@index')->name('front_index');
  5. Route::get('login', 'Front\LoginController@login');
  6. Route::post('login', 'Front\LoginController@store')->name('front_login');
  7. Route::get('logout', 'Front\LoginController@logout')->name('front_logout');
  8. Route::get('login-success', 'Front\LoginController@success')->name('front_success');
  9. });
  10. // 后端
  11. Route::group(['prefix' => 'admin', 'middleware' => ['adminVerify']], function () {
  12. Route::get('/', 'Admin\LoginController@index')->name('admin_index');
  13. Route::get('login', 'Admin\LoginController@login');
  14. Route::post('login', 'Admin\LoginController@store')->name('admin_login');
  15. Route::get('logout', 'Admin\LoginController@logout')->name('admin_logout');
  16. Route::get('login-success', 'Admin\LoginController@success')->name('admin_success');
  17. });
  18. // ==== 前后端登录 END

前后端都有一个 login-success 页面,这两个页面的内容是一模一样的,除了文字不一样.

以下是后端页面的 login-success 页面


    
  1. <h1>后端登录成功</h1>
  2. 我是 admin guard -- {{ \Illuminate\Support\Facades\Auth::guard('admin')->check() }}
  3. =====
  4. 我是 web guard -- {{ \Illuminate\Support\Facades\Auth::guard('web')->check() }}

前端的 login-success 页面


    
  1. <h1>前端登录成功</h1>
  2. 我是 admin guard -- {{ \Illuminate\Support\Facades\Auth::guard('admin')->check() }}
  3. =====
  4. 我是 web guard -- {{ \Illuminate\Support\Facades\Auth::guard('web')->check() }}

路由列表中前端有一个首页 / ,后端也有一个默认的首页 /admin/,这两个首页的作用是验证未登录的用户是不能访问前后端的任何一个页面的,如果通过路由访问,并且是在没有登录的情况下,那么在中间件中就让其自动跳到对应的登录页面,具体可以看中间件的代码.
4 . 具体登录代码实现
4.1.1 前端登录

   


    
  1. <?php
  2. namespace App\Http\Controllers\Front;
  3. use App\Http\Controllers\Controller;
  4. use Illuminate\Foundation\Auth\AuthenticatesUsers;
  5. use Illuminate\Http\Request;
  6. use Illuminate\Support\Facades\Auth;
  7. class LoginController extends Controller
  8. {
  9. //
  10. use AuthenticatesUsers;
  11. /**
  12. * LoginController constructor.
  13. */
  14. public function __construct()
  15. {
  16. }
  17. public function index()
  18. {
  19. return view('front.index');
  20. }
  21. public function login(Request $request)
  22. {
  23. return view('front.login');
  24. }
  25. public function store(Request $request)
  26. {
  27. $credentials = $this->validate($request, [
  28. 'phone' => 'required|max:255',
  29. 'password' => 'required'
  30. ]);
  31. $rs = $this->guard()->attempt($credentials);
  32. if ($rs) {
  33. return redirect()->route('front_success');
  34. } else {
  35. return back();
  36. }
  37. }
  38. public function logout(Request $request)
  39. {
  40. $this->guard()->logout();
  41. $request->session()->flush();
  42. return redirect()->route('front_login');
  43. }
  44. public function success(Request $request)
  45. {
  46. return view('front.success');
  47. }
  48. protected function guard()
  49. {
  50. return Auth::guard('web');
  51. }
  52. }

4.1.2 后端登录

  


    
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: nwei
  5. * Date: 2018/12/21
  6. * Time: 16:19
  7. */
  8. namespace App\Http\Controllers\Admin;
  9. use App\Http\Controllers\Controller;
  10. use Illuminate\Http\Request;
  11. use Illuminate\Support\Facades\Auth;
  12. class LoginController extends Controller
  13. {
  14. /**
  15. * LoginController constructor.
  16. * @param string $redirectTo
  17. */
  18. public function __construct()
  19. {
  20. }
  21. public function index()
  22. {
  23. return view('admin.index');
  24. }
  25. public function login()
  26. {
  27. return view('admin.login');
  28. }
  29. public function store(Request $request)
  30. {
  31. $credentials = $this->validate($request, [
  32. 'phone' => 'required|max:255',
  33. 'password' => 'required'
  34. ]);
  35. $rs = $this->guard()->attempt($credentials);
  36. if ($rs) {
  37. return redirect()->route('admin_success');
  38. } else {
  39. return back();
  40. }
  41. }
  42. public function success()
  43. {
  44. return view('admin.success');
  45. }
  46. public function logout(Request $request)
  47. {
  48. $this->guard()->logout();
  49. $request->session()->flush();
  50. return redirect('admin/login');
  51. }
  52. protected function guard()
  53. {
  54. return Auth::guard('admin');
  55. }
  56. }

4.2 登录结果
4.2.1 前端登录结果

4.2.2 开一个隐身模式,测试后端登录结果

测试成功!

 
    类似博文:

    https://segmentfault.com/a/1190000007716366

原文:https://blog.csdn.net/xiaobinqt/article/details/85230617

文章来源: blog.csdn.net,作者:lxw1844912514,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/lxw1844912514/article/details/100029074

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。