Skip to content

Commit ea3be9f

Browse files
committed
Password reset functionality
1 parent 441a302 commit ea3be9f

File tree

9 files changed

+148
-15
lines changed

9 files changed

+148
-15
lines changed

app/Http/Controllers/Auth/PasswordController.php

+75-12
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,13 @@
44

55
use App\Http\Controllers\Controller;
66
use Illuminate\Foundation\Auth\ResetsPasswords;
7+
use Illuminate\Http\Request;
8+
use App\Models\User;
9+
use Illuminate\Support\Facades\Mail;
10+
use Auth;
711

812
class PasswordController extends Controller
913
{
10-
/*
11-
|--------------------------------------------------------------------------
12-
| Password Reset Controller
13-
|--------------------------------------------------------------------------
14-
|
15-
| This controller is responsible for handling password reset requests
16-
| and uses a simple trait to include this behavior. You're free to
17-
| explore this trait and override any methods you wish to tweak.
18-
|
19-
*/
20-
2114
use ResetsPasswords;
2215

2316
/**
@@ -27,11 +20,81 @@ class PasswordController extends Controller
2720
*/
2821
protected $redirectTo = '/dashboard';
2922

23+
protected $request;
24+
protected $user;
25+
3026
/**
3127
* Create a new password controller instance.
3228
*/
33-
public function __construct()
29+
public function __construct(User $user, Request $request)
3430
{
3531
$this->middleware('guest');
32+
$this->request = $request;
33+
$this->user = $user;
34+
}
35+
36+
public function postEmail()
37+
{
38+
error_reporting(-1);
39+
ini_set('display_errors', 'On');
40+
41+
42+
$params = $this->request->all();
43+
44+
$validator = $this->validate($this->request, [
45+
'email' => 'required|email|exists:users'
46+
], [
47+
'exists' => 'There is no user against the given email'
48+
]);
49+
50+
$user = $this->user->findByEmail($params['email']);
51+
$user->token = str_random(32);
52+
$user->save();
53+
54+
Mail::send('auth.emails.password', [
55+
'token' => $user->token,
56+
'email' => $user->email
57+
], function($message) use ($user){
58+
$message->to($user->email, $user->name)->subject('Dingo - Reset Password');
59+
});
60+
61+
return redirect('/')->with('status', 'A reset link been sent to your email address');
62+
}
63+
64+
/**
65+
* Reset the given user's password.
66+
*
67+
* @param \Illuminate\Http\Request $request
68+
* @return \Illuminate\Http\Response
69+
*/
70+
public function reset()
71+
{
72+
$request = $this->request;
73+
$this->validate($request, [
74+
'token' => 'required',
75+
'email' => 'required|email|exists:users',
76+
'password' => 'required|confirmed|min:6',
77+
]);
78+
79+
$credentials = $request->only(
80+
'email', 'password', 'password_confirmation', 'token'
81+
);
82+
83+
$user = $this->user->findByEmail($credentials['email']);
84+
85+
if ($user->token != $credentials['token']) {
86+
return redirect()->back()
87+
->withInput($request->only('email'))
88+
->withErrors(['email' => 'Invalid authentication token']);
89+
}
90+
91+
$user->password = bcrypt($credentials['password']);
92+
$user->token = '';
93+
94+
$user->save();
95+
96+
Auth::loginUsingId($user->id);
97+
98+
return redirect($this->redirectTo)->with('status', 'Password successfuly reset');
3699
}
37100
}

app/Models/User.php

+10
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,14 @@ class User extends Model implements AuthenticatableContract, CanResetPasswordCon
2222
protected $hidden = [
2323
'password', 'remember_token',
2424
];
25+
26+
/**
27+
* Finds the user by email
28+
* @param string $email Email of the user
29+
* @return User
30+
*/
31+
public function findByEmail($email)
32+
{
33+
return $this->where('email', $email)->first();
34+
}
2535
}

config/app.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@
9191
|
9292
*/
9393

94-
'key' => env('APP_KEY'),
94+
'key' => env('APP_KEY', '9TSL9BsEjZyoM9BjX9du0XaLnCDi4m4Z'),
9595

9696
'cipher' => 'AES-256-CBC',
9797

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php
2+
3+
use Illuminate\Database\Schema\Blueprint;
4+
use Illuminate\Database\Migrations\Migration;
5+
6+
class AddResetCodeColumnInUsersTable extends Migration
7+
{
8+
/**
9+
* Run the migrations.
10+
*
11+
* @return void
12+
*/
13+
public function up()
14+
{
15+
Schema::table('users', function (Blueprint $table) {
16+
$table->string('token', 250);
17+
});
18+
}
19+
20+
/**
21+
* Reverse the migrations.
22+
*
23+
* @return void
24+
*/
25+
public function down()
26+
{
27+
Schema::table('users', function (Blueprint $table) {
28+
$table->dropColumn('token');
29+
});
30+
}
31+
}

database/seeds/DatabaseSeeder.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,6 @@ class DatabaseSeeder extends Seeder
1111
*/
1212
public function run()
1313
{
14-
// $this->call(UserTableSeeder::class);
14+
$this->call(UserTableSeeder::class);
1515
}
1616
}

database/seeds/UserTableSeeder.php

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
use Illuminate\Database\Seeder;
4+
use App\Models\User;
5+
6+
class UserTableSeeder extends Seeder
7+
{
8+
/**
9+
* Run the database seeds.
10+
*
11+
* @return void
12+
*/
13+
public function run()
14+
{
15+
$user = new User();
16+
$user->name = 'admin';
17+
$user->email = '[email protected]';
18+
$user->password = bcrypt('admin');
19+
$user->save();
20+
}
21+
}

public/index.php

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
<?php
22

3+
34
/**
45
* Laravel - A PHP Framework For Web Artisans
56
*
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
Click here to reset your password: <a href="{{ $link = url('password/reset', $token).'?email='.urlencode($user->getEmailForPasswordReset()) }}"> {{ $link }} </a>
1+
Click here to reset your password: <a href="{{ $link = url('password/reset', $token).'?email=' . $email }}"> {{ $link }} </a>

resources/views/auth/login.blade.php

+7
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,13 @@
33
@section('content')
44
<div class="row" style="position: relative; top: 100px;">
55
<div class="col-lg-4 col-md-offset-4">
6+
7+
@if(Session::has('status'))
8+
<div class="alert alert-success">
9+
<p>{{ Session::get('status') }}</p>
10+
</div>
11+
@endif
12+
613
<h1 style="margin-bottom: 25px; font-family: Arvo; font-size: 24px; font-weight: 600; color: #666666; ">
714
Login To Dingo</h1>
815
<form role="form" method="POST" action="{{ url('/login') }}">

0 commit comments

Comments
 (0)