简体   繁体   English

错误:使用Sentry和Laravel需要登录属性

[英]Error: Login attribute is required using Sentry and Laravel

Since today, my login controller (using Sentry) doesn't work anymore. 从今天开始,我的登录控制器(使用Sentry)不再起作用。 I already changed it 10203902 times but it keeps giving me the error: "a [login] attribute is required". 我已经将其更改了10203902次,但它一直给我错误:“需要[登录]属性”。 For the past 2-3 weeks this controller worked fine. 在过去的2-3周中,该控制器运行良好。

LoginController 的LoginController

 <?php namespace Digitus\Auth\Controllers;

use Illuminate\View\Environment as View;
use Cartalyst\Sentry\Sentry;
use Illuminate\Support\Facades\Input;
use Illuminate\Routing\Redirector as Redirect;

class LoginController extends \Digitus\Base\Controllers\BController{

    public function __construct(Input $input, View $view, Sentry $sentry, Redirect $redirect){
        $this->input    = $input;
        $this->view     = $view;
        $this->sentry   = $sentry;
        $this->user     = $this->sentry->getUser();
        $this->redirect = $redirect;

        if($this->sentry->check()) {
            $user = $this->sentry->getUser();
        } else {
            $user = null;
        }
        $this->view->share('loggedUser', $user);
    }

    protected $input;
    protected $view;
    protected $sentry;
    protected $redirect;

    public function index()
    {
        return $this->view->make('user.login');
    }

    public function login()
    {
        $user = $this->user->where('username', $this->input->get('email_or_username'))->orWhere('email', $this->input->get('email_or_username'))->first();
        $credentials = array(
            'email' => Input::get('email_or_username') ?: null,
            'password' => $this->input->get('password'),
        );
        try {
            $user = $this->sentry->authenticate($credentials, false);

            if($this->sentry->check())
            {
                return $this->redirect->to('admin');
            } else {
                return $this->redirect->to('');
            }
        }
        catch (\Exception $e)
        {
            return $this->redirect->to('login')->withErrors(array('login'=> $e->getMessage()));
        }
    }

}

View 视图

@extends('layouts.main')

@section('content')

<div class="col-md-4 col-md-offset-4">
    <div class="panel panel-info">
        <div class="panel-heading">PLease Login</div>
        <div class="panel-body">
            {{ Form::open(array('url' => 'login')) }}
            @if($errors->has('login'))
                <div class="alert alert-danger">
                    <a href="#" class="close" data-dismiss="alert">&times;</a>
                    {{ $errors->first('login', ':message') }}
                </div>
            @endif
            <div class="form-group">
                {{ Form::label('email_or_username', 'Email Address or Username') }}
                {{ Form::email('email_or_username', '', array('class'=>'form-control','placeholder'=>'Please enter your Email Address or Username to login', 'autofocus')) }}
            </div>
            <div class="form-group">
                {{ Form::label('password', 'Password') }}
                {{ Form::password('password', array('class'=>'form-control', 'placeholder'=>'Password')) }}
            </div>
            <div class="form-group">
                {{ Form::submit('Login', array('class'=>'btn btn-success')) }}
                {{ HTML::link('/', 'Cancel', array('class'=>'btn btn-danger')) }}
            </div>
            <hr>
            <div class="form-group">
                <h2>Don't have an account?</h2>
                {{ HTML::link('register', 'Please register here', array('class'=>'btn btn-primary btn-xs'))}}
            </div>
            {{ Form::close() }}
        </div>
    </div>
</div>

@stop

I've already asked many people for solutions or fixes etc. They all didn't work.. 我已经问过很多人寻求解决方案或修复等。他们都没有用。

PS & FYI: I also published the Sentry config, and the login_attribute is email. PS&仅供参考:我还发布了Sentry配置,login_attribute是电子邮件。 Any help or input would be great. 任何帮助或投入都会很棒。 Thanks in advance.. 提前致谢..

Sentry also uses the 哨兵也使用

protected static $loginAttribute = 'email';

To get the login data, check if you have made changes to it. 要获取登录数据,请检查是否已对其进行更改。 Those are the lines that are giving you a hard time: 这些是给您带来困难的路线:

$loginName = $this->userProvider->getEmptyUser()->getLoginName();

$loginCredentialKey = (isset($credentials[$loginName])) ? $loginName : 'login';

Basically if $loginAttribute is not available it will use 'login' as the credential key. 基本上,如果$loginAttribute不可用,它将使用'login'作为凭据密钥。 So you can also test to give what it wants: 因此,您也可以测试以提供所需的内容:

$credentials = array(
    'email' => Input::get('email_or_username') ?: null,
    'login' => Input::get('email_or_username') ?: null,
    'password' => $this->input->get('password'),
);

Unfortunately, you cannot have two different fields to login your user, so if you need this you'll have to do your check manually, so you probably will be able to do something like: 不幸的是,您不能有两个不同的字段来登录用户,因此,如果需要此操作,则必须手动进行检查,因此您可能可以执行以下操作:

public function login()
{
    $user = $this->sentry->getUserProvider()->getEmptyUser();

    $user = $user->where('email', $this->input->get('email_or_username'))
                        ->orWhere('username', $this->input->get('email_or_username'))
                        ->first();

    try 
    {
        if ($user && Hash::check($this->input->get('password'), $user->password)) /// here you check if a user was found
        {
            $this->sentry->login($user, false); /// remember = false /// here is the login happening in case of true
        }
        else
        {
            // user not found or wrong password
        }
    }
    catch (\Exception $e)
    {
        return $this->redirect->to('login')->withErrors(array('login'=> $e->getMessage()));
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM