【问题标题】:How can I check email and password without using auth::attempt()?如何在不使用 auth::attempt() 的情况下检查电子邮件和密码?
【发布时间】:2019-10-29 18:18:58
【问题描述】:

我尝试将 auth::attempt() 用于我的登录页面。但是 auth::attempt() 总是返回 false。我尝试了旧的 stackoverflow 帖子中可用的所有其他方法,但仍然找不到正确的解决方案。我是 laravel 新手,想知道如何在不使用 laravel 身份验证的情况下检查“电子邮件”和“密码”是否与用户表中的任何记录匹配?

users.php

<?php
namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;

class users extends Authenticatable 
{
    use Notifiable;
    protected $fillable = ['name', 'username', 'password', 'email',];

}

login.blade.php

<!DOCTYPE html>
<html>
    <head>
    <title>SUST ONLINE EXAM - Student Login</title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css"/>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
    <style type="text/css">
      .box{
      width:600px;
      margin:0 auto;
      border:1px solid #ccc;
    }
    </style>
    </head>
    <body>
    <br />
    <div class="container box">
    <h3 align="center">STUDENT LOGIN!</h3><br />

    @if(isset(Auth::user()->email))
      <script>window.location="/student";</script>
    @endif

    @if ($message = Session::get('error'))
    <div class="alert alert-danger alert-block">
    <button type="button" class="close" data-dismiss="alert">×</button>
    <strong>{{ $message }}</strong>
    </div>
    @endif

   @if (count($errors) > 0)
    <div class="alert alert-danger">
     <ul>
     @foreach($errors->all() as $error)
      <li>{{ $error }}</li>
     @endforeach
     </ul>
    </div>
   @endif

   <form method="post" action="{{ url('/student') }}">
    {{ csrf_field() }}
    <div class="form-group">
     <label>Enter Email</label>
     <input type="email" name="email" class="form-control" />
    </div>
    <div class="form-group">
     <label>Enter Password</label>
     <input type="password" name="password" id="p1" class="form-control" />
    </div>
    <div class="form-group">
     <input type="submit" name="login" class="btn btn-primary" value="Login" />
    </div>
   </form>
  </div>

<!--
 @foreach($data as $value)
  <table>
  <tr>
    <td> {{ $value->email }} </td>
    <td> {{ $value->password }} </td>
  </tr>
</table>
  @endforeach
-->

 </body>
</html>

web.php

<?php

/*
|--------------------------------------------------------------------------
| 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('/', function () {
    return view('index');
});

Route::get('/welcome', function () {
    return view('index');
});

Route::get('/register', function () {
    return view('registration');
});

Route::get('/student', function () {
    return view('studentRegistration');
});

Route::get('/create-exam', function () {
    return view('createExam');
});

Route::get('/login', function () {
    return view('login');
});


Route::get('/login', 'Controller@getdata');


Route::post('/student', 'Controller@checklogin');


//Route::get('/logout', 'LoginController1@logout');
//Route::get('/student', 'LoginController1@successlogin');


Route::post('/insert', 'Controller@insert');

//Auth::routes();

//Route::get('/home', 'HomeController@index')->name('home');

控制器.php

<?php

namespace App\Http\Controllers;

use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Input;
use DB;
use Auth;
use Validator;
use Hash;
use App\users;
class Controller extends BaseController
{
    use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
    function insert(Request $req)
    {
        $this->validate($req, [
            'name' => 'required',
            'username' => 'required',
            'password' => 'required',
            'email' => 'required'
        ]);
        $Name = $req->input('name');
        $Username = $req->input('username');
        $Password = $req->input('password');
        $Password = Hash::make('password');
        $Email = $req->input('email');

        DB::table("users")->insert(["name"=>$Name,"username"=>$Username,"password"=>$Password,"email"=>$Email]
        );

    //  DB::table('users')->insert($data);
        echo "user inserted";
    }

    function checklogin(Request $request)
    {
        $this->validate($request, [
            'email'   => 'required|email',
            'password'  => 'required|min:3'
        ]);


        $auth = array(
            'email'=>$request->get('email'),
            'password'=> $request->get('password'));

        //dd($auth);
        if(Auth::attempt($auth))
        {
        // return back()->with('error', 'RIGhT Login Details');   
             return redirect('student');
        }
        else
        {
            return back()->with('error', 'Wrong Login Details');
        }

    }

    function successlogin()
    {
        return view('studentRegistration');
    }

    function logout()
    {
        Auth::logout();
        return redirect('index');
    }

   public function getdata()
    {
        $data['data']=DB::table('users')->get();
        return view('login',$data);
    }


}

当我正确输入保存在我的 mysql 中的电子邮件和密码时,我希望 auth::attempt() 会返回 true。我是 laravel 的新手,我需要知道是否有其他方法可以在没有身份验证的情况下验证电子邮件和密码: :试图()? 我受够了这个 auth::attempt() 的事情! 简而言之: 1) 密码是散列的。 2) Auth::attempt() 总是返回 false 3)我使用mysql db,根据laravel User.php更改users.php模型。

【问题讨论】:

    标签: laravel


    【解决方案1】:

    基本上这是检查电子邮件和密码的常用选项。喜欢,

    if((email_from_input == email_from_database) && (password_from_input == password_from_database)) {
         // Credential match. now you can do any action.
    }
    

    在任何框架中,或者出于我们的安全问题,我们不会直接以纯文本形式插入密码。我们使用一些加密算法。对于您的情况,您使用了 $Password = Hash::make('password');

    的哈希算法

    之后,您将无法使用数据库检查密码的纯文本。因此,您的案例的上述功能将是,

    if((email_from_input == email_from_database) && (Hash::make('password_from_input') == password_from_database)) {
         // Credential match. now you can do any action.
    }
    

    但是请记住,在 laravel Auth::attemp() 中有一些基本到中级的安全性所以,我的建议是,找出为什么这总是返回 false。 true/false 随心所欲。

    尝试 attemptLogin 而不是 attempt 。这也可以解决您的问题。

    永远不要忘记在课堂上添加use AuthenticatesUsers;,并在顶部添加Illuminate\Foundation\Auth\AuthenticatesUsers;。那就试试吧。

    【讨论】:

    • 我在将密码插入数据库时​​对其进行了哈希处理。我使用了尝试登录,但它说该功能不存在。我无法弄清楚 auth::attempt() 的问题。我在上面给出了所有必要的代码。
    • 再使用一件事,AuthenticatesUsersuse Illuminate\Foundation\Auth\AuthenticatesUsers; 在上面。那就试试吧。
    • 你的 laravel 是什么版本的?
    • 它返回错误说“对 Illuminate\Foundation\Auth\AuthenticatesUsers::guard() 的访问级别必须是公共的(如在类 Illuminate\Database\Eloquent\Model 中)”(使用 LARAVEL 5.8)
    • 我错误地输入了一个字符串,应该插入一个变量而不是字符串。我没有看到错误。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 2020-05-06
    • 2015-04-08
    相关资源
    最近更新 更多