How To Get data From Request Login Form Laravel - authentication

I have a problem, i need get data request from other field on login form to dashboard.
Login Form
enter image description here
My Login Controller, and i use default auth from laravel
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
class LoginController extends Controller
{
/*
|--------------------------------------------------------------------------
| Login Controller
|--------------------------------------------------------------------------
|
| This controller handles authenticating users for the application and
| redirecting them to your home screen. The controller uses a trait
| to conveniently provide its functionality to your applications.
|
*/
use AuthenticatesUsers;
/**
* Where to redirect users after login.
*
* #var string
*/
protected $redirectTo = '/home';
public function username(){
return 'username';
}
/**
* Create a new controller instance.
*
* #return void
*/
public function __construct()
{
$this->middleware('guest')->except('logout');
}
}
My AuthentictesUser
<?php
namespace Illuminate\Foundation\Auth;
use Illuminate\Http\Request;
use App\Tahun;
use Illuminate\Support\Facades\Auth;
use Illuminate\Validation\ValidationException;
trait AuthenticatesUsers
{
use RedirectsUsers, ThrottlesLogins;
public function showLoginForm()
{
$tahuns = \DB::table('tahuns')->where('active','<>', '2')
->orderBy('id','desc')->get();
return view('auth.login', compact('tahuns'));
}
public function login(Request $request)
{
$this->validateLogin($request);
if ($this->hasTooManyLoginAttempts($request)) {
$this->fireLockoutEvent($request);
return $this->sendLockoutResponse($request);
}
if ($this->attemptLogin($request)) {
return $this->sendLoginResponse($request);
}
$this->incrementLoginAttempts($request);
return $this->sendFailedLoginResponse($request);
}
protected function validateLogin(Request $request)
{
$this->validate($request, [
$this->username() => 'required|string',
'password' => 'required|string',
'tahun' => 'required|string',
]);
}
protected function attemptLogin(Request $request)
{
return $this->guard()->attempt(
$this->credentials($request), $request->filled('remember')
);
}
protected function credentials(Request $request)
{
return $request->only($this->username(), 'password');
}
protected function sendLoginResponse(Request $request)
{
$request->session()->regenerate();
$this->clearLoginAttempts($request);
return $this->authenticated($request, $this->guard()->user())
?: redirect()->intended($this->redirectPath());
}
protected function authenticated(Request $request, $user)
{
//
}
protected function sendFailedLoginResponse(Request $request)
{
throw ValidationException::withMessages([
$this->username() => [trans('auth.failed')],
]);
}
public function username()
{
return 'email';
}
public function logout(Request $request)
{
$this->guard()->logout();
$request->session()->invalidate();
return redirect('/');
}
protected function guard()
{
return Auth::guard();
}
}
How if i use data from fill tahun(year) on login form?
And i need send data from login form to my dashboard.

There is no need to replace the trait since you can simply override the trait methods in your LoginController, just like you did with username().
Override public function showLoginForm() and return your custom view.
Override protected function validateLogin(Request $request) to validate your new fields.
Finally, override protected function authenticated(Request $request, $user) and save the tahun data or return a redirect response.

Related

How to use $this->release() method in laravel Notification ShouldQueue

I use laravel notification class for sending emails. Normaly for retring failed jobs in Job Class I can use $this->release() method. Do you have any idea how I can use this method in my notification class as well?
class OrderConfirmationNotification extends Notification implements ShouldQueue
{
use Queueable;
public $pdfAttachment;
public $determineSenderEmail;
public $mailData;
public $tries = 3;
public function __construct(array $mailData)
{
$this->mailData = $mailData;
$this->determineSenderEmail = $this->mailData['sender_email'];
}
/** #return string[] */
public function via(): array
{
return ['mail'];
}
/** #return MailMessage */
public function toMail(): MailMessage
{
return (new MailMessage)
->markdown($this->mailData['mail_template'], ['logoImage' => $this->mailData['company_logo']])
->from($this->determineSenderEmail['email'], $this->determineSenderEmail['name'])
->replyTo($this->determineSenderEmail['reply_to'], $this->determineSenderEmail['reply_name'])
->bcc($this->mailData['bcc_email']);
}
public function failed(Exception $exception)
{
Log::channel('xml_parse')->warning(sprintf('Order Confirmation notification failed'));
}
}

how to get all data from 4 relation table in laravel 5.5

I am new on laravel and I was stuck at this problem, where I can't get all data from relation table,
This my ERD :
This my Krs.php model :
protected $fillable = ['nim','nip','kode_mk','absen','uts','uas'];
protected $table = 'krs';
public function mahasiswa(){
return $this->hasMany('App\Mahasiswa');
}
public function dosen(){
return $this->hasMany('App\Dosen');
}
public function makul(){
return $this->hasMany('App\Matakuliah');
}
This my Matakuliah.php model :
protected $fillable = ['kode_mk','makul','sks'];
protected $table = 'mata_kuliah';
public function krs(){
return $this->belongsTo('\App\Krs');
}
This my Dosen.php model :
protected $fillable =['nip','nama','jeniskelamin','alamat','notlp'];
protected $table='dosen';
public function krs(){
return $this->belongsTo('App\Krs');
}
This my Mahasiswa.php model :
protected $fillable = ['nim','nama','alamat','jenis_kelamin','no_tlp','email','tempat','tanggal','link','id_jurusan'];
protected $table = 'mahasiswa';
public function jurusan(){
return $this->hasOne('App\Jurusan');
}
public function krs(){
return $this->belongsTo('App\Krs');
}
and here is my KrsController.php :
public function index()
{
$data = Krs::with(['mahasiswa','dosen','makul'])->first()->toArray();
return view('Krs.krsIndex',compact('data'));
}
how to get all data from all table? for example I want get nama from mahasiswa ? I don't know how to do it...I was try and searching from last night but still not change anything.. sorry for my bad grammar.thanks before
Edit 1
cannot get data from mata_kuliah table
this my blade syntax for print the data
{{ $data['makul'] }}
Using with() function :
$client_profile = Client::where([['cid', '=', $cid], ['is_delete', '=', 0]])->with(['status', 'group_no', 'caseworker', 'clerk', 'active_attendants'])->first()->toArray();
below is my model :
class Client extends Model {
public function status() {
return $this->hasOne('App\Models\Status', 'sid', 'status');
}
public function group_no() {
return $this->hasOne('App\Models\ClientGroups', 'cgid', 'group_no');
}
public function caseworker() {
return $this->hasOne('App\Models\Caseworker', 'cwid', 'caseworker_name');
}
public function clerk() {
return $this->hasOne('App\Models\Supervisorsnurses', 'snid', 'clerk');
}
public function active_attendants() {
return $this->hasMany('App\Models\AssociatedTask', 'cid');
}
public function location() {
return $this->hasOne('App\Models\Locations', 'lid', 'location');
}
}

Yii2 Login from DB (Setting unknown property: app\models\User::password_hash)

I want the user authentication in Yii to be based on user table in my database. This is my User model:
<?php
namespace app\models;
use Yii;
use yii\base\NotSupportedException;
use yii\db\ActiveRecord;
use yii\helpers\Security;
use yii\web\IdentityInterface;
/**
* This is the model class for table "user".
*
* #property integer $id
* #property string $username
* #property string $password
* #property string $title
*/
class User extends \yii\db\ActiveRecord implements IdentityInterface
{
public static function tableName()
{
return 'user';
}
/**
* #inheritdoc
*/
public function rules()
{
return [
[['username', 'password'], 'required'],
[['username', 'password'], 'string', 'max' => 100]
];
}
/**
* #inheritdoc
*/
public function attributeLabels()
{
return [
'id' => 'UserID',
'username' => 'Username',
'password' => 'Password',
];
}
public static function findIdentity($id) {
return static::findOne($id);
}
public static function findIdentityByAccessToken($token, $type = null) {
return static::findOne(['access_token' => $token]);
}
public static function findByUsername ($username){
return static::findOne(['username' => $username]);
}
public static function findbyPasswordResetToken($token)
{
$expire= \Yii::$app->params['user.passwordResetTokenExpire'];
$parts = explode('_', $token);
$timestamp = (int) end($parts);
if ($timestamp + $expire < time()) {
//token expired
return null;
}
return static::findOne(['password_reset_token' => $token ]);
}
public function getId() {
return $this->getPrimaryKey();
}
public function getAuthKey() {
return $this->auth_key;
}
public function validateAuthKey($authKey) {
return $this->getAuthKey() === $authKey;
}
public function validatePassword($password){
$this->password_hash= Yii::$app->security->generatePasswordHash ($password);
}
public function generateAuthKey()
{
$this->auth_key = Yii::$app->security->generateRandomKey();
}
/**
* Generates new password reset token
*/
public function generatePasswordResetToken()
{
$this->password_reset_token = Yii::$app->security->generateRandomKey() . '_' . time();
}
/**
* Removes password reset token
*/
public function removePasswordResetToken()
{
$this->password_reset_token = null;
}
}
But it is giving me this error when I try to login:
Setting unknown property: app\models\User::password_hash
This is actionLogin in siteController:
public function actionLogin()
{
if (!\Yii::$app->user->isGuest) {
return $this->goHome();
}
$model = new LoginForm();
if ($model->load(Yii::$app->request->post()) && $model->login()) {
return $this->goBack();
} else {
return $this->render('login', [
'model' => $model,
]);
}
}
And this is the code in LoginForm.php:
public function validatePassword($attribute, $params)
{
if (!$this->hasErrors()) {
$user = $this->getUser();
if (!$user || !$user->validatePassword($this->password)) {
$this->addError($attribute, 'Incorrect username or password.');
}
}
}
/**
* Logs in a user using the provided username and password.
* #return boolean whether the user is logged in successfully
*/
public function login()
{
if ($this->validate()) {
return Yii::$app->user->login($this->getUser(), $this->rememberMe ? 3600*24*30 : 0);
} else {
return false;
}
}
I don't know what is wrong, could you please help me fix this?
This is because the column "password_hash" assigned in the function "validatePassword()" doesn't exist in database or is not declared in the User model.
If the password hash is stored in the database in "password" field, then change "validatePassword()" to,
public function validatePassword($password)
{
return $this->password === Yii::$app->security->generatePasswordHash ($password);
}
Here is the solution
1: Declare it in the user controller
* #property string $password_hash
class User extends ActiveRecord implements IdentityInterface
{
public $password;
/**
* #inheritdoc
*/
public static function tableName()
{
return '{{%user}}';
}
public function rules()
{
return [
[['username','email','first_name','last_name','address','password','contact_no','role'], 'safe'],
[['email'], 'unique'],
[['email'], 'email'],
];
}
.
.
....
public function validatePassword($password)
{
return Yii::$app->security->validatePassword($password, $this->password_hash);
}
2: In your LoginForm model rule function add this
['password', 'validatePassword'],
everything else looks okay. Hope this helps you

Create AccessRules in modules Yii Framework

in modules\administrator\components\AdminController:
class AdminController extends CController
{
public function filters()
{
return array('accessControl');
}
public function accessRules()
{
return array(
array('deny', 'users' => array('*')),
);
}
}
in modules\administrator\controllers\Sitecontroller:
class SiteController extends AdminController
{
public function actionIndex()
{
$this->render('index');
}
public function actionLogin()
{
$this->render('login');
}
}
but when visit mydomain.site/administrator/site/index, it does not redirect to mydomain.site/administrator/site/login which redirects to mydomain.site/site/login (default login), I want it redirects to mydomain.site/administrator/site/login
can someone help me?
Set CWebUser::$loginUrl before filters are invoked:
class AdminModule extends CWebModule
{
public function init()
{
$this->setImport(array(
'admin.models.*',
//'application.models.*',
'admin.components.*',
));
}
public function beforeControllerAction($controller, $action)
{
if(parent::beforeControllerAction($controller, $action))
{
// this method is called before any module controller action is performed
// you may place customized code here
if ( !Yii::app()->user->checkAccess('admin') ) {
if(Yii::app()->user->isGuest){
$url = Yii::app()->createUrl(Yii::app()->user->loginUrl);
Yii::app()->user->returnUrl = Yii::app()->createUrl('/admin/');
Yii::app()->request->redirect($url);
}
else {
throw new CHttpException(403,'Have no permission');
}
}
return true;
}
else
return false;
}
}
Try this:
array('allow', // allow authenticated user to perform below actions
'actions'=>array('index'),
'users'=>array('#'),
),
array('deny', // deny all users
'users'=>array('*'),
),
This way, when the url is requested for site/index and as we have set index to be allowed only for authenticated users, the request will be redirected to site/login (or default login).
I hope it helps.

OOP PHP error for non-object when trying to get user info from database [duplicate]

This question already has answers here:
Call to a member function on a non-object [duplicate]
(8 answers)
Closed 10 years ago.
I'm trying to make oop class to get user info but i get this error
Fatal error: Call to a member function prepare() on a non-object in functions.php
user.php - >
include_once 'functions.php';
$user = new User();
echo $user->get_fullname(5);
functions.php ->
include_once 'database.php';
class User
{
public function connect()
{
$dbh = new DB_Class();
}
public function get_fullname($uid)
{
$getName = $dbh->prepare("SELECT EmailAddress FROM users WHERE UserID =:username");
$getName->bindParam(':username', $uid);
$getName->execute();
$rowName = $getName->fetch();
$email = $rowName['emailaddress'];
return $email;
}
}
database.php - >
class DB_Class
{
public function connect() {
try {
$dbh= new PDO("mysql:host=localhost;dbname=root",'users','password', array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"
));
} catch (PDOException $e) {
echo $e->getMessage();
}
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
$dbh->setAttribute(PDO::ATTR_CASE,PDO::CASE_LOWER);
}
}
What i'm doing wrong :(
You never actually give access to the PDO instance $dbh to the things youre trying to use it in. It seems like youre using classes simple as groupings of functions but also expecting some magic to happen :-) This is how i would do it with your existingcode:
class DB_Class {
protected $dsn;
protected $user;
protected $password;
protected $connection;
public function __construct($dsn = null, $user = null, $password = null)
{
$this->dsn = $dsn;
$this->user = $user;
$this->password = $password;
}
public function connect()
{
if($this->connection) {
return $this->connection;
}
try {
$this->connection = new PDO($this->dsn,$this->user, $this->password,
array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"
));
$this->connection->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
$this->connection->setAttribute(PDO::ATTR_CASE,PDO::CASE_LOWER);
return $this->connection;
}
catch (PDOException $e) {
return false;
}
}
}
class User {
protected $db;
public function __construct(DB_Class $db = null)
{
$this->db = $db;
}
public function setDb(DB_Class $db)
{
$this->db = $db;
}
public function get_fullname($uid)
{
$stmt = $this->db->connect()->prepare("SELECT EmailAddress FROM users WHERE UserID =:username");
$stmt->execute(array(':username', $uid));
if($row = $getName->fetch()) {
return $row['emailaddress'];
} else {
return null;
}
}
}
The $dbh variable isn't being passed into the get_fullname function. You'd need to do something like:
public function connect()
{
$dbh = new DB_Class();
return $dbh;
}
public function get_fullname($uid)
{
$dbh = $this->connect();
you need to declare $dbh as property of User class and access it via $this identifier:
class User
{
protected $dbh;
public function connect()
{
$this->dbh = new DB_Class();
}
public function get_fullname($uid)
{
$getName =$this->dbh->prepare("SELECT EmailAddress FROM users WHERE UserID =:username");
$getName->bindParam(':username', $uid);
$getName->execute();
$rowName = $getName->fetch();
$email = $rowMail['emailaddress'];
return $email;
}
}
You are never actually assigning your class properties as a property, all you are doing when declaring the variables inside of your methods is putting them into the methods current scope and they are destroyed once the method finishes execution.
To properly set a property within a class you need to declare them using $this->varname and the same goes for accessing them.
You are also using an incorrect name for the classes construction, the constructor must be set to __construct not connect.
As you can see in the updated code the $dbh variable is now a property of the User class and can be called between it's methods.
User Class
class User
{
public function __construct()
{
$this->dbh = new DB_Class();
}
public function get_fullname($uid)
{
$getName = $this->dbh->getConnection()->prepare("SELECT EmailAddress FROM users WHERE UserID =:username");
$getName->bindParam(':username', $uid);
$getName->execute();
$rowName = $getName->fetch();
$email = $rowName['emailaddress'];
return $email;
}
}
Database Class
class DB_Class
{
public function __construct() {
try {
$this->dbh = new PDO("mysql:host=localhost;dbname=root",'users','password', array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"
));
} catch (PDOException $e) {
echo $e->getMessage();
}
$this->dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
$this->dbh->setAttribute(PDO::ATTR_CASE,PDO::CASE_LOWER);
}
public function getConnection() {
return $this->dbh;
}
}
You will benefit greatly by using http://us2.php.net/manual/en/oop5.intro.php as a resource.