【问题标题】:Configure Auth for multi-site project in laravel 5在 laravel 5 中为多站点项目配置 Auth
【发布时间】:2015-10-27 04:06:16
【问题描述】:

我正在 Laravel 5 下构建一个多站点项目,一切正常,路由按组拆分,视图和控制器在路由内,但我不知道如何使用 auth在这两个项目中,这是迄今为止的结构:

app    
|---Http
|    |---Controllers
|        |----------Club
|        |          |---IndexCtrl
|        |          |---ClientsCtrl
|        |          |--- ...
|        | 
|        |----------Center
|        |          |----IndexCtrl
|        |          |----UsersCtrl
|        |          |----ServicesCtrl
|        |          |---- ...
|        |
|        |----------Auth
|
|---- ...
|
|----resources
     |-------- ...
     |--------views
              |----Auth
              |----Center
              |----Club
              |---- ...

两个站点分别是Club和Center,Club有可以登录客户区的Client,Center有可以登录网站管理的用户。

现在我可以登录到中心,因为 Auth 具有默认配置,并且我使用 Laravel 5 默认用户管理,但我想为客户端提供另一个身份验证(这意味着另一个登录表单,但用户使用同一个表分贝)。

更新 1: 这是我的 routes.php

Route::group(array('domain' => 'site.center', 'namespace' => 'Center', 'middleware' => 'auth',), function () {

    Route::get('/', [
        'as' => 'adminIndex',
        'uses' => 'AdminCtrl@index'
    ]);

    Route::get('/out', [
        'as' => 'adminOut',
        'uses' => 'AdminCtrl@out'
    ]);
});

Route::group(array('domain' => 'site.club', 'namespace' => 'Club', 'middleware' => 'auth',), function () {

    Route::get('/', [
        'as' => 'publicIndex',
        'uses' => 'PublicCtrl@index'
    ]);

    Route::get('/out', [
        'as' => 'publicOut',
        'uses' => 'PublicCtrl@out'
    ]);
});

//Routes for auth
Route::controllers([
    'auth' => 'Auth\AuthController',
    'password' => 'Auth\PasswordController',
]);

Route::get('/register', [
    'as' => 'register',
    'uses' => 'Auth\AuthController@getRegister'
]);

Route::post('/register', [
    'as' => 'post.register',
    'uses' => 'Auth\AuthController@postRegister'
]);

Route::get('/in', [
    'as' => 'in',
    'uses' => 'Auth\AuthController@getLogin'
]);

Route::post('/in', [
    'as' => 'post.in',
    'uses' => 'Auth\AuthController@postLogin'
]);

Route::get('/out', [
    'as' => 'out',
    'uses' => 'Auth\AuthController@getLogout'
]);

我怎样才能有不同的登录和注册俱乐部和中心的看法?

【问题讨论】:

  • “我想为客户提供另一个身份验证”是什么意思?单独的登录表单?单独的用户表?还有什么?
  • 已经澄清了@jedrzej.kurylo
  • 您是否有需要登录但两种类型的用户都可以使用的区域?
  • 不,俱乐部网站中的某些部分必须客户登录,并且中心中的所有部分都需要登录用户,俱乐部和客户区域都不是通过一次登录关联的@jedrzej.kurylo
  • 问题是 Laravel 的 auth 将用户 ID 存储在会话中,并使用它为每个请求加载用户。使用单独的表,您将在不同的表中拥有相同的 ID,因此默认行为将不起作用。如果不同表中的 ID 可能相同,那么让它工作起来会很困难——您可能需要提供自己的 Auth 类实现,因为覆盖用户提供程序是不够的。

标签: php laravel authentication laravel-5


【解决方案1】:

注意: 如 cmets 所示,需要有 2 个登录表单,每个登录表单只允许验证特定类型的用户。可以将用户存储在具有 type 列的单个数据库中。

上述逻辑仍然可以使用包裹在 AuthenticatesUsers trait 中的 Laravel 的身份验证逻辑来​​实现。这一切都在http://laravel.com/docs/5.0/authentication#authenticating-users 的文档中进行了描述,所以我只描述需要更改的内容以获得您需要的内容。

为了实现这一点,您需要执行以下操作(这是选项之一):

  1. type 字段添加到您的 users 表中 - 我假设您有 2 种类型:user客户

  2. 创建 2 个显示登录表单的操作 - 我不会粘贴代码,它只是一个显示表单的简单操作,我相信您可以处理 :) 表单应该要求 用户名/电子邮件(或您用来验证用户身份的任何字段)和密码。

  3. 创建 2 个控制器,这些表单将提交给:

    class UserAuthController extends Controller {
      use AuthenticatesUsers;
    
      // field used for authentication 
      protected $username = 'username'; //or email or whatever you need      
    
      // get credentials from request that will be used for authentication
      protected function getCredentials(Request $request)
      {
        return array_merge($request->only($this->loginUsername(), 'password'), ['type' => 'user']);
      }
    }
    
    class ClientAuthController extends Controller {
      use AuthenticatesUsers;
    
      // field used for authentication 
      protected $username = 'username'; //or email or whatever you need      
    
      // get credentials from request that will be used for authentication
      protected function getCredentials(Request $request)
      {
        return array_merge($request->only($this->loginUsername(), 'password'), ['type' => 'client']);
      }
    }
    

就是这样。最重要的部分是将 type 字段添加到凭据中。 Laravel 在用户登录时执行的逻辑现在不仅会尝试匹配用户名和密码,还会尝试输入。因此,如果有人提供客户端凭据但类型设置为 user,他们将不会进行身份验证。

更新: 正如 cmets 中所指出的,可能需要对 authguest 中间件进行一些更改,以重定向到正确的路由,具体取决于用户类型。

guest 中间件将经过身份验证的用户重定向到他们的主页,如果他们尝试访问应该仅供非身份验证用户使用的页面,例如登录表单usersclients 有 2 个区域,需要考虑用户类型以重定向到相应的主页。中间件的RedirectIfAuthenticated::handle()方法需要更新:

if ($this->auth->check()) {
  return redirect('/home');
}

需要成为

if ($this->auth->check()) {
  // update with whatever routes you consider **home** for both types
  return redirect($this->auth->user()->type == 'user' ? '/userhome' : '/clienthome');
}

另一方面,auth 中间件会在未经身份验证的用户尝试访问受限区域时将其重定向到登录表单。与上面的代码一样,您将为两种类型的用户提供单独的登录表单,需要根据用户尝试访问的区域进行适当的重定向。 Authenticate::handle() 方法需要更新:

return redirect()->guest('auth/login');

需要成为

return redirect()->guest($request->route()->domain() == 'site.center' ? 'userauth' : 'clientauth');

【讨论】:

  • 明白了,让每组路由都有那个控制器?我的意思是,如果你检查了路由配置,俱乐部和中心是分组的,在它们之外还有用于登录、注册和注销的自定义路由。 Laravel 5 默认 auth 有一个文件夹,里面有两个控制器:AuthController 和 PasswordController,我会使用它们,还是这样可以解决问题?
  • @jedrzej.kurylo 这包括登录,但您还需要更改authguest 中间件以说明类型对吗?
  • @Jeemusu:这取决于。 “guest”中间件的默认实现重定向到 /home。如果这两种类型都可以,则无需更改。如果没有,那么一个简单的 if 就足够了:“return redirect($this->auth->user->type == 'user' ? '/userhome' : '/clienthome');
  • @jedrzej.kurylo 我认为基本的 Laravel 5.1 应用程序包括 auth, guest, auth.basic middleware ?
  • 是的,刚刚注意到在代码中:) “auth”中间件将未经身份验证的用户重定向到登录表单。您可能需要一些额外的逻辑来识别用户想要访问的区域并重定向到正确的登录表单。稍后我将通过示例更新答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-21
  • 2016-08-20
  • 2018-01-02
  • 2015-07-30
  • 2021-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多