php - usuario - Laravel 5 Cómo trabajar con autenticación en dos formularios de inicio de sesión diferentes con tablas diferentes
laravel roles y permisos (2)
Se puede hacer de la siguiente manera
En la app/Http/Controllers/Student
crea AuthCotroller
como a continuación. Este controlador manejará la autenticación del estudiante.
<?php namespace App/Http/Controllers/Student;
use App/Http/Requests;
use App/Http/Controllers/Auth/AuthController as MainAuthController;
use Illuminate/Http/Request;
class AuthController extends MainAuthController {
public $loginPath = ''/student/login'';
public $redirectPath = ''/student/dashboard'';
public $redirectAfterLogout = ''/student/login'';
/**
* Show the application login form.
*
* @return /Illuminate/Http/Response
*/
public function getLogin()
{
return view(''student.login'');
}
/**
* Log the user out of the application.
*
* @return /Illuminate/Http/Response
*/
public function getLogout()
{
$this->auth->logout();
return redirect(property_exists($this, ''redirectAfterLogout'') ? $this->redirectAfterLogout : ''/'');
}
/** This method overrides Trait method. So, We can redirect Different Users to different destinations
* Get the post register / login redirect path.
*
* @return string
*/
public function redirectPath()
{
if (property_exists($this, ''redirectPath''))
{
return $this->redirectPath;
}
return property_exists($this, ''redirectTo'') ? $this->redirectTo : ''/student/dashboard'';
}
}
Ahora crea el siguiente middleware,
<?php namespace App/Http/Middleware;
use Closure;
class ChangeUserToStudent
{
/**
* Handle an incoming request.
*
* @param /Illuminate/Http/Request $request
* @param /Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
/Config::set(''auth.table'', ''students'');
/Config::set(''auth.model'', ''App/DB/Student'');
/Config::set(''session.cookie'', ''student_session'');
/Config::set(''session.path'', ''/student/'');
return $next($request);
}
}
Ahora en la app/Http/kernel.php
registre el middleware anterior con otro middleware como se muestra a continuación,
/**
* The application''s route middleware.
*
* @var array
*/
protected $routeMiddleware = [
.....
''user.student'' => ''App/Http/Middleware/ChangeUserToStudent'',
.....
];
ahora en routes.php
crea el siguiente grupo de rutas con el middleware user.student
,
<?php
// Protected Routes by auth and acl middleware
Route::group([''prefix'' => ''student'', ''namespace'' => ''Student'', ''middleware'' => [''user.student'']], function () {
Route::get(''login'', [
''as'' => ''student.login'',
''uses'' => ''AuthController@getLogin''
]);
Route::get(''logout'', [
''as'' => ''student.logout'',
''uses'' => ''AuthController@getLogout''
]);
Route::post(''login'', ''AuthController@postLogin'');
});
//Other student routes accessed only after login
Route::group([''prefix'' => ''student'', ''namespace'' => ''Student'', ''middleware'' => [''user.student'',''auth'']], function () {
Route::get(''dashboard'', [
''as'' => ''student.dashboard'',
''uses'' => ''DashboardController@index''
]);
]);
Espero que ya haya creado una tabla de students
y modelos de students
que, en esencia, debería ser al menos igual que una tabla de users
. Ahora, mientras accede a la ruta con student
prefijo del student
, el middleware del student
user.student
y cambiará la tabla de autenticación a los students
y user.student
al Student
sobre la marcha. Incluso puede tener una sesión diferente para el student
como ya he mostrado.
En el directorio de view
puede colocar todas las vistas relacionadas con los student
directorio de student
. Supongo que tiene un formulario de inicio de sesión separado para el alumno que debe crear en view/student
directorio view/student
.
De esta manera, puede separar completamente student
sección de student
sección de users
. Espero que ayude.
Creé dos formularios de inicio de sesión diferentes con dos formularios de registro diferentes y dos tablas diferentes, en este momento puedo hacer lo siguiente
Login into table A(users)
Register into table A(users)
Register into table B(students)
Pero no puedo iniciar sesión en la tabla B, es como que se confunde en qué tabla iniciar sesión. Acabo de modificar la funcionalidad incorporada de autenticación.
Aquí está mi función de código para iniciar sesión en
public function postLoginl(Request $request)
{
$this->validate($request, [
''learnerCell''=> ''required'', ''password'' => ''required'',
]);
$credentials = $this->getCredentialsl($request);
if (Auth::attempt($credentials, $request->has(''remember''))) {
return redirect()->intended($this->redirectPath());
}
return redirect($this->loginPath())
->withInput($request->only(''learnerCell'', ''remember''))
->withErrors([
''learnerCell'' => $this->getFailedLoginMessage(),
]);
}
Cuando reviso config / auth.php hay un script
<?php
return [
''driver'' => ''eloquent'',
''model'' => App/User::class,
''table'' => ''users'',
''password'' => [
''email'' => ''emails.password'',
''table'' => ''password_resets'',
''expire'' => 60,
],
];
de lo que creo que es donde radica el problema, porque no tiene modelo para controlar el inicio de sesión, solo hace referencia a un modelo (Usuario) y tengo otro llamado (Estudiante).
Supongo que estás usando Laravel 5.1 . Avísame si no es cierto e intentaré ayudarte con otra versión también.
La forma más sencilla de hacerlo es almacenar usuarios en una sola tabla con un indicador de tipo adicional. Entiendo que desea tener 2 procesos de inicio de sesión diferentes y diferentes credenciales para ser utilizado para iniciar sesión. Una vez que tienes usuarios en la misma mesa, la forma de hacerlo es:
class UserController {
use AuthenticatesUsers;
//use email for authentication
public $username = ''email'';
protected function getCredentials(Request $request)
{
//allow only users with type=user
return array_merge($request->only(''email'', ''password''), [''type'' => ''user'']);
}
}
class LearnerController {
use AuthenticatesUsers;
//use phone for authentication
public $username = ''phone'';
protected function getCredentials(Request $request)
{
//allow only users with type=learner
return array_merge($request->only(''phone'', ''password''), [''type'' => ''learner'']);
}
}