首页 > 解决方案 > 在拉拉维尔。如何加密用户表中的电子邮件地址

问题描述

我想加密用户表中的电子邮件地址以保护个人信息。我尝试这种方式:app¥Encryptable.php

<?php
namespace App;
use Crypt;
trait Encryptable{
    public function getAttribute($key){
        $value = parent::getAttribute($key);
        if (in_array($key, $this->encryptable)) {$value = Crypt::decrypt($value);return $value;}
        return $value;
    }
    public function setAttribute($key, $value){
        if (in_array($key, $this->encryptable)) {$value = Crypt::encrypt($value);}
        return parent::setAttribute($key, $value);
    }
}

应用\用户.php

<?php
namespace App;
use Illuminate\Contracts\Auth\MustVerifyEmail as MustVerifyEmailContract;
use Illuminate\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use App\Encryptable;
class User extends Authenticatable implements MustVerifyEmailContract{
    use MustVerifyEmail, Notifiable;
    use Encryptable;
    protected $fillable = ['name', 'email', 'password',];
    protected $hidden = ['password', 'remember_token',];
    protected $casts = [email_verified_at' => 'datetime',];
    public $encryptable = [email',];
}

我可以加密电子邮件地址。但是我无法登录并重置密码。用户可以在同一个电子邮件地址中创建多个帐户。这是一个非常糟糕的包。

帮我!!

标签: phplaravelencryption

解决方案


我假设您正在使用php artisan make:auth默认控制器。因此,您需要覆盖一些默认方法,以确保在 Laravel 尝试将电子邮件地址用于身份验证、注册或密码重置之前对其进行加密。

Login使用加密电子邮件将以下内容添加到您 的app\Http\Controllers\Auth\LoginController.php

/**
 * Validate the user login request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return void
 *
 * @throws \Illuminate\Validation\ValidationException
 */
protected function validateLogin(Request $request)
{
    $request->validate([
        $this->username() => 'required|string',
        'password' => 'required|string',
    ]);
    $request->input('email, Crypt::encrypt($request->email);
}

使用将Register加密以下内容的电子邮件发送到您的 app\Http\Controllers\Auth\RegisterController.php

/**
 * Handle a registration request for the application.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return \Illuminate\Http\Response
 */
public function register(Request $request)
{
    $request->merge([
        'email' => Crypt::encrypt($request->email),
        'raw_email' => $request->email,
    ]);

    parent::register($request);
}

// And change the validator method to this

protected function validator(array $data)
{
    return Validator::make($data, [
        'name' => ['required', 'string', 'max:255'],
        'email' => ['required', 'string', 'max:255', 'unique:users'], // remove the email validation as this field be encrypted before validation
        'raw_email' => ['required', 'string', 'email'], // the email still needs to be a valid email
        'password' => ['required', 'string', 'min:8', 'confirmed'],
    ],
    [
        'raw_email.required' => 'We need to know your e-mail address!',
        'raw_email.string' => 'We need to know your e-mail address!',
        'raw_email.email' => 'Please enter a valid e-mail address!',
    ]);
}

最后,要处理Reset Passwords 您需要将以下内容添加到您的app\Http\Controllers\Auth\ForgotPasswordController.php

/**
 * Validate the email for the given request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return void
 */
protected function validateEmail(Request $request)
{
    $request->validate(['email' => 'required|email']);
    $request->input('email', Crypt::encrypt($request->email));
}

我还没有测试过这些代码,但这应该会让你遥遥领先。


推荐阅读