laravel中的加密电子邮件验证

时间:2018-01-12 12:21:56

标签: laravel

在laravel Authtication Process中我想加密users表中的email字段(我使用过Crypt :: encrypt())。这样做,登录过程失败。我必须在登录时验证加密的电子邮件。有人可以帮助我吗?

4 个答案:

答案 0 :(得分:1)

如果我确实很了解您的问题,那么解决此问题的一种好方法是使用装饰器模式!并且Laravel提供了一种轻松创建中间件的方法,因此我们可以将它们用作装饰器。

您需要做的是添加一个名为 encryptEmails 中间件,众所周知,中间件可以访问请求对象!我们现在需要做的是从请求中检索电子邮件值并通过加密对其进行更改。

当然,您必须在登录路径中包括此中间件。

使用这种方法,您无需更改内置身份验证类的内容。

这是中间件 handle 函数的代码(我不确定用于加密电子邮件的类或方法):

query <- sprintf(
"select cod_ordem_producao
from pla.cod_ordem_producao
WHERE cod_ordem_producao like '%s%%'",input$ordemlista
) 

您可以检查此链接以获得有关Laravel中的中间件的更多信息: https://laravel.com/docs/5.7/middleware

答案 1 :(得分:0)

在这种情况下,您应该允许用户使用用户名登录。 LoginController中的Override the username()方法:

public function username()
{
    return 'username';
}

如果您仍想使用电子邮件进行身份验证,则需要加载所有用户,然后检查每个用户的已解密电子邮件,如果您注册了许多用户,这是一个坏主意。

$users = User::all();
foreach ($users as $user) {
    if ($request->email === decrypt($user->email) && \Hash::check($request->password, $user->password)) {
        auth()->login($user); // Login the user if email and password are correct
        break; // Exit from the foreach loop
    }
}

您也可以chunk the data

同样,此解决方案仅适用于少数注册用户。

答案 2 :(得分:0)

我在LoginController中使用了以下代码,并在Laravel 5.6中为我工作,

public function attemptLogin(Request $request) {
    $users = User::all();
    $isUserValidated=false;
    $field = $request->username;
    foreach ($users as $user) {
        try { // required if the field is not encrypted
            // login using username or email
            if (($field === Crypt::decryptString($user->email) || $field === Crypt::decryptString($user->username)) && \Hash::check($request->password, $user->password)) {
                $isUserValidated=true;
                $this->guard()->login($user,false);
                break; // Exit from the foreach loop
            }
        } catch (DecryptException $e) {
            //
        }
    }
    return $isUserValidated;
}

答案 3 :(得分:0)

我认为能够加密用于登录的电子邮件非常重要。 Laravel的问题在于它总是使用不同的初始化向量。

要变通解决此问题,您可以创建两个使用固定的初始化向量的方法。然后,您不必遍历所有用户。您可以将请求中的电子邮件与数据库记录进行比较。

从模型中读取电子邮件时,必须始终将其解密。保存时,必须始终对其进行加密。如果使用唯一规则和电子邮件规则进行验证,则必须分两个步骤对用户数据进行验证。首先,使用规则电子邮件验证格式,然后对传递的电子邮件进行加密,然后按规则取消验证。

我希望我能有所帮助。

注意:这不是现成的解决方案,仅是示例代码。如果尝试此解决方案,则需要注意密码代理和密码重置。


/** 
  * Get a new initialization vector 
  * Store this initialization vector in your app-config (/config/app.php)
  **/
function getNewIv() :string
{
    return openssl_random_pseudo_bytes(16);
}

/** encrypt **/
function encryptEmail(string $email): string
{
    $cipher = config('app.cipher', 'AES-256-CBC');
    $key = config('app.key');
    $iv= config('app.iv');

    $encrypted = openssl_encrypt($email, $cipher, $key, 1, base64_decode($iv));
    return base64_encode($encrypted);
}


/** decrypt **/
function decryptEmail(string $email): string
{
    $data = base64_decode($decryptString);
    $cipher = config('app.cipher', 'AES-256-CBC');
    $key = config('app.key');
    $iv= config('app.iv');

    return openssl_decrypt($data, $cipher, $key, 1, base64_decode($iv));
}