在Laravel 5中为授权设置自定义sql

时间:2015-11-09 19:39:12

标签: php laravel authentication laravel-5

我是Laravel的新手并使用授权。我正在寻找为Auth更改默认sql的方法。实际上,Laravel在下面使用这个简单的sql命令来完成它:

SELECT * FROM users WHERE login="something" AND password = "something" LIMIT 1

我正在尝试更改默认的sql:

SELECT
u.id, u.name, c.company
FROM
users u, companies c
WHERE 
u.login="something" AND 
u.password = "something" AND
u.companyId = c.id
LIMIT 1

我知道我应该创建自定义授权系统:crate new user Provider和Auth Provider。

首先,我在App中创建了Auth文件夹并添加了CustomUserProvider.php

CustomUserProvider.php

<?php namespace App\Auth;

use Illuminate\Contracts\Auth\Authenticatable as UserContract;
use Illuminate\Contracts\Auth\UserProvider as UserProviderInterface;
use App\Models\User;

class CustomUserProvider implements UserProviderInterface {

    protected $model;

    public function __construct(UserContract $model)
    {
        $this->model = $model;
    }

    public function retrieveById($identifier)
    {

    }

    public function retrieveByToken($identifier, $token)
    {

    }

    public function updateRememberToken(UserContract $user, $token)
    {

    }

    public function retrieveByCredentials(array $credentials)
    {

    }

    public function validateCredentials(UserContract $user, array $credentials)
    {

    }

}

我的 customAuthProvider.php 文件,位于App/Providers

<?php namespace App\Providers;

use App\Models\User;
use Illuminate\Support\Facades\Auth;
use App\Auth\CustomUserProvider;
use Illuminate\Support\ServiceProvider;

class CustomAuthProvider extends ServiceProvider {

    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
        $this->app['auth']->extend('custom',function()
        {
            return new CustomUserProvider(new User);
        });
    }

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

}

最后,我在config/Auth.php

中将驱动程序设置为自定义
'driver' => 'custom'

我正在寻找使用此自定义类的方式如何使用自定义sql命令进行授权(登录)? 或者这可能是错的?

2 个答案:

答案 0 :(得分:1)

如果您需要的只是对在身份验证期间从数据库中提取用户的查询的附加约束,那么可以采用更简单的方法。

首先,Laravel提供了一个AuthenticatesUsers特征,您可以在控制器中使用该特征来处理身份验证请求。默认实现使用username字段从数据库中提取用户,然后,如果找到匹配的用户,则验证其密码。

可以通过覆盖控制器中的getCredentials方法来自定义用于从数据库中获取用户的属性列表。在您的情况下,以下内容足以使用用户名和公司ID加载用户:

protected function getCredentials(Request $request)
{
    return $request->only($this->loginUsername(), 'password', 'companyId);
}

添加后,用户应在登录表单中提供用户名,companyId和密码,只有当用户具有属于给定公司的用户名并且提供的密码有效时,才会对其进行身份验证。

更新:如果您决定不使用该特征,但想要手动验证用户,则可以采用非常类似的方式进行。调用Auth::attempt()时,您只需要传递用于验证用户身份的所有条件,例如:

Auth::attempt([
  'username' => Input::get('username'), 
  'companyId' => Input::get('companyId'), 
  'password' => Input::get('password')
]);

答案 1 :(得分:0)

我尝试了这个包,它帮助了我:

https://github.com/ollieread/multiauth/