4

私はstackoverflowで多くの投稿を検索して答えを探しましたが、おそらく何かを見落としているだけですが、$ this-> Auth-> login()を機能させることができないようです。私は他の投稿から多くの異なる提案を試しました。私が試した他の方法を説明するときは、可能な限り徹底するように努めます。

作業中のユーザーを追加しています。MD5ハッシュは正しく機能しています。パスワードをハッシュしてから、ミラクルサラダmd5http ://www.miraclesalad.com/webtools/md5.phpを使用して確認しました。

ハッシュにソルトは使用しません。私は塩なしでMD5を使用しています。

私が使用しているデータベースはPostgresql9.0です。CakePhpの魔法のいくつかは、すべてのデータベースで機能するとは限らないことを私は知っています(またはそう言われました)。

app / Config / core.php

Configure::write('Security.level', 'medium');

/**
* A random string used in security hashing methods.
*/

    Configure::write('Security.salt', '');

DBでAuth->fieldsを使用して、パスワードをuser_passwordに、usernameをuser_nameにマップしていました。user_passwordとuser_nameは、core_usersテーブルの列です。beforeFilter()メソッドにもありました。

$this->Auth->fields = array('username' => 'user_name', 'password' => 'user_password');

app / Controller / AppController.php

class AppController extends Controller {
public $components = array(
    'Session',
    'Auth' => array(
        'loginRedirect' => array('controller' => 'pages', 'action' => 'index'),
        'logoutRedirect' => array('controller' => 'pages', 'action' => 'display', 'home'),
        'loginAction' => array('admin' => false, 'controller' => 'CoreUsers', 'action' => 'login'),
        /*'fields' => array('password' => 'user_password', 'username' => 'user_name'),*/
        'userModel' => 'CoreUser'
    )
);

public function beforeFilter() {
    Security::setHash('md5');
    $this->Auth->allow('login');
    //debug($this->Auth);
} 
}

デバッグを残して、処理される順序を確認できるようにしました。また、デバッグがどのように印刷されるかを示します。

app / Controller / CoreUsersController.php

    public function login() {
    Security::setHash('md5');
    //debug($this->Auth);

    if ($this->request->is('post')) {
        debug(Security::hash($this->Auth->request->data['CoreUser']['user_password']));
        debug($this->Auth);
        debug(Configure::version());
        debug($this->Auth->request->data['CoreUser']['user_password']);
        debug($this->Auth->request->data['CoreUser']['user_name']);
        if ($this->Auth->login()) {
            debug($this->Auth->request->data['CoreUser']['user_password']);
            $this->redirect($this->Auth->redirect());

        } else {
            debug($this->Auth->request->data['CoreUser']['user_password']);
            $this->Session->setFlash(__('Invalid username or password, try again'));
        }
    }
}
public function logout() {
    $this->redirect($this->Auth->logout());
}

app / Model / CoreUser.php

 App::uses('AuthComponent', 'Controller/Component');
class CoreUser extends AppModel{
public $primaryKey = 'user_id';
public $sequence = 'core_user_id_seq';
public $name = 'CoreUser';
public $validate = array(
    'user_name' => array(
        'required' => array(
            'rule' => array('notEmpty'),
            'message' => 'User name is required'
        )
    ),
    'user_password' => array(
        'required' => array(
            'rule' => array('notEmpty'),
            'message' => 'Password is required'
        )
    ),
    'privilege_id' => array(
        'required' => array(
            'rule' => array('notEmpty'),
            'message' => 'Privilege ID is required'
        ),
        'legalValues' => array(
             'rule' => array('between',1,4),
            'message' => 'Privilege must be between 1 and 4'
        )
    ),
    'user_initial' => array(
        'required' => array(
            'rule' => array('notEmpty'),
            'message' => 'User initials is required'
        )
    ),
    'email' => array(
        'rule' => array('email',true),
        'message' => 'Email must have an \'@\' symbol and a domain e.g. .com' 
    )
);

public function beforeSave() {
    Security::setHash('md5');
    if (isset($this->data[$this->alias]['user_password'])) {
        $this->data[$this->alias]['user_password'] = AuthComponent::password($this->data[$this->alias]['user_password']);
    }
    return true;
}
}

