控制器和模型中的全局可访问用户对象

时间:2014-06-07 16:11:31

标签: php laravel

我正在构建一个使用身份验证令牌对用户进行身份验证的Laravel API。对于需要身份验证的任何路由,我都将它们包装在auth过滤器中:

Route::group(array('before' => 'auth'), function() {
    Route::get('user/account', 'UserController@getAccountDetails');
});

我的auth过滤器基本上解密传入的身份验证令牌并检查它是否有效:

Route::filter('auth', function()
{
    // Try catch because Crypt::decrypt throws an exception if it's not a valid string to decrypt
    try {
        $authToken = Crypt::decrypt(Request::header('Authorization'));

        // If there's a user tied to this auth token, it's valid
        $user = AuthToken::where('token', '=', $authToken)->first()->user()->first();

        if (!$user) {
            throw new \Exception();
        }

        // Make the user globally accessible in controllers

    } catch (\Exception $e) {
        return Response::json([
            'data' => [
                'error' => 'You must be logged in to access this resource.'
            ],
            'success' => false,
            'status' => 403
        ], 403);
    }
});

非常简单的东西,但我仍然坚持下一部分。我希望能够轻松检索控制器和模型中的当前用户记录。

例如,如果我使用Laravel的Auth库,我可以通过控制器中的Auth::user()来获取当前用户。我希望拥有这种功能,但我不确定如何构建它。我可以编写一个在使用返回User模型的静态方法进行身份验证后实例化的类吗?

2 个答案:

答案 0 :(得分:2)

不确定这是否是您的选择,但也许您想使用oauth2而不是写#34;您自己的"基于令牌的身份验证?

laravel项目有一个非常好的ouath2服务器包装器:oauth2-server-laravel。

根据它的文档,您可以(例如密码流认证)将其放入其配置中:

'password' => array(
'class'            => 'League\OAuth2\Server\Grant\Password',
'access_token_ttl' => 604800,
'callback'         => function($username, $password){

    $credentials = array(
        'email' => $username,
        'password' => $password,
    );

    $valid = Auth::validate($credentials);

    if (!$valid) {
        return false;
    }

    return Auth::getProvider()->retrieveByCredentials($credentials)->id;
}
)

除此之外,你可以通过发送邮件请求进行身份验证(在这种情况下通过用户名和密码):

POST https://www.example.com/oauth/access_token?
grant_type=password&
client_id=the_client_id&
client_secret=the_client_secret&
username=the_username&
password=the_password&
scope=scope1,scope2&
state=123456789

请求将返回生成的令牌,然后您可以像往常一样进行api调用,只需将令牌放入发布数据中。

在你的api逻辑中,通过令牌获取用户非常简单,只需运行:

User::find(ResourceServer::getOwnerId());

它会产生类似:刷新令牌,其他授权流程,范围访问,客户端管理等等。开箱即用。

您还可以保护任何特定路线:

Route::get('secure-route', array('before' => 'oauth', function(){
    return "oauth secured route";
}));

您可以在oauth2-server-laravel文档中找到更多详细信息:https://github.com/lucadegasperi/oauth2-server-laravel

和oauth2文档:http://oauth.net/documentation/

答案 1 :(得分:0)

Auth::user()方法确实非常方便。那么,为什么不简单地扩展Auth类来编写自己的身份验证驱动程序呢?您可以找到所有需要的文档here

然后你就可以使用Auth外观,就像你可以编写的所有其他laravel应用程序一样......太棒了,不是吗?