虽然未激活用户,但身份验证系统会将用户登录

时间:2017-01-07 16:19:57

标签: php oop eloquent slim

我正在学习PHP,我直接开始使用OOP。所以我试图构建一个完整的登录系统,包括通过电子邮件激活用户 - > https://www.youtube.com/watch?v=LJJXCni8mNc

但我现在遇到了问题。用户可以登录,但不会激活。当然,我检查了数据库。注册后active设置为0,如果我理解代码正确,那么active true login.php时,用户才能进入。我在if ($v->passes()){ $user = $app->user ->where('username', $identifier) ->orWhere('email', $identifier) ->where('active', true) ->first

内查看
register.php

我添加了user.php login.php<?php use ZESI\User\UserPermission; $app -> get('/register', $guest(), function() use ($app){ $app->render('auth/register.php'); })->name('register'); $app -> post('/register', $guest(), function() use ($app) { $request = $app->request; $email = $request->post('email'); $username = $request->post('username'); $password = $request->post('password'); $password2 = $request->post('password2'); $v = $app->validation; $v->validate([ 'email' => [$email, 'required|email|uniqueEmail'], 'username' => [$username, 'required|alnumDash|max(20)|uniqueUsername'], 'password' => [$password, 'required|min(6)'], 'password2' => [$password2, 'required|matches(password)'], ]); if ($v->passes()){ $identifier = $app->randomlib->generateString(128); $user = $app->user->create([ 'email' => $email, 'username' => $username, 'password' => $app->hash->password($password), 'active' => false, 'active_hash' => $app->hash->hash($identifier), ]); $user->permissions()->create(UserPermission::$defaults); $app->mail->send('email/auth/registered.php', ['user' => $user, 'identifier' => $identifier], function ($message) use ($user){ $message->to($user->email); $message->subject('Ihre Registrierung'); }); $app->flash('global', 'Registrierung erfolgreich'); $app->response->redirect($app->urlFor('home')); } $app->render('auth/register.php', [ 'errors' => $v->errors(), 'request' => $request, ]); })->name('register.post'); ,我希望有人可以告诉我我的错误在哪里。

register.php

<?php

namespace ZESI\User;

use Illuminate\Database\Eloquent\Model as Eloquent;

class User extends Eloquent{
protected $table = 'users';

protected $fillable = [
    'email',
    'username',
    'password',
    'active',
    'active_hash',
    'remember_identifier',
    'remember_token',
];


public function getFullName(){

    if (!$this->firstname || !$this->lastname){
        return null;
    }

    return "{$this->firstname} {$this->lastname}";
}

public function getFullNameOrUsername(){
    return $this->getFullName() ?: $this->username;
}

public function activateAccount(){

    $this->update([
            'active' => true,
            'active_hash' => null
        ]);
}

public function getAvatarUrl($options = []){

    $size = isset($options['size']) ? $options['size']: 45;

    return 'http://www.gravatar.com/avatar/' . md5($this->email) . '?s=' . $size . '&d=identicon';
}

public function updateRememberCredentials($identifier, $token){
    $this->update([
            'remember_identifier' => $identifier,
            'remember_token' => $token,
        ]);
}

public function removeRememberCredentials(){
    $this->updateRememberCredentials(null, null);
}

public function hasPermission($permission){
    return (bool) $this->permissions->{$permission};
}

public function isAdmin(){
    return $this->hasPermission('is_admin');
}

public function permissions(){
    return $this->hasOne('ZESI\User\UserPermission', 'user_id');
}


}

user.php的

<?php

use Carbon\Carbon;

$app->get('/login', $guest(), function() use ($app) {

$app->render('auth/login.php');

})->name('login');

$app->post('/login', $guest(), function() use ($app){

$request = $app->request;

$identifier = $request->post('identifier');
$password = $request->post('password');
$remember = $request->post('remember');

$v = $app->validation;

$v->validate([
        'identifier' => [$identifier, 'required'],
        'password' => [$password, 'required']
    ]);

if ($v->passes()){
    $user = $app->user
        ->where('username', $identifier)
        ->orWhere('email', $identifier)
        ->where('active', true)
        ->first();


    if ($user && $app->hash->passwordCheck($password, $user->password)){
        $_SESSION[$app->config->get('auth.session')] = $user->id;

        if ($remember === 'on'){
            $rememberIdentifier = $app->randomlib->generateString(128);
            $rememberToken = $app->randomlib->generateString(128);

            $user->updateRememberCredentials(
                $rememberIdentifier,
                $app->hash->hash($rememberToken)
            );

            $app->setCookie(
                $app->config->get('auth.remember'),
                "{$rememberIdentifier}___{$rememberToken}",
                Carbon::parse('+1 week')->timestamp
            );
        }

        $app->flash('global', 'Login erfolgreich');
        $app->response->redirect($app->urlFor('home'));

    } else {
        $app->flash('global', 'Anmeldung fehlgeschlagen!');
        $app->response->redirect($app->urlFor('login'));
    }

}

$app->render('auth/login.php', [
        'errors' => $v->errors(),
        'requests' => $request
    ]);

})->name('login.post');

的login.php

->where('active', true)
->where('username', $identifier)
->orWhere('email', $identifier)
->first();

修改 不工作:

if ($v->passes()){
        $user = $app->user
            ->where('username', $identifier)
            ->where('active', true)
            ->orWhere('email', $identifier)
            ->where('active', true)
            ->first();

工作:

class Note < ApplicationRecord
  belongs_to :user
  belongs_to :notable, polymorphic: true
end

1 个答案:

答案 0 :(得分:1)

$identifier = 'jmattheis';
$app->user
    ->where('username', $identifier)
    ->orWhere('email', $identifier)
    ->where('active', true)

这将是像这样的

SELECT * FROM `users` 
WHERE `username` = 'jmattheis' OR `email` = 'jmattheis' AND `active` = true

这将是when (username = jmattheis) or (email = jmattheis and active = true)

你应该使用(或雄辩地使用它:

$app->user
    ->where(function($query) use ($identifier) {
         $query->where('username', $identifier)
             ->orWhere('email', $identifier);
    })->where('active', true)->first();