A Laravel package that automatically masks sensitive model attributes on retrieval. Supports email, phone, and text masking with highly configurable rules.
- Automatic attribute masking on retrieval
- Email, phone, and text masking support
- Configurable mask character and visibility
- Global or per-attribute masking rules
- Auto-detection of phone fields by column name
composer require irabbi360/laravel-attribute-maskPublish the config file:
php artisan vendor:publish --tag="attribute-mask-config"The default configuration (config/attribute-mask.php):
return [
'enabled' => true,
'mask_char' => '*',
'email_masking' => [
'show_domain' => true,
'show_start' => 1,
'show_end' => 1,
],
'phone_masking' => [
'show_start' => 3,
'show_end' => 2,
'patterns' => ['phone', 'phone_number', 'mobile', 'mobile_number', ...],
],
'text_masking' => [
'show_start' => 3,
'show_end' => 3,
],
];Add the HasMaskedAttributes trait and define maskable attributes using the maskables() method:
use Irabbi360\LaravelAttributeMask\Concern\HasMaskedAttributes;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
use HasMaskedAttributes;
/**
* Get the attributes that should be masked.
*/
protected function maskables(): array
{
return ['email', 'phone', 'phone_number', 'ssn'];
}
}Alternatively, use the $maskable property:
class User extends Model
{
use HasMaskedAttributes;
protected array $maskable = ['email', 'phone', 'ssn'];
}Attributes are automatically masked on retrieval:
$user = User::find(1);
$user->email; // t**t@example.com
$user->phone; // 123****90
$user->ssn; // 123***789Get the unmasked value using getOriginal():
$user->getOriginal('email'); // test@example.comOr temporarily disable masking:
config(['attribute-mask.enabled' => false]);
$original = $user->email;
config(['attribute-mask.enabled' => true]);Configure email masking behavior:
'email_masking' => [
'show_domain' => true, // Show domain part
'show_start' => 2, // Show first 2 characters
'show_end' => 2, // Show last 2 characters
],Examples:
test@example.com→te**t@example.comjohn.doe@example.com→jo**oe@example.com
Phone fields are auto-detected by column name. Configure visibility:
'phone_masking' => [
'show_start' => 3,
'show_end' => 2,
],Examples:
1234567890→123****90+1-555-123-4567→+15-***-67
Add custom phone patterns:
'phone_masking' => [
'patterns' => ['phone', 'mobile', 'whatsapp', 'fax'],
],For other text attributes:
'text_masking' => [
'show_start' => 3,
'show_end' => 3,
],Examples:
secretpassword→sec********rdAPI_KEY_12345→API***345
Change the mask character globally:
'mask_char' => '#',
// Result: test@example.com → t##t@example.comDisable globally:
'enabled' => false,Or temporarily:
config(['attribute-mask.enabled' => false]);
$user->email; // Returns unmasked valuecomposer testSee CHANGELOG.md for details on updates.
See CONTRIBUTING.md for contribution guidelines.
Report security vulnerabilities via Security Policy.
The MIT License. See LICENSE.md for details.