Php 如何使用auth中间件管理不同用户类型的登录/重定向?

Php 如何使用auth中间件管理不同用户类型的登录/重定向?,php,authentication,laravel,login,laravel-5,Php,Authentication,Laravel,Login,Laravel 5,我想设置两个登录路径 /管理员/ /使用者/ Laravel5提供了用于身份验证的身份验证中间件。中间件还为登录、密码重置等提供默认视图,我计划按功能原样使用这些视图 !:要管理这两个登录,routes.php和Controller中需要做哪些更改 !!:我如何管理他们的重定向(一个到管理面板,另一个回到主页)?(默认情况下,auth重定向到“主”视图) 编辑:我知道如何防止未经授权的访问,但我说的是一种可以分别管理两次访问的设置。一种方法是,如果用户池实际上是相同的,则将同一控制器绑定到不

我想设置两个登录路径

  • /管理员/
  • /使用者/
Laravel5提供了用于身份验证的身份验证中间件。中间件还为登录、密码重置等提供默认视图,我计划按功能原样使用这些视图

!:要管理这两个登录,routes.php和Controller中需要做哪些更改

!!:我如何管理他们的重定向(一个到管理面板,另一个回到主页)?(默认情况下,auth重定向到“主”视图)


编辑:我知道如何防止未经授权的访问,但我说的是一种可以分别管理两次访问的设置。

一种方法是,如果用户池实际上是相同的,则将同一控制器绑定到不同的路径


您可以根据RedirectiAuthenticated Middleware中登录的用户类型决定重定向到哪里。

您可以检查控制器上的用户是管理员还是用户,并向他显示正确的视图,但您的用户和管理员真的需要不同的登录页面吗?您真的需要两个不同的恢复密码吗?如果不是,那么您可以为这两个控制器使用AuthController,如果是,那么为什么不创建两个扩展AuthController的控制器呢

对我来说,这是最好的解决方案,为了保持事物的干净和分离,为什么不扩展甚至修改
RedfirectIfAuthenticated

<?php namespace App\Http\Middleware;

use Closure;
use Illuminate\Contracts\Auth\Guard;
use Illuminate\Http\RedirectResponse;
use User;

class RedirectIfAuthenticated {

    /**
     * The Guard implementation.
     *
     * @var Guard
     */
    protected $auth;

    /**
     * Create a new filter instance.
     *
     * @param  Guard  $auth
     * @return void
     */
    public function __construct(Guard $auth)
    {
        $this->auth = $auth;
    }

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if ($this->auth->check())
        {
            //we have a logged user check if it's admin
            if($this->auth->user()->admin){
              return new RedirectResponse(url('/admin'));
            }else{
              return new RedirectResponse(url('/user'));
            }
        }

        return $next($request);
    }

}
在您的路线上:

Route::group(['prefix' => 'admin', 'middleware' => 'auth.admin'], function()
{
    Route::resource('profile','API\ProfileController');
});

管理员和用户在同一个laravel应用程序中是个坏主意,因为该应用程序将共享相同的会话和存储信息。将有无数的egde案例会导致信息通过您设置的任何逻辑“墙”泄漏,最终您将花费太多时间修补这些泄漏。您真正想做的是为每个应用程序分别设置laravel应用程序:admin.project.com和project.com。这样您就可以获得两个独立的会话和存储。您需要做的就是确保在database.php配置文件中都设置了所需的数据库。您甚至可以通过单独的部署在同一台服务器上承载这两个项目,监听不同的端口。相信我,这是最好的方法。

我建议使用一个特定的包作为委托来处理角色。但这会让测试变得混乱。另外,重定向对搜索索引也没有帮助。我想你说得有道理。我想知道其他支持模块系统(例如zf2)的php框架是否也是如此?我还想知道,这是否意味着我们的项目中需要为不同的用户群提供独立的Laravel应用程序?是的,这是绝对可能的。唯一的限制是您的服务器设置。但在数码海洋、Linode&Vultr.com的这些日子里,这个问题不再存在了。嘿,法比奥,我看到了你的答案。我是新来的。在VerifyAdmin中间件中,您使用了if“(!$this->auth->user()->admin)”。所以我只需要知道,$this->auth->user()->admin是什么?@Camit1dk
$this->auth->user()
是为了获取当前登录的用户,他们
$this->auth->user()->admin
正在从该用户访问一个属性,假设在表中的数据库中有一个名为
admin
的属性,带有标志1或0。这真的要由你来决定怎么处理。这只是一个例子
// Within App\Http\Kernel Class...

protected $routeMiddleware = [
    'auth' => 'App\Http\Middleware\Authenticate',
    'auth.basic' => 'Illuminate\Auth\Middleware\AuthenticateWithBasicAuth',
    'guest' => 'App\Http\Middleware\RedirectIfAuthenticated',
    'auth.admin' => 'App\Http\Middleware\VerifyAdmin',
];
Route::group(['prefix' => 'admin', 'middleware' => 'auth.admin'], function()
{
    Route::resource('profile','API\ProfileController');
});