2017-05-29 36 views
0

我必須在laravel中構建登錄名。通常沒問題。但是我的客戶想用一些特殊的用戶名登錄。它應該是surname-userId。laravel身份驗證:使用組合用戶名

所以有用戶表:

id; firstname; lastname; email; ... 
1; testuser1; Smith; [email protected]; 

這裏的登錄名應爲 「史密斯-1」。我剛剛找到解決方案來重寫LoginController中的函數username()。但在這種情況下,我需要結合兩個表字段來建立用戶名。

以前有人做過嗎?

+0

你可以有一個用戶名字段,只是把那個' surname-userId'組合。 – Webinion

+0

你有什麼問題? –

+0

可能能夠應用一個全局範圍,它添加了lastname + id的concat,然後把它放在'username()'函數中,不知道它是否工作。 – Neat

回答

0

就像theHasanov說,這是足夠的超載attemptLogin功能。該EloquentUserProvider建立與給定的憑據查詢:

/** 
    * Retrieve a user by the given credentials. 
    * 
    * @param array $credentials 
    * @return \Illuminate\Contracts\Auth\Authenticatable|null 
    */ 
    public function retrieveByCredentials(array $credentials) 
    { 
     if (empty($credentials)) { 
      return; 
     } 

     // First we will add each credential element to the query as a where clause. 
     // Then we can execute the query and, if we found a user, return it in a 
     // Eloquent User "model" that will be utilized by the Guard instances. 
     $query = $this->createModel()->newQuery(); 

     foreach ($credentials as $key => $value) { 
      if (! Str::contains($key, 'password')) { 
       $query->where($key, $value); 
      } 
     } 

     return $query->first(); 
    } 

,所以我只是分裂輸入的用戶名分成兩個字段和UserProvider作出的休息:

/** 
* Attempt to log the user into the application. 
* 
* @param \Illuminate\Http\Request $request 
* @return bool 
*/ 
protected function attemptLogin(Request $request) 
{ 
    $credentials = $this->credentials($request); 

    list($lastname, $id) = explode('-', $credentials[$this->username()]); 

    $params = [ 
     'id' => (int) $id, 
     'name' => $lastname, 
     'password' => $credentials['password'], 
    ]; 

    return $this->guard()->attempt(
     $params, $request->has('remember') 
    ); 
} 
1

只是重載方法attemptLogin

+0

然後我會自己完成所有的驗證 –

+0

好吧,你是對的!覆蓋attemptLogin函數就足夠了。我在想複雜。我會發布更詳細的答案 –