Laravel 4:股票身份验证登录不会在页面中持续存在

时间:2013-08-10 13:27:27

标签: php authentication laravel laravel-4

从所有教程中,我应该能够授权用户然后跳转到任何其他页面,并且登录是持久的。但是,这不起作用。

自定义编译的PHP LAMP堆栈。应用程序存储是可写的。

与教程的唯一区别是我使用的是电子邮件而不是用户名。 http://laravelbook.com/laravel-user-authentication/ http://codehappy.daylerees.com/authentication

会话有效,因为我能够将var存储到会话中并在不同的页面上读取。

models / User.php(股票)     

use Illuminate\Auth\UserInterface;
use Illuminate\Auth\Reminders\RemindableInterface;

class User extends Eloquent implements UserInterface, RemindableInterface {

    /**
     * The database table used by the model.
     *
     * @var string
     */
    protected $table = 'users';

    /**
     * The attributes excluded from the model's JSON form.
     *
     * @var array
     */
    protected $hidden = array('password');

    /**
     * Get the unique identifier for the user.
     *
     * @return mixed
     */
    public function getAuthIdentifier()
    {
    echo $this->getKey();
        return $this->getKey();
    }

    /**
     * Get the password for the user.
     *
     * @return string
     */
    public function getAuthPassword()
    {
        return $this->password;
    }

    /**
     * Get the e-mail address where password reminders are sent.
     *
     * @return string
     */
    public function getReminderEmail()
    {
        return $this->email;
    }

}

配置/ auth.php     

return array(
    'driver' => 'eloquent',
    'model' => 'User',
    'table' => 'users',

    'reminder' => array(
        'email' => 'emails.auth.reminder',
        'table' => 'password_reminders',
        'expire' => 60,
    ),
);

配置/ session.php文件     

return array(
    'driver' => 'native',
    'lifetime' => 120,
    'files' => storage_path().'/sessions',
    'connection' => null,
    'table' => 'sessions',
    'lottery' => array(2, 100),
    'cookie' => 'laravel_session',
    'path' => '/',
    'domain' => null,
);

routes.php文件

Route::get('/', array('as' => 'home', function(){
    return View::make('home');
}));

Route::get('login', array('as' => 'login', function () {
    return View::make('login');
}))->before('guest');

Route::post('login', function () {
    $user = array(
        'email' => Input::get('email'),
        'password' => Input::get('password')
    );

    if (Auth::attempt($user, true)) {
    /*
        return Redirect::route('home')
            ->with('flash_notice', 'You are successfully logged in.');
      */
    } else {
        /*
        // authentication failure! lets go back to the login page
        return Redirect::route('login')
            ->with('flash_error', 'Your email/password combination was incorrect.')
            ->withInput();
            */
    }

    // This shows the user as logged in
    echo (Auth::check()) ? 'Logged in' : 'Not logged in';
});

// This shows the user as not logged in
Route::get('test', function () {
    echo (Auth::check() == true) ? 'Logged in' : 'Not logged in';
});

表SQL

CREATE TABLE IF NOT EXISTS `users` (
  `userId` bigint(10) unsigned NOT NULL AUTO_INCREMENT,
  `email` varchar(250) DEFAULT NULL,
  `password` varchar(124) DEFAULT NULL,
  `name` varchar(250) DEFAULT NULL,
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`userId`),
  UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;

INSERT INTO `users` (`userId`, `email`, `password`, `name`, `created_at`, `updated_at`) VALUES
(1, 'ben.test@smitty.com', '$2y$10$591gwvQKSGXihKruH1s.weHNM1DR/xzavW46vUuSBxEF7Jk0zZe1G', 'Ben Dauphinee', '2013-08-03 23:25:01', '2013-08-07 01:32:46'),
(2, 'jim@dandy.com', NULL, 'Jim Dandy', '2013-08-03 23:25:01', NULL);

产生的Auth :: user()信息

User Object
(
    [table:protected] => users
    [hidden:protected] => Array
        (
            [0] => password
        )

    [connection:protected] => 
    [primaryKey:protected] => id
    [perPage:protected] => 15
    [incrementing] => 1
    [timestamps] => 1
    [attributes:protected] => Array
        (
            [userId] => 1
            [email] => bookworm51@hotmail.com
            [password] => $2y$10$591gwvQKSGXihKruH1s.weHNM1DR/xzavW46vUuSBxEF7Jk0zZe1G
            [name] => Ben Dauphinee
            [created_at] => 2013-08-03 20:25:01
            [updated_at] => 2013-08-06 22:32:46
        )

    [original:protected] => Array
        (
            [userId] => 1
            [email] => bookworm51@hotmail.com
            [password] => $2y$10$591gwvQKSGXihKruH1s.weHNM1DR/xzavW46vUuSBxEF7Jk0zZe1G
            [name] => Ben Dauphinee
            [created_at] => 2013-08-03 20:25:01
            [updated_at] => 2013-08-06 22:32:46
        )

    [relations:protected] => Array
        (
        )

    [visible:protected] => Array
        (
        )

    [fillable:protected] => Array
        (
        )

    [guarded:protected] => Array
        (
            [0] => *
        )

    [touches:protected] => Array
        (
        )

    [with:protected] => Array
        (
        )

    [exists] => 1
    [softDelete:protected] => 
)

3 个答案:

答案 0 :(得分:15)

问题是您使用“userId”作为主要ID - 但您没有告诉Laravel。

Per the Laravel docs“Eloquent还会假设每个表都有一个名为id的主键列”

<强>要么

将表格中的userId更改为id (我的个人建议 - 如果您的桌子始终有ID,它会让您的生活更轻松)

或将其添加到您的User.php文件中:

protected $primaryKey = "userId";

答案 1 :(得分:1)

User模型的副本非常有用

您可以在User模型上验证以下内容。

  1. 如果User模型实现了Illuminate \ Auth \ UserInterface。实现上述接口后,需要按如下方式定义方法。虽然Laravel没有记录,但Auth驱动程序使用此UserInterface来验证凭据。看看http://laravel.com/api/class-Illuminate.Auth.UserProviderInterface.html

    公共函数getAuthPassword() {     返回$ this-&gt;密码; }

    公共函数getAuthIdentifier() {     return $ this-&gt; getKey(); }

  2. 您可以验证数据库上的密码是否已加密。许多开发人员都有过在密码列上有明文密码的情况。 Auth::attempt使用Hash::make()自动对密码进行哈希处理,然后将其与users表中的值进行比较。

  3. 希望这有帮助。

答案 2 :(得分:0)

我很久以前就遇到过这个问题。只需将您的php版本更改为低于5.6版本的任何版本