use jacknoordhuis\database\hashing\traits\HasHashedAttributes;
class User extends Model
{
use HasHashedAttributes;
/**
* The attributes that should be hashed when set.
*
* @var array
*/
protected $hashing = [
'username_lookup',
];
}
$user->username_lookup = $request->get('username'); //the username_lookup attribute will be automatically hashed
//when our user tries to login we just search the database for the hashed value of their username
$user = User::where('username_lookup', DatabaseHashing::create($request->get("username"))->first();
//with a salt modifier so we can only ever re-create the hash when the user provides their email or we could store an
//encrypted copy ourselves with another package
$user->username_lookup = $request->get('username'); //set the attribute, then hash manually because we use a modifier
$user->hashAttribute('username_lookup', $request->get('username')); //this time add the plain text email as a salt modifier
//when a user provides their email when logging in, we can replicate the hash and search for the user in the database.
$user = User::where('username_lookup', DatabaseHashing::create($request->get("username"), $request->get("email")))->first();
//hash with only application salt
$hashedEmail = DatabaseHashing::create(Input::get('email'));
//hash with application salt AND salt modifier
$hashedEmail = DatabaseHashing::create(Input::get("email"), Input::get('password'));
class User extends Authenticatable
{
use Notifiable, HasEncryptedAttributes, HasHashedAttributes {
HasEncryptedAttributes::setAttribute as setEncryptedAttribute;
HasHashedAttributes::setAttribute as setHashedAttribute;
}
protected $fillable = [
'name', 'email', 'email_lookup', 'password',
];
protected $hidden = [
'password', 'remember_token',
];
protected $encrypted = [
'name', 'email',
];
protected $hashing = [
'email_lookup',
];
/**
* Overwrite the method so we can attempt to encrypt OR hash an
* attribute without the traits colliding.
*
* @param string $key
* @param mixed $value
*/
public function setAttribute($key, $value)
{
$this->setEncryptedAttribute($key, $value); //attempt to encrypt the attribute
$current = $this->attributes[$key] ?? null; //fetch the current value of the attribute
if($current === $value) { //check to make sure the attribute wasn't modified (we will never hash an encrypted attribute)
$this->setHashedAttribute($key, $value); //attempt to hash the attribute
}
}
}