app / View / CoreUsers / login.ctp

<h3>Login</h3>

<div class="users form">
<?php echo $this->Session->flash('auth'); ?>
<?php echo $this->Form->create('CoreUser');?>
<fieldset>
    <legend><?php echo __('Please enter your username and password'); ?></legend>
<?php
    echo $this->Form->input('user_name');
    echo $this->Form->input('user_password');
?>
</fieldset>
<?php echo $this->Form->end(__('Login'));?>
</div>

デバッグ出力

これらはすべてCoreUsersControllerからのものであり、処理される順序で実行されます。

ハッシュ化されたパスワード。これは、ユーザーを追加したときのDBの内容と同じです。

'098f6bcd4621d373cade4e832627b4f6'

Authオブジェクト

object(AuthComponent) {
components => array(
    (int) 0 => 'Session',
    (int) 1 => 'RequestHandler'
)
authenticate => array(
    (int) 0 => 'Form'
)
authorize => false
ajaxLogin => null
flash => array(
    'element' => 'default',
    'key' => 'auth',
    'params' => array()
)
loginAction => array(
    'admin' => false,
    'controller' => 'CoreUsers',
    'action' => 'login'
)
loginRedirect => array(
    'controller' => 'pages',
    'action' => 'index'
)
logoutRedirect => array(
    'controller' => 'pages',
    'action' => 'display',
    (int) 0 => 'home'
)
authError => 'You are not authorized to access that location.'
allowedActions => array(
    (int) 0 => 'login'
)
request => object(CakeRequest) {
    params => array(
        'plugin' => null,
        'controller' => 'CoreUsers',
        'action' => 'login',
        'named' => array(),
        'pass' => array()
    )
    data => array(
        'CoreUser' => array(
            'user_name' => 'testy5',
            'user_password' => 'test'
        )
    )
    query => array()
    url => 'CoreUsers/login'
    base => '/cpm_v2_dev'
    webroot => '/cpm_v2_dev/'
    here => '/cpm_v2_dev/CoreUsers/login'
}
response => object(CakeResponse) {

}
settings => array(
    'loginRedirect' => array(
        'controller' => 'pages',
        'action' => 'index'
    ),
    'logoutRedirect' => array(
        'controller' => 'pages',
        'action' => 'display',
        (int) 0 => 'home'
    ),
    'loginAction' => array(
        'admin' => false,
        'controller' => 'CoreUsers',
        'action' => 'login'
    ),
    'userModel' => 'CoreUser'
)
userModel => 'CoreUser'
  }

CakePHPのバージョン

'2.1.0'

login()が呼び出される前のパスワード

'test'

login()が呼び出される前のユーザー名

 'testy5'

login()が呼び出された後のパスワード

 'test'

これは私が試した他のstackoverflowの投稿で読んだものの簡単なリストです。詳細を説明する必要がある場合はお知らせください。

1)ユーザー名とパスワードをDBのフィールドにマッピングしました。ここにコメントがフィールドにあります。また、beforeFilter()メソッドでそれを試してみました。使用:

$this->Auth->fields = array('username' => 'user_name', 'password' => 'user_password');

ログインビューでは、フォームは次のように作成されました。

$this->Form->input('username');
$this->Form->input('password');

2)次のようにログインする前に手動でパスワードをハッシュしてみました:

 $this->Auth->request->data['CoreUser']['password'] = Security::hash($this->Auth->request->data['CoreUser']['password'])
   if ($this->Auth->login()) {
            $this->redirect($this->Auth->redirect());
   }

EDIT0

3) CakePHP2.0認証ログインが機能しないことで推奨されているようにこれを試してみました

私のAuthComponentは次のようになります。

     public $components = array(
    'Session',
    'Auth' => array(
        'authenticate' => array(
            'Form' => array(
                'userModel' => 'CoreUser',
                'fields' => array(
                    'username' => 'user_name',
                    'password' => 'user_password'
                )
            )
        ),
        'loginRedirect' => array('controller' => 'pages', 'action' => 'index'),
        'logoutRedirect' => array('controller' => 'pages', 'action' => 'display', 'home'),
        'loginAction' => array('admin' => false, 'controller' => 'CoreUsers', 'action' => 'login')
    )
);

