Tengo dos tablas con usuarios, una para usuarios públicos y otra para trabajadores. Los trabajadores solo pueden ser creados por otros trabajadores, pero cuando voy a la url de registro de trabajadores, detecta que estoy conectado y me redirige a casa, ¿cómo puedo cambiar este comportamiento?

He intentado comentar parte de la función de control en el archivo RedirectIfAuthenticated.php, pero esto hace que los usuarios puedan visitar los enlaces de inicio de sesión mientras están conectados.

Función que comenté en RedirectIfAuthenticated.php:

public function handle(Request $request, Closure $next, ...$guards)
{
    $guards = empty($guards) ? [null] : $guards;

    // foreach ($guards as $guard) {
    //     if (Auth::guard($guard)->check()) {
    //         return redirect(RouteServiceProvider::HOME);
    //     }
    // }

    return $next($request);
}
1
Jorge Montejo 21 ene. 2021 a las 23:53

1 respuesta

La mejor respuesta

En su tabla users, defina un campo que le permitirá diferenciar entre types de usuario.

$table->string('type')->default('public');

Definí un campo de data type string y le di al campo un valor predeterminado de public. Hay otras formas de hacer esto, como hacer data type un integer y usar una tabla de búsqueda, pero mantengamos las cosas simples por ahora y, para ser honestos, realmente no importa.

El type será entonces accesible en sus objetos user; $user->type.

Para obtener el type para el user actualmente autenticado, usaría auth()->user()->type o Auth::user()->type (no importa cuál, el mismo resultado).

Según el valor de type, permitiría o negaría el acceso a algo. En su caso, desea impedir que los usuarios que no sean de type worker creen usuarios de type worker.

No reutilice el formulario register para crear nuevos usuarios, cree usted mismo un nuevo andamio (ruta, controlador, vista, etc.) para esta tarea. Un ejemplo básico de cómo podría verse a continuación.

rutas / web.php

Route::group(['prefix' => 'admin', 'as' => 'admin.'], function () {
    Route::resource('users', \App\Http\Controllers\UserController::class);
});

recursos / vistas / usuarios / create.blade.php

@if ($errors->any())
    @foreach ($errors->all() as $error)
        {{ $error }}
    @endforeach
@endif

<form action="{{ route('admin.users.store') }}" method="post">
    @csrf

    {{--
        If the authenticated user is of type public
        you can choose to either hide the option for choosing a user type
    --}}

    @if (auth()->user()->type != 'public')
    <select name="type" id="type">
        <option value="public">Public</option>
        <option value="worker">Worker</option>
    </select>
    @endif

    {{--
        Or you can simply disable it
    --}}

    <select name="type" id="type" @if (auth()->user()->type == 'public') disabled @endif>
        <option value="public">Public</option>
        <option value="worker">Worker</option>
    </select>

</form>

aplicación / Http / Controllers / UserController.php

class UserController extends Controller
{
    public function __construct()
    {
        $this->middleware(['auth']);
    }

    public function create()
    {
        return view('users.create');
    }

    public function store(Request $request)
    {
        // perform some validation on the data coming in
        // the value of the type field should be either public or worker
        // other values should cause an error

        $validator = Validator::make($request->all(), [
            'type' => ['in:public,worker']
        ]);

        // an additional check to prevent non workers creating worker users
        // this could be extracted to a custom validation rule

        if (auth()->user()->type != 'worker' && $request->type == 'worker') {
            return redirect(route('admin.users.create')
                ->withErrors([
                    'unauthorised' => 
                        'You do not have authorisation to create users of type Worker'
                )]
                ->withInput();
        }

        // Don't forget to add 'type' to the $fillable array on your user model

        User::create($validator->validated());

        return redirect(route('users.admin.create')->with(['success' => 'User created!')];
    }
}

Lo anterior es una implementación muy básica que le indicará la dirección correcta. Puede extraer la funcionalidad para verificar si un user es un worker en un middleware, crea gates y custom validation rules para hacer las cosas más reutilizables .

1
Unflux 22 ene. 2021 a las 10:41