在laravel 5中为多站点项目配置Auth

时间:2015-08-04 16:29:28

标签: php laravel authentication laravel-5

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

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

这两个网站是俱乐部,中心,俱乐部有客户可以登录客户区,在中心有用户可以登录网站管理。

现在我可以登录到Center,因为Auth具有默认配置,我正在使用Laravel 5默认用户管理,但我想为客户端设置另一个身份验证(这意味着另一个登录表单,但用户使用相同的表在db)。

更新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'
]);

我怎么能有不同的登录和注册俱乐部和中心的观点?

1 个答案:

答案 0 :(得分:3)

注意:如注释中所示,需要的是有2个登录表单,每个表单只允许对特定类型的用户进行身份验证。使用类型列将用户存储在单个数据库中是可以接受的。

使用Laravel的 AuthenticatesUsers 特征包含的身份验证逻辑,仍然可以实现上述逻辑。这些都在这里的文档http://laravel.com/docs/5.0/authentication#authenticating-users中描述,所以我只是描述需要改变的内容以获得所需的内容。

为了实现这一目标,您需要执行以下操作(这是其中一个选项):

  1. 类型字段添加到用户表格中 - 我假设您有两种类型:用户客户端

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

  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']);
      }
    }
    
  4. 就是这样。最重要的部分是在凭据中添加类型字段。 Laravel在用户登录时执行的逻辑现在不仅会尝试匹配用户名和密码,还会输入。因此,如果有人提供客户端凭据但类型设置为用户,则他们将不会进行身份验证。

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

    来宾中间件如果他们尝试访问仅适用于非真实用户的页面,例如登录表单,则会将经过身份验证的用户重定向到其主页。对于用户客户端的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 中间件在未经身份验证的用户尝试访问受限区域时会将其重定向到登录表单。与上述代码一样,您将为2种类型的用户提供单独的登录表单,需要根据用户尝试访问的区域进行正确的重定向。需要更新 Authenticate :: handle()方法:

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

    需要成为

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