Usemos Multi Auth [ Laravel 4 ]


En nuestro post anterior hablamos del paquete Multi Auth para laravel 4, en el mismo explicamos algo de la instalación y ahora vamos a crear un ejemplo de como usarlo.

Primeramente vamos a crear nuestro formulario o Login de acceso para usarlo en los dos casos de acceso, pero tendrán que crear uno para cada login.


<!Doctype html>
<html>
   <head>
      <meta charset="utf-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
      <title>Sign in</title>
      <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
      <!-- Open Sans font desde Google CDN -->
      <link href="http://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,400,600,700,300&subset=latin" rel="stylesheet" type="text/css">
      <!-- Bootstrap 3 -->
      <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css">
   </head>
   <body>
      <div class="container">
         <div class="col-md-4 col-md-offset-4" style="padding-top: 45px;">
         {{ Form::open(['class' => 'panel panel-default']) }}{{-- aqui usaran la ruta dependiendo de que usuario esten usando "'route'=>'login-admin-post o login-user-post'" --}}
            <div class="panel-heading">
               <h1 class="panel-title">Sign in to your Account</h1>
            </div>
            <div class="panel-body">
               <div class="form-group {{ $errors->has('username') ? 'has-error' : '' }}">
                  <input type="text" name="username" class="form-control" placeholder="Username" />
                  {{ $errors->first('username','<p class="help-block">:message</p>') }}
               </div>
               <div class="form-group {{ $errors->has('password') ? 'has-error' : '' }}">
                  <input type="password" name="password" class="form-control" placeholder="Password" />
                  {{ $errors->first('password','<p class="help-block">:message</p>') }}
               </div>
            </div>
            <div class="panel-footer">
               <input type="submit" class="btn btn-primary btn-block" value="Sign in"/>
            </div>
         {{ Form::close() }}
         @if(Session::has('error'))
            <div class="alert alert-danger">
               {{ Session::get('error') }}
            </div>
         @endif
         </div>
      </div>
      <!-- Get jQuery from Google CDN -->
      <!--[if !IE]> -->
      <script type="text/javascript"> window.jQuery || document.write('<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js">'+"<"+"/script>"); </script>
      <!-- <![endif]-->
      <!--[if lte IE 9]>
      <script type="text/javascript"> window.jQuery || document.write('<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js">'+"<"+"/script>"); </script>
      <![endif]-->
      <!-- BootstrapJS  -->
      <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/js/bootstrap.min.js"></script>
   </body>
</html>

Como sabemos la variable $errors es reservada de blade, si usamos el validador del front podremos compilar una respuesta que contendrá los errores que podría tener el formulario.

Ahora vamos a validar la información, en caso de tener errores el formulario no sera aceptado y en caso contrario vamos a validar la información del usuario a autenticarse y si esta es falsa retornamos un mensaje de error.
Para esto crearemos un controlador, en mi caso lo eh llamado AuthController.php y de la misma manera se va a llamar mi clase.


class AuthController extends BaseController
{
    public function loginUser()
    {
        return View::make('user.login');
    }
    
    public function authUser()
    {
        $credentials = Input::only('username', 'password');
        $rules = ['username' => 'required', 'password' => 'required'];
        $validator = Validator::make($credentials, $rules);
        if($validator->fails()){
            return Redirect::route('login-user')->withErrors($validator)->withInput(Input::only('username'));
        }
        $attempt = Auth::user()->attempt($credentials,false);
        if(!$attempt){
            return Redirect::route('login-user')->with('error','Las credenciales proporcionadas no son correctas!');
        }
        return Redirect::intended('admsis/dashboard');
    }
    
    public function loginAdmin()
    {
        return View::make('admin.login');
    }

    public function authAdmin()
    {
        $credentials = Input::only('username', 'password');
        $rules = ['username' => 'required', 'password' => 'required'];
        $validator = Validator::make($credentials, $rules);
        if($validator->fails()){
            return Redirect::route('login-admin')->withErrors($validator)->withInput(Input::only('username'));
        }
        $attempt = Auth::admin()->attempt($credentials,false);
        if(!$attempt){
            return Redirect::route('login-admin')->with('error','Las credenciales proporcionadas no son correctas!');
        }
        return Redirect::intended('admsis/dashboard');
    }
    

} 

Creamos 4 funciones loginUser, authUser, loginAdmin y authUser, como observan en las funciones authUser y authAdmin utilizamos la librería Multiauth dependiendo del array que definimos en la configuración de autentificación, en mi caso mi array es este:



return array(

    'multi'=>[
        'user' => [
            'driver' => 'eloquent',
            'model' => 'User'
        ],
        'admin' => [
            'driver' => 'eloquent',
            'model' => 'Administrators'
        ]
    ],
    'reminder' => array(
        'email' => 'emails.auth.reminder',
        'table' => 'password_reminders',
        'expire' => 60,
    ),

);

ahora vamos a crear nuestras rutas.


Route::group(['prefix' => 'user'], function () {
    
    Route::get('login', ['as' => 'login-user', 'uses' => 'AuthController@loginAdmin']);

    Route::post('login', ['as' => 'login-user-post', 'uses' => 'AuthController@authAdmin'])->before('csrf');

    Route::get('dashboard', ['as' => 'dashboard-user', 'uses' => 'UserController@dashboard']);
    
});

Route::group(['prefix' => 'admsis'], function () {

    Route::get('login', ['as' => 'login-admin', 'uses' => 'AuthController@loginAdmin']);

    Route::post('login', ['as' => 'login-admin-post', 'uses' => 'AuthController@authAdmin'])->before('csrf');

    Route::get('dashboard', ['as' => 'dashboard-admin', 'uses' => 'AdminController@dashboard']);

});

Route::whenRegex('/^admsis(\/(?!login)\S+)?$/', 'auth:admsis');
Route::whenRegex('/^user(\/(?!login)\S+)?$/', 'auth:user');

De esta manera mapeamos nuestras rutas para poder tener 2 login's usando nuestra librería Multi Auth, con algo de suerte tendremos un formulario como este:


Saludos y hasta la próxima :D

0 comentarios: