Created
February 28, 2016 17:14
-
-
Save joynal/7e61815b184b5c4fcabc to your computer and use it in GitHub Desktop.
Multiuser login system
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace App\Http\Controllers\Auth; | |
use Auth; | |
use Redirect; | |
use Validator; | |
use App\Models\User; | |
use App\Models\Role; | |
use App\Models\Level; | |
use App\Models\Registration; | |
use Illuminate\Http\Request; | |
use App\Http\Controllers\Controller; | |
use Illuminate\Foundation\Auth\ThrottlesLogins; | |
use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers; | |
class AuthController extends Controller | |
{ | |
use AuthenticatesAndRegistersUsers, ThrottlesLogins; | |
/** | |
* After Registration message | |
* @var string | |
*/ | |
protected $registrationMessage = 'Successfully you registered'; | |
/** | |
* Where to redirect users after login / registration. | |
* | |
* @var string | |
*/ | |
protected $redirectTo = '/'; | |
/** | |
* Admin redirect path | |
* | |
* @var string | |
*/ | |
protected $adminRedirectTo = 'admin'; | |
/** | |
* Faculty redirect path | |
* | |
* @var string | |
*/ | |
protected $facultyRedirectTo = 'faculty'; | |
/** | |
* Student redirect path | |
* | |
* @var string | |
*/ | |
protected $studentRedirectTo = 'student'; | |
/** | |
* Create a new authentication controller instance. | |
* | |
* @return void | |
*/ | |
public function __construct() | |
{ | |
$this->middleware('guest', ['except' => 'logout']); | |
} | |
/** | |
* Get a validator for an incoming registration request. | |
* student users | |
* | |
* @param array $data | |
* @return \Illuminate\Contracts\Validation\Validator | |
*/ | |
protected function studentValidator(array $data) | |
{ | |
return Validator::make($data, [ | |
'uid' => 'required|unique:users', | |
'first_name' => 'required|max:30', | |
'last_name' => 'required|max:30', | |
'email' => 'required|email|max:255|unique:users', | |
'batch' => 'required', | |
'birth_date' => 'required', | |
'gender' => 'required', | |
'image' => 'required|mimes:png,jpg,jpeg', | |
'password' => 'required|confirmed|min:5', | |
]); | |
} | |
/** | |
* Validation for faculty users. | |
* | |
* @param array $data | |
* @return \Illuminate\Contracts\Validation\Validator | |
*/ | |
public function facultyValidator(array $data) | |
{ | |
return Validator::make($data, [ | |
'uid' => 'required|unique:users', | |
'first_name' => 'required|max:30', | |
'last_name' => 'required|max:30', | |
'email' => 'required|email|max:255|unique:users', | |
'joining_date' => 'required', | |
'designation' => 'required', | |
'gender' => 'required', | |
'image' => 'required|mimes:png,jpg,jpeg', | |
'password' => 'required|confirmed|min:5', | |
]); | |
} | |
/** | |
* Create user | |
* | |
* @param array $data | |
* @return user model instance | |
*/ | |
protected function createUser(array $data) | |
{ | |
$user = User::create([ | |
'uid' => $data['uid'], | |
'type' => $data['type'], | |
'first_name' => $data['first_name'], | |
'last_name' => $data['last_name'], | |
'gender' => $data['gender'], | |
'email' => $data['email'], | |
'image' => $data['img'], | |
'password' => bcrypt($data['password']), | |
]); | |
return $user; | |
} | |
/** | |
* Create a new user instance after a valid registration. | |
* Student user | |
* @param array $data | |
* @return User | |
*/ | |
protected function createStudent(array $data) | |
{ | |
$user = $this->createUser($data); | |
Student::create([ | |
'id' => $user->id, | |
'batch' => $data['batch'], | |
'section' => $data['section'], | |
'program' => $data['program'], | |
'reg_id' => $data['reg_id'], | |
'birth_date' => $data['birth_date'], | |
'admission_date' => $data['admission_date'], | |
'level_id' => $data['level_id'], | |
'user_id' => $user->id | |
]); | |
Registration::where('uu_id', '=', $data['uid'])->delete(); | |
return $user; | |
} | |
/** | |
* Create new instance for faculty users. | |
* | |
* @param array $data | |
* @return mixed | |
*/ | |
public function createFaculty(array $data) | |
{ | |
$user = $this->createUser($data); | |
Faculty::create([ | |
'id' => $user->id, | |
'joining_date' => $data['joining_date'], | |
'designation' => $data['designation'], | |
'user_id' => $user->id | |
]); | |
Registration::where('uu_id', '=', $data['uid'])->delete(); | |
return $user; | |
} | |
/** | |
* Show login from | |
* | |
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View | |
*/ | |
public function getLogin() | |
{ | |
return view('auth.login'); | |
} | |
public function postLogin(Request $request) | |
{ | |
$this->validate($request, [ | |
'log' => 'required', 'password' => 'required', | |
]); | |
$logValue = $request->get('log'); | |
$logAccess = filter_var($logValue, FILTER_VALIDATE_EMAIL) ? 'email' : 'uid'; | |
$credentials = [ | |
$logAccess => $logValue, | |
'password' => $request->get('password') | |
]; | |
$throttles = $this->isUsingThrottlesLoginsTrait(); | |
if ($throttles && $this->hasTooManyLoginAttempts($request)) { | |
return $this->sendLockoutResponse($request); | |
} | |
if (Auth::guard($this->getGuard())->attempt($credentials, $request->has('remember'))) { | |
return $this->handleUserWasAuthenticated($request, $throttles); | |
} | |
if ($throttles) { | |
$this->incrementLoginAttempts($request); | |
} | |
return $this->sendFailedLoginResponse($request); | |
} | |
/** | |
* Show registration from | |
* | |
* @param $confirmation | |
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View | |
*/ | |
public function getRegister($confirmation) | |
{ | |
$registration = Registration::whereConfirmation($confirmation)->firstOrFail(); | |
return view('auth.register', compact('registration')); | |
} | |
/** | |
* Register a user | |
* | |
* @param Request $request | |
* @param $confirmation | |
* @return mixed | |
*/ | |
public function postRegister(Request $request, $confirmation) | |
{ | |
$registration = Registration::whereConfirmation($confirmation)->firstOrFail(); | |
if ($registration->type === "student") | |
{ | |
$request['uid'] = $registration->uu_id; | |
$validator = $this->studentValidator($request->all()); | |
$this->validateData($request, $validator); | |
$request['img'] = $this->saveImage($request->file('image')); | |
$request['type'] = $registration->type; | |
$request['program'] = $registration->program; | |
$request['level_id'] = $this->firstOrCreateLevel($request->get('batch'), $request->get('section')); | |
$request['role_id'] = $this->firstOrCreateUserRole(); | |
Auth::login($this->createStudent($request->all())); | |
return redirect() | |
->route('student') | |
->with('message', $this->registrationMessage); | |
} else | |
{ | |
$request['uid'] = $registration->uu_id; | |
$validator = $this->facultyValidator($request->all()); | |
$this->validateData($request, $validator); | |
$request['img'] = $this->saveImage($request->file('image')); | |
$request['type'] = $registration->type; | |
$request['role_id'] = $this->firstOrCreateUserRole(); | |
Auth::login($this->createFaculty($request->all())); | |
return redirect() | |
->route('faculty') | |
->with('message', $this->registrationMessage); | |
} | |
return Redirect::route($this->redirectTo); | |
} | |
/** | |
* Send the response after the user was authenticated. | |
* | |
* @param \Illuminate\Http\Request $request | |
* @param bool $throttles | |
* @return \Illuminate\Http\Response | |
*/ | |
protected function handleUserWasAuthenticated(Request $request, $throttles) | |
{ | |
if ($throttles) { | |
$this->clearLoginAttempts($request); | |
} | |
if (method_exists($this, 'authenticated')) { | |
return $this->authenticated($request, Auth::user()); | |
} | |
return redirect()->intended($this->redirectPath()); | |
} | |
/** | |
* Redirecting user to right login path | |
* | |
* @param Request $request | |
* @param $user | |
* @return mixed | |
*/ | |
protected function authenticated(Request $request, $user) | |
{ | |
if($request->session()->has('user_id')){ | |
$request->session()->forget('user_id'); | |
$request->session()->put('user_id', $user->id); | |
} | |
if($user->type === 'super' || $user->type === 'admin') | |
{ | |
return redirect()->intended($this->adminRedirectTo); | |
} | |
if($user->type === 'student') | |
{ | |
return redirect()->intended($this->studentRedirectTo); | |
} | |
if($user->type === 'faculty') | |
{ | |
return redirect()->intended($this->facultyRedirectTo); | |
} | |
} | |
/** | |
* Get the throttle key for the given request. | |
* | |
* @param \Illuminate\Http\Request $request | |
* @return string | |
*/ | |
protected function getThrottleKey(Request $request) | |
{ | |
return mb_strtolower($request->input('log')).'|'.$request->ip(); | |
} | |
/** | |
* Redirect the user after determining they are locked out. | |
* | |
* @param \Illuminate\Http\Request $request | |
* @return \Illuminate\Http\RedirectResponse | |
*/ | |
protected function sendLockoutResponse(Request $request) | |
{ | |
$seconds = app(RateLimiter::class)->availableIn( | |
$this->getThrottleKey($request) | |
); | |
return redirect()->back() | |
->withInput($request->only('log', 'remember')) | |
->withErrors([ | |
'log' => 'Too many login attempts. Please try again in '.$seconds.' seconds.', | |
]); | |
} | |
/** | |
* Send failed login response | |
* | |
* @param Request $request | |
* @return mixed | |
*/ | |
protected function sendFailedLoginResponse(Request $request) | |
{ | |
return redirect()->back() | |
->withInput($request->only('log', 'remember')) | |
->withErrors([ | |
'log' => 'These credentials do not match our records.' | |
]); | |
} | |
/** | |
* Throw the failed validation exception. | |
* | |
* @param \Illuminate\Http\Request $request | |
* @param \Illuminate\Contracts\Validation\Validator $validator | |
* @return void | |
* | |
* @throws \Illuminate\Foundation\Validation\ValidationException | |
*/ | |
protected function validateData(Request $request, $validator) | |
{ | |
if ($validator->fails()) | |
{ | |
$this->throwValidationException( | |
$request, $validator | |
); | |
} | |
} | |
/** | |
* First or create a user role | |
* | |
* @return int | |
*/ | |
protected function firstOrCreateUserRole() | |
{ | |
return Role::firstOrCreate(['title' => 'user'])->id; | |
} | |
/** | |
* First or create the level_id for batch, section. | |
* | |
* @param $batch | |
* @param $section | |
* @return int | |
*/ | |
protected function firstOrCreateLevel($batch, $section) | |
{ | |
$level = Level::whereBatch($batch)->whereSection($section)->first(); | |
if (!$level) | |
{ | |
$level = new Level; | |
$level->batch = $batch; | |
$level->section = $section; | |
$level->save(); | |
} | |
return $level->id; | |
} | |
/** | |
* Save image into image folder, return image name | |
* | |
* @param $image | |
* @return string | |
*/ | |
protected function saveImage($image) | |
{ | |
$extension = $image->getClientOriginalExtension(); | |
$imageName = str_random(20) . '.' . $extension; | |
$image->move(base_path() . '/public/fileStorage/image/', $imageName); | |
return $imageName; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
Route::group(['middleware' => 'web'], function () { | |
// Authentication Routes... | |
Route::get('login', 'Auth\AuthController@getLogin'); | |
Route::post('login', 'Auth\AuthController@postLogin'); | |
Route::get('logout', 'Auth\AuthController@getLogout'); | |
// Registration Routes... | |
Route::get('register/{confirmation}', 'Auth\AuthController@getRegister'); | |
Route::post('register/{confirmation}', 'Auth\AuthController@postRegister'); | |
// Password Reset Routes... | |
Route::get('password/reset/{token?}', 'Auth\PasswordController@showResetForm'); | |
Route::post('password/email', 'Auth\PasswordController@sendResetLinkEmail'); | |
Route::post('password/reset', 'Auth\PasswordController@reset'); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment