2016-05-31 5 views
0

私はusernameの代わりにemailでダイジェスト認証を設定し、cookbookに従って適切に設定しようとしました。残念ながら、いくつかのことは完全には明らかではありません。私cakephp3アプリケーション上でユーザーを編集しようとしたときだから、次のエラーが返されます。cakephp 3ユーザ名の列が存在しないという電子メールによる認証

Error: SQLSTATE[42703]: Undefined column: 7 ERROR: Column users.username doesn't exist LINE 1: SELECT Users.id AS "Users__id", Users.username AS "Users__us...^

その他のCRUDアクションはしかし仕事:ユーザー、リストのユーザーを作成して、エラーを返さないユーザーを表示します。しかし、ログインと削除はどちらかの仕事と私のpgAdminで、データが示されましたが挿入されていないデータ行がないように思われません

を私はこのようにそれを設定した(多分私のelasticsearchプラグインを通報しますか?):

CreateUsers移行:

public function change() 
{ 
    $table = $this->table('users', ['id' => false, 'primary_key' => ['id']]); 
    $table->addColumn('id', 'uuid'); 
    $table->addColumn('email', 'string', [ 
     'default' => null, 
     'limit' => 254, 
     'null' => false, 
    ]); 
    $table->addColumn('password', 'binary', [ 
     'default' => null, 
     'null' => false, 
    ]); 
    $table->addColumn('created', 'datetime', [ 
     'default' => null, 
     'null' => false, 
    ]); 
    $table->addColumn('modified', 'datetime', [ 
     'default' => null, 
     'null' => false, 
    ]); 
    $table->create(); 
} 

のAppController:

public function beforeFilter(Event $event) 
{ 
    parent::beforeFilter($event); 

    $this->loadComponent('Auth', [ 
     'authenticate' => [ 
      'Digest' => [ 
       'fields' => ['username' => 'email'], 
       'userModel' => 'Users', 
       'finder' => 'auth' 
      ], 
     ], 
     'loginAction' => [ 
      'controller' => 'Users', 
      'action' => 'login' 
     ], 
     'authError' => 'Dazu hast du keine Rechte...', 
     'storage' => 'Memory', 
     'unauthorizedRedirect' => false 
    ]); 
} 

がUserController:

public function beforeFilter(Event $event) 
{ 
    parent::beforeFilter($event); 
    // Load the Type using the 'Elastic' provider. 
    $this->loadModel('Users', 'Elastic'); 

    $this->Auth->allow(['index', 'view']); 
    if (!$this->Auth->user()){ 
     $this->Auth->allow('add'); 
    } 
} 

public function edit($id = null) 
{ 
    $user = $this->Users->get($id, [ 
     'contain' => [] 
    ]); 
    if ($this->request->is(['patch', 'post', 'put'])) { 
     $user = $this->Users->patchEntity($user, $this->request->data); 
     if ($this->Users->save($user)) { 
      $this->Flash->success(__('The user has been saved.')); 
      return $this->redirect(['action' => 'index']); 
     } else { 
      $this->Flash->error(__('The user could not be saved. Please, try again.')); 
     } 
    } 
    $this->set(compact('user')); 
    $this->set('_serialize', ['user']); 
} 

ユーザエンティティ:

class User extends Entity 
{ 
    protected function _setPassword($password) 
    { 
     if (strlen($password) > 0) { 
      return (new DefaultPasswordHasher)->hash($password); 
     } 
    } 
} 

UsersTable:

public function initialize(array $config) 
{ 
    $this->addBehavior('Timestamp', [ 
     'events' => [ 
      'Model.beforeSave' => [ 
       'created_at' => 'new', 
       'modified_at' => 'always' 
      ] 
     ] 
    ]); 
} 

public function beforeSave(Event $event) 
{ 
    $entity = $event->data['entity']; 

    // Make a password for digest auth. 
    $entity->password = DigestAuthenticate::password(
     $entity->email, //maybe change to username 
     $entity->plain_password, 
     env('SERVER_NAME') 
    ); 

    $entity->created = Time::now(); 
    return true; 
} 

public function findAuth(\Cake\ORM\Query $query, array $options) 
{ 
    $query 
     ->select(['id', 'username', 'password']) 
     ->where(['Users.active' => 1]); 

    return $query; 
} 

テンプレート "ユーザーの編集" ビュー:

<nav class="large-3 medium-4 columns" id="actions-sidebar"> 
<ul class="side-nav"> 
    <li class="heading"><?= __('Actions') ?></li> 
    <li><?= $this->Form->postLink(
      __('Delete'), 
      ['action' => 'delete', $user->id], 
      ['confirm' => __('Are you sure you want to delete # {0}?', $user->id)] 
     ) 
    ?></li> 
    <li><?= $this->Html->link(__('List Users'), ['action' => 'index']) ?>  </li> 
</ul> 
</nav> 
<div class="users form large-9 medium-8 columns content"> 
<?= $this->Form->create($user) ?> 
<fieldset> 
    <legend><?= __('Edit User') ?></legend> 
    <?php 
     echo $this->Form->input('email'); 
    ?> 
</fieldset> 
<?= $this->Form->button(__('Submit')) ?> 
<?= $this->Form->end() ?> 
</div> 

私はエラーメッセージから見ることができる唯一のことは、ということですcakephpの中核となる問題があるかもしれませんが、私は変更をハードコードしませんまた、username列の代わりに電子メールを使用している場合、ドキュメントには明確なステップが記載されていません。

答えて

1

UsersTable-> findAuth()では、 'username'フィールドを選択しようとします。フィールドは存在しないので、mysqlエラーが発生します。与えられた例で

public function findAuth(\Cake\ORM\Query $query, array $options) 
{ 
    $query 
     ->select(['id', 'username', 'password']) 
     ->where(['Users.active' => 1]); 

    return $query; 
} 
+0

このパートにコメントするとき(認証コンポーネントを設定するときも)、正常に動作しました!ありがとうございました。 – hardking

0
public function initialize() {   
     $this->loadComponent('Auth', [ 
      'authenticate' => [ 
       'Form' => [ 
        'fields' => ['username' => 'email', 'password' => 'password'], 
        'scope' => ['status' => 1] 
       ] 
      ], 
      'loginRedirect' => '/', 
      'logoutRedirect' => '/', 
      'loginAction' => ['prefix' => false, 'controller' => 'Users', 'action' => 'login'] 
     ]); 
    } 

ユーザ名はこのメールformat.Inケーキの認証は、テーブルfield.usernameがテーブルフィールドではありませんです。そのため、ユーザテーブルにユーザ名フィールドは必要ありません。 'フィールド' => ['username' => '電子メール'、 'パスワード' => 'パスワード']、

関連する問題