php - 在拉拉维尔。如何加密用户表中的电子邮件地址
问题描述
我想加密用户表中的电子邮件地址以保护个人信息。我尝试这种方式: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',];
}
我可以加密电子邮件地址。但是我无法登录并重置密码。用户可以在同一个电子邮件地址中创建多个帐户。这是一个非常糟糕的包。
帮我!!
解决方案
我假设您正在使用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));
}
我还没有测试过这些代码,但这应该会让你遥遥领先。
推荐阅读
- plugins - Flutter 中的权限插件
- javascript - 从 Google Apps 脚本向使用 Google 登录的网站发送 HTTP 请求
- android - SplashScreen Freezed 不会带我参加其他活动
- c - 这个 for 循环是如何工作的?
- asp.net-core - Automapper ConstructUsing 未按预期工作
- python - 如何修复 django-python 中的这个 datetime iso 格式错误,这是我将 python 升级到 3.7 后发生的
- django - 如何在 django 中使用序列化程序保存模型实例?
- php - 如何使图片等内容只在我们的网站上显示?
- c# - Xamarin HttpClient 卡住并且不返回控制权
- flutter - 使用不同名称的 setState 变量