我遇到问题,我试图在将其连接到 mySQL 时创建一个登录页面,我已经尝试了大多数解决方案,但它对我不起作用,不断发生的情况是它不断进入 LoginController 中的其他内容,即使凭据是正确的,我认为我做了一些愚蠢的事情但无法指出,我需要我能在这里得到的所有帮助
Login Controller
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Session;
class LoginController extends Controller
{
public function login()
{
if (Auth::check()) {
return redirect('home');
}else{
return view('loginKaryawan');
}
}
public function actionlogin(Request $request)
{
$data = [
'username' => $request->input('username'),
'password' => $request->input('password'),
];
if (Auth::attempt($data)) {
$karyawan = Auth::user();
return redirect()->route('dashboardMO');
} else {
Session::flash('error', 'Username atau Password Salah. Username: ' . $data['username'] . ', Password: ' . $data['password']);
return redirect('/');
}
}
public function actionlogout()
{
Auth::logout();
return redirect('/');
}
}
KaryawanController
<?php
namespace App\Http\Controllers\Api;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Models\karyawan;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
class karyawanController
{
/**
* Display a listing of the resource.
*/
public function index()
{
$karyawan = karyawan::all();
if (count($karyawan) > 0) {
return response([
'message' => 'Retrieve All Success',
'data' => $karyawan
], 200);
}
return response([
'message' => 'Empty',
'data' => null
], 400);
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
$storeData = $request->all();
$validate = Validator::make($storeData, [
'nama_karyawan' => 'required',
'no_telp' => 'required',
'username' => 'required',
'password' => 'required',
'gaji_karyawan' => 'required',
'bonus' => 'required',
]);
if ($validate->fails()) {
return response(['message' => $validate->errors()], 400);
}
$karyawan = karyawan::create($storeData);
return response([
'message' => 'Add karyawan Success',
'data' => $karyawan
], 200);
}
/**
* Display the specified resource.
*/
public function show(string $id_karyawan)
{
$karyawan = karyawan::find($id_karyawan);
if (!is_null($karyawan)) {
return response([
'message' => 'karyawan found, it is ' . $karyawan->nama_karyawan,
'data' => $karyawan
], 200);
}
return response([
'message' => 'karyawan Not Found',
'data' => null
], 404);
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, string $id_karyawan)
{
$karyawan = karyawan::find($id_karyawan);
if (is_null($karyawan)) {
return response([
'message' => 'karyawan Not Found',
'data' => null
], 404);
}
$updateData = $request->all();
$validate = Validator::make($updateData, [
'nama_karyawan' => 'required',
'no_telp' => 'required',
'username' => 'required',
'password' => 'required',
'gaji_karyawan' => 'required',
'bonus' => 'required',
]);
if ($validate->fails()) {
return response(['message' => $validate->errors()], 400);
}
$karyawan->nama_karyawan = $updateData['nama_karyawan'];
$karyawan->no_telp = $updateData['no_telp'];
$karyawan->username = $updateData['username'];
$karyawan->password = $updateData['password'];
$karyawan->gaji_karyawan = $updateData['gaji_karyawan'];
$karyawan->bonus = $updateData['bonus'];
if ($karyawan->save()) {
return response([
'message' => 'Update karyawan Success ',
'data' => $karyawan
], 200);
}
return response([
'message' => 'Update karyawan Failed',
'data' => null
], 400);
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id_karyawan)
{
$karyawan = karyawan::find($id_karyawan);
if (is_null($karyawan)) {
return response([
'message' => 'karyawan Not Found',
'data' => null
], 404);
}
if ($karyawan->delete()) {
return response([
'message' => 'Delete karyawan Success ',
'data' => $karyawan
], 200);
}
return response([
'message' => 'Delete karyawan Failed ',
'data' => null
], 400);
}
}
Web Routes
<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\LoginController;
use App\Http\Controllers\HomeController;
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get('/', [LoginController::class, 'login'])->name('login');
Route::post('actionlogin', [LoginController::class, 'actionlogin'])->name('actionlogin');
Route::get('dashboardMO', [karyawanController::class,'index'])->name('dashboardMO')->middleware('auth');
Route::get('home', [HomeController::class, 'index'])->name('home')->middleware('auth');
Route::get('actionlogout', [LoginController::class, 'actionlogout'])->name('actionlogout')->middleware('auth');
Karyawan Models
<?php
namespace App\Models;
use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Auth\Authenticatable as AuthenticatableTrait;
class karyawan extends Model implements Authenticatable
{
use HasFactory, AuthenticatableTrait;
public $timestamps = false;
protected $table = "karyawan";
protected $primaryKey = "id_karyawan";
protected $fillable = [
'username',
'password',
'nama_karyawan',
'no_telp',
'gaji_karyawan',
'bonus',
];
public function karyawan(){
return $this->belongsTo(karyawan::class, 'id_role');
}
}
loginKaryawan.blade.php
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Login - Atma Kitchen</title>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container"><br>
<div class="col-md-4 col-md-offset-4">
<h2 class="text-center"><b>ATMA KITCHEN</b><br>Login Karyawan Atma Kitchen</h3>
<hr>
@if(session('error'))
<div class="alert alert-danger">
<b>Opps!</b> {{session('error')}}
</div>
@endif
<form action="{{ route('actionlogin') }}" method="post">
@csrf
<div class="form-group">
<label for="username">Username</label>
<input type="text" id="username" name="username" class="form-control" placeholder="Username" required="">
</div>
<div class="form-group">
<label for="password">Password</label>
<input type="password" id="password" name="password" class="form-control" placeholder="Password" required="">
</div>
<button type="submit" class="btn btn-primary btn-block">Log In</button>
<hr>
<p class="text-center">Lupa Password? <a href="#">Recover</a> </p>
</form>
</div>
</div>
</body>
</html>
问题在于您在注册后将用户重定向到登录路由的方式。您错误地假设 $request 数据将伴随重定向。
让我们假设这种情况:一个请求被分派到带有名称、电子邮件和密码字段的 postRegister 方法。控制器创建用户并将其保存到数据库中。然后,它将尚未经过身份验证的用户重定向到登录路由。 postLogin 方法被触发,但这次没有请求数据。结果,Auth::attempt($credentials) 失败,你会在屏幕上看到令人讨厌的失败。
如果在创建数组后立即添加 dd($credentials),您会看到它没有值:
public function actionlogin(Request $request)
{
$data = [
'username' => $request->input('username'),
'password' => $request->input('password'),
];
// Dump data
dd($data);
if (Auth::attempt($data)) {
$karyawan = Auth::user();
return redirect()->route('dashboardMO');
}
return 'Failure';
}
它将返回类似这样的内容:
array:2 [
"username" => null
"password" => null
]
无论如何,您都无法使用自定义请求数据进行重定向(除非使用作为 URL 一部分的查询字符串)。 HTTP 不是这样工作的。除了请求数据之外,您甚至无法使用自定义标头进行重定向。
现在您知道问题的根源是什么,让我们看看有哪些选项可以解决它。
我的意思是: (我稍微修改了你的代码;删除了额外的变量,使其变得更加干净,等等)
public function actionregister(Request $request)
{
// Retrieve all request data including username, email & password.
// I assume that the data IS validated.
$input = $request->all();
// Hash the password
$input['password'] = bcrypt($input['password']);
// Create the user
User::create($input);
// Redirect
return redirect()
// To the route named `login`
->route('login')
// And flash the request data into the session,
// if you flash the `$input` into the session, you'll
// get a "Failure" message again. That's because the
// password in the $input array is already hashed and
// the attempt() method requires user's password, not
// the hashed copy of it.
//
->with($request->only('username', 'password'));
}
public function actionlogin(Request $request)
{
// Create the array using the values from the session
$data = [
'username' => session('username'),
'password' => session('password'),
];
// Attempt to login the user
if (Auth::attempt($data)) {
$karyawan = Auth::user();
return redirect()->route('dashboardMO');
}
return 'Failure';
}
我强烈建议您不要使用这种方法。这样,本应负责登录用户的 actionlogin() 方法的实现与会话数据耦合在一起,这是不好的。这样,您就无法独立于 postRegister 使用 postLogin。
请注意,Laravel 自己的身份验证控制器会自动执行此操作。
顺便说一下,我的意思是: (理想情况下,这应该分解为多种方法,就像 Laravel 自己的身份验证控制器一样。但这只是一个入门示例。)
public function actionregister(Request $request)
{
$input = $request->all();
$input['password'] = bcrypt($input['password']);
User::create($input);
// event(UserWasCreated::class);
if (Auth::attempt($request->only('username', 'password'))) {
return redirect()
->route('dashboard')
->with('Welcome! Your account has been successfully created!');
}
// Redirect
return redirect()
// To the previous page (probably the one generated by a getRegister method)
->back()
// And with the input data (so that the form will get populated again)
->withInput();
}
但是,它仍然远非完美!还有许多其他方法可以解决这个问题。一种可能是使用事件、在失败时抛出异常以及使用自定义异常进行重定向。但我不会探索它们,因为已经有一个为此完美设计的解决方案。
如果您想编写自己的身份验证控制器,那没问题。一路上你会学到很多东西。但我强烈建议阅读 Laravel 自己的身份验证代码,尤其是 RegistersUsers 和 AuthenticatesUsers 特征,以便从中学习。在此处输入代码
还有一张纸条;您的用户模型中不需要 Illuminate\Auth\Authenticatable 特征,因为它已经扩展了使用该特征的 Authenticatable。