⬆️ Menú principal ⬅️ Anterior (Collections) ➡️ Siguiente(Mail)
- Check Multiple Permissions at Once
- Authenticate users with more options
- More Events on User Registration
- Did you know about Auth::once()?
- Change API Token on users password update
- Override Permissions for Super Admin
En complemento a la directiva @can
¿Sabías que puedes checar multiples permisos en una sola linea de código con la directiva @canany
?
@canany(['update', 'view', 'delete'], $post)
// El actual usuario puede actualizar, mirar o borrar el post
@elsecanany(['create'], \App\Post::class)
// EL actual usuario puede crear un post
@endcanany
Si solo quieres autenticar usuarios cumplan con cierta condición, porejemplo que en la columna "activated_at" no sea nulo, es tan simple como pasar un argumento extra a Auth::attempt()
.
No se necesitan middleware complejos o scopes globales.
Auth::attempt(
[
...$request->only('email', 'password'),
fn ($query) => $query->whereNotNull('activated_at')
],
$this->boolean('remember')
);
⭐Aportación de @LukeDowning19
¿Necesitas realizar algunas acciones depués de la registración de un usuario? Dale un vistazo a app/Providers/EventServiceProvider.php
y añade mas clases Listeners para despues en esas clases implementar el método handle()
con el objeto $event->user
class EventServiceProvider extends ServiceProvider
{
protected $listen = [
Registered::class => [
SendEmailVerificationNotification::class,
// You can add any Listener class here
// With handle() method inside of that class
],
];
Puedes logear cualquier usuario solo para UNA PETICION, usando el método Auth::once()
. No hay necesidad de usar sessions o cookies lo cual significa que este método puede ser utíl cuando construimos una stateless API
if (Auth::once($credentials)) {
//
}
Es conveniente cambiar el API token del usuario cuando su contraseña cambia.
En el modelo definimos:
protected function password(): Attribute
{
return Attribute::make(
set: function ($value, $attributes) {
$value = $value;
$attributes['api_token'] = Str::random(100);
}
);
}
Si has definido tus puertas de acceso (Gates) pero quieres sobreescribir todos los permisos para el usuario SUPER ADMIN, para darle a ese superadministrador TODOS los permisos, puedes interceptar las puertas de acceso utilizando la declaración Gate::before()
en el archivo AuthServiceProvider.php
.
// Interceptar cualquier Gate y checar si es super admin
Gate::before(function(user, ability) {
if (user->is_super_admin == 1) {
return true;
}
});
// O si solo quiere algunos permisos del paquete
Gate::before(function(user, ability) {
if (user->hasPermission('root')) {
return true;
}
});
Si deseas hacer algo en tu puerta de acceso (Gate) cuando no hay ningún usuario en absoluto, debes agregar un tipo de indicación (type hint
) para $user
permitiendo que sea null
. Por ejemplo, si tienes un rol llamado "Anonymous" para tus usuarios no autenticados:
Gate::before(function (?User $user, $ability) {
if ($user === null) {
$role = Role::findByName('Anonymous');
return $role->hasPermissionTo($ability) ? true : null;
}
return $user->hasRole('Super Admin') ? true : null;
});