Skip to content

Instantly share code, notes, and snippets.

@joynal
Created February 28, 2016 17:14
Show Gist options
  • Save joynal/7e61815b184b5c4fcabc to your computer and use it in GitHub Desktop.
Save joynal/7e61815b184b5c4fcabc to your computer and use it in GitHub Desktop.
Multiuser login system
<?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;
}
}
<?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