【问题标题】:Laravel 5.1 - Can't access Auth:user()->data from my controllersLaravel 5.1 - 无法从我的控制器访问 Auth:user()->data
【发布时间】:2016-01-18 19:00:08
【问题描述】:

我在 Laravel 5.1 中的 Auth 数据方面遇到了一些问题 我想获取 Logged 用户的 id,如果我在 View 中使用它,它可以工作,让我们说:

<?php echo Auth::user()->id;?>

但是,如果我尝试在 Controller 中访问它,它将无法正常工作,我会收到此错误:

ErrorException in Con_Mascota.php line 101:
Trying to get property of non-object

在第 101 行我已经:

$cod_usu=$request->user()->cod_usu;

我把它从 $cod_usu=Auth::user()->cod_usu;因为那也不起作用。

我也将它包含在控制器中:

use Auth;

非常感谢任何帮助:)

我认为问题是我的身份验证会话在刷新后或我转到另一条路线后登录:

我的登录功能是:

    */
public function ini_ses(Request $datos)
{
    //Inicia sesion
  //  Session::put('ses_correo', Input::get('email'));

    $correo = $datos->input('email');
    $password= $datos->input('password');        

    if(Auth::attempt(['correo_elec'=>$correo, 'password'=>$password]))
    {
        $_session['correo']=$correo;
        $_session['contra']=$password;

        if(Auth::user()->tipo==0)
        {
            return view('cliente');
        }
        elseif(Auth::user()->tipo==1)
        {
            return view('veterinario');
        }
        elseif(Auth::user()->tipo==2)
        {
            echo("Admin");
        }
    }
    else
    {
        var_dump($correo, $password);
    }
}

型号:

namespace App;

use Illuminate\Auth\Authenticatable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Auth\Passwords\CanResetPassword;
use Illuminate\Foundation\Auth\Access\Authorizable;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;

class Usuario extends Model implements AuthenticatableContract,
                                    AuthorizableContract,
                                    CanResetPasswordContract
{
    use Authenticatable, Authorizable, CanResetPassword;

    public $timestamps = false;
    /**
     * The database table used by the model.
     *
     * @var string
     */
    protected $table = 'usuario';

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = ['cod_usu', 'correo_elec', 'nombre', 'ape_p', 'ape_m', 'telefono', 'celular', 'pais' , 'tipo'];

    /**
     * The attributes excluded from the model's JSON form.
     *
     * @var array
     */
    protected $hidden = ['contra', 'remember_token'];
}

我找到了解决方案,我改变了这个:

if(Auth::attempt(['correo_elec'=>$correo, 'password'=>$password]))

到这里

if(Auth::attempt(['correo_elec'=>$correo, 'password'=>$password], true))

这最终让我不得不在表中更改我的 cod_usu 以获取 id,并阅读 jedrzej.kurylo 的答案,我想这可以解决问题

【问题讨论】:

  • Auth::user() 仅当您通过身份验证时才返回 User 对象 - 否则它返回 null 并且您会收到错误消息。确保您已通过身份验证或首先通过在 Auth::user()->cod_usu 之前调用 Auth::check() 来检查您是否已通过身份验证
  • Auth::check() 返回 false,但我在登录后立即访问该路由,我的意思是我登录,我进入我的索引视图,然后单击转到我正在使用 Auth::check() 的另一条路线,是否有原因可以自动注销?
  • 你是自己实现登录还是使用Laravel自带的AuthController?
  • 我用过 Laravel,我会把我的代码放在帖子里
  • 能否也粘贴您的用户模型和用户表架构?

标签: php laravel authentication laravel-5 laravel-5.1


【解决方案1】:

当您登录时,Laravel 会尝试将您的用户标识符保存在会话中,以便在后续请求期间加载它。默认情况下,模型的 ID 字段称为 id,在您的情况下并非如此。因此,在您进行身份验证后,Laravel 会将 null 存储为您的用户 ID,这就是它以后无法加载它的原因。

你需要告诉 Eloquent 你的标识符列的名称是什么。您可以通过设置 Usuario 类的 $primaryKey 属性来实现:

protected $primaryKey = 'cod_usu';

您不仅需要它来使您的登录工作,而且还需要能够为您的模型定义关系或使 find 方法工作,例如Usuario::find(123) 将无法从数据库加载您的用户。

启用 remember-me,这对您的情况有所帮助,但偶然起作用。通过将 attempt() 的第二个参数设置为 true,您已经启用了记住我的功能,这会导致创建一个随机标识符,该标识符会保存在表的 remember_toke 列中以及以后用于加载您的用户数据。这不是处理您的问题的正确方法,如果您决定将来禁用 remember-me,它也会破坏您的应用程序。

【讨论】:

    猜你喜欢
    • 2016-12-11
    • 2017-04-16
    • 2015-12-05
    • 2018-12-27
    • 1970-01-01
    • 1970-01-01
    • 2016-03-04
    • 1970-01-01
    • 2018-12-09
    相关资源
    最近更新 更多