十分に詳しく説明しなかった場合、または間違えた場合は、お詫び申し上げます。私はこれに数日間取り組んできましたが、それは本当に私を疲れさせました。私が受けるかもしれないどんな助けにも感謝します。ありがとう!

4

3 に答える 3

2

この問題を解決するために私がやったことは、CakePHPとまったく同じようにチュートリアルに従うことでした。また、2.1.2にアップグレードしました。私は2.1.0を実行していました。

http://book.cakephp.org/2.0/en/tutorials-and-examples/blog-auth-example/auth.html

次に、必要な構成をゆっくりと追加しました。私が参照したAuthコンポーネントについては、以下を参照してください。

http://book.cakephp.org/2.0/en/core-libraries/components/authentication.html

本当に私の問題はトラブルシューティングが不十分だったことです。一度に1つずつではなく、たくさんの変更を加えます。login.ctpに2つの異なる方法を表示させました

 $this->Form->input('username');
 $this->Form->input('password');

そして今、それはこのように見えます:

 echo $this->Form->input('user_name');
 echo $this->Form->Label('Password');
 echo $this->Form->password('user_password');

2番目のバージョンは機能します。

EDIT0:これは非常に重要です。AppControllerの親を呼び出さないと、ログインは機能しません。

class CoreUsersController extends AppController{
    public $helpers = array('Html','Form');

    public function beforeFilter() {
         parent::beforeFilter();
    }

Authコンポーネントのリビジョンは機能します。

public $components = array(
    'Session',
    'Auth' => array(
        'authenticate' => array(
            'Form' => array(
                'userModel' => 'CoreUser',
                'fields' => array(
                    'username' => 'user_name',
                    'password' => 'user_password'
                )
            )
        ),
        'loginRedirect' => array('controller' => 'pages', 'action' => 'index'),
        'logoutRedirect' => array('controller' => 'pages', 'action' => 'display', 'home'),
        'loginAction' => array('admin' => false, 'controller' => 'CoreUsers', 'action' => 'login')
    )
);

私の塩はまだ空の文字列です:

Configure::write('Security.salt', '');

md5ハッシュの設定は1か所でのみ必要です。モデルのbeforeSave()では必要ありません。

public function beforeFilter() {
    Security::setHash('md5');
    $this->Auth->allow('login','add');  
} 

beforeSave():

public function beforeSave() {
    if (isset($this->data[$this->alias]['user_password'])) {
        $this->data[$this->alias]['user_password'] = AuthComponent::password($this->data[$this->alias]['user_password']);
    }
    return true;
}
于 2012-05-02T12:49:19.513 に答える
1

ユーザーをデータベースに直接追加した場合、それが問題です。構成に空の文字列がある場合でも、saltを使用しないのではなく、saltアルゴリズムでそれを使用します。(これはおそらく悪い考えですが、それは別の問題です)。

また、Auth-> password関数は、saltが常に使用されるSecurity :: hash()のラッパーです。代わりにSecurity::hash($ password、'md5'、false)を使用してください。ユーザーを保存するときに、パスワードが変更されることはありません。ただし、ソルトをチェックせずにログインするようにAuth/login関数を構成する必要があります。

私はあなたの問題があなたがAuthを設定した方法にあると確信しています...あなたのデータベースでうまくいくはずです。

于 2012-04-19T21:45:56.747 に答える
0

同じエラーが発生しました。cakephpプロジェクトのコピーを作成しましたが、新しいプロジェクトにログインできませんでした。何週間も正しい答えを探した後、私がしなければならなかったのは、tmpフォルダーのアクセス許可を変更することだけであることがわかりました。不明な理由で、フォルダーをコピーすると、読み取り専用のアクセス許可でコピーされたフォルダーがいくつかあります。

于 2017-11-20T18:06:00.937 に答える