2013-05-28 118 views
4

我有不同的用戶,其中一些是普通用戶,一些是管理員。 我需要的是,只需單擊用戶列表中的按鈕,管理員就可以以任何其他用戶身份登錄。用特定用戶登錄Laravel 4

我至今是:

index.blade.php(用戶列表):

<a href='{{URL::route('users.loginas', array('id' => $user->id))}}'>LoginAs</a> 

routes.php文件:

Route::group(array('before'=>'auth'), function() 
{ 
    Route::get('/', array('as'=>'index', 'uses'=>'[email protected]')); 

    Route::resource('users', 'UsersController'); 
    Route::any('users/loginas/{id}', array('as'=>'users.loginas', 'uses' => '[email protected]')); 

}); 

UsersController.php:

class UsersController extends BaseController { 

... 

public function loginAs($id) 
    { 
     Auth::logout(); 
     Auth::loginUsingId($id); 

     return Redirect::route('provalogin'); 
    } 

} 

當我點擊鏈接與ID 2從用戶列表,而用戶與ID爲1的用戶登錄,我正確地重定向到mysite.com/users/loginas/2但隨後拋出ErrorException:通過

參數1來照亮\ Auth \ Guard :: login()必須實現 接口Illuminate \ Auth \ UserInterface,null給出,在 /var/www/mysite.com/web/vendor/laravel/framework/src/Illuminate/Auth/中調用Guard.php 上線368和定義

然後,如果我改變的URL mysite.com/users我可以看到,我其實是登錄的新用戶,所以Auth::loginUsingId(2)瓦特orked。

我在做什麼錯?或者我該怎麼做?

+1

你可以嘗試它沒有'''Auth :: logout()'''?似乎在同一個請求中不能調用'''Auth :: logout()''和'''Auth :: loginUsingId()'''。 – bryantebeek

+0

如果沒有'Auth :: logout()'它不會崩潰,但它也不會切換記錄的useras我保持seing永恆,就好像我仍然是管理員用戶。 :( – Jester

+1

我遇到了同樣的問題,我注意到如果你使用Auth :: login而不是Auth :: loginUsingId,我實際上會與新用戶重新登錄。但這些方法和如何返回到管理員之間有什麼區別 - 我沒有任何線索 – Victor

回答

0

我所做的是使用會話來設置用戶ID等於auth用戶ID。然後,如果我想切換用戶,我只需更改會話用戶標識,但保留auth用戶標識爲我自己。在我的應用程序中,我總是在查詢數據時傳遞會話用戶標識。如果我更新,創建或軟刪除記錄我傳遞我的身份驗證用戶ID。這樣我就記錄了誰實際上更改了數據。我從來沒有註銷切換用戶,只需設置會話userID。

0

聽起來像你的用戶模型沒有正確設置,繼承UserInterface。

您的用戶模型應該是這個樣子:

class User extends Eloquent implements UserInterface 

和你auth.php的配置應該是這個樣子:

return array(

    /* 
    |-------------------------------------------------------------------------- 
    | Default Authentication Driver 
    |-------------------------------------------------------------------------- 
    | 
    | This option controls the authentication driver that will be utilized. 
    | This drivers manages the retrieval and authentication of the users 
    | attempting to get access to protected areas of your application. 
    | 
    | Supported: "database", "eloquent" 
    | 
    */ 

    'driver' => 'eloquent', 

    /* 
    |-------------------------------------------------------------------------- 
    | Authentication Model 
    |-------------------------------------------------------------------------- 
    | 
    | When using the "Eloquent" authentication driver, we need to know which 
    | Eloquent model should be used to retrieve your users. Of course, it 
    | is often just the "User" model but you may use whatever you like. 
    | 
    */ 

    'model' => 'User', 

    /* 
    |-------------------------------------------------------------------------- 
    | Authentication Table 
    |-------------------------------------------------------------------------- 
    | 
    | When using the "Database" authentication driver, we need to know which 
    | table should be used to retrieve your users. We have chosen a basic 
    | default value but you may easily change it to any table you like. 
    | 
    */ 

    'table' => '', 

    /* 
    |-------------------------------------------------------------------------- 
    | Password Reminder Settings 
    |-------------------------------------------------------------------------- 
    | 
    | Here you may set the settings for password reminders, including a view 
    | that should be used as your password reminder e-mail. You will also 
    | be able to set the name of the table that holds the reset tokens. 
    | 
    */ 

    'reminder' => array(
     'email' => 'emails.forgot-pass', 'table' => 'forgot_pass' 
    ), 

) 
+0

但這還不是全部,他還必須實現getAuthIdentifier()和getAuthPassword(),以便UserInterface工作。請參閱http://stackoverflow.com/questions/17418085/laravel-4-auth-with-facebook-no-password-authentication – orrd

0

對我來說,與\Session::flush();工作。在會議中似乎還記得一些變數。

0

我發現我的用戶是空的,我通過加載一個正確的用戶來解決,我不知道它是否也適用於您,但您可以嘗試。