0

投稿を読んだ後:パスワードなしでログイン

私は個人的な試みをしました:

AppController:

function beforeFilter(){
$this->Auth->loginError = "This message shows up when the wrong credentials are 
 used";       
 //$this->Auth->authError = "This error shows up with the user tries to access a part
 of the website that is protected."; 
    //$this->Auth->authError = "";
    $this->Auth->fields = array(
        'username' => 'username',
        'password' =>   null 
   );

ユーザーコントローラー、内部add()

// Save new user
   if ($this->User->save(array('username' => $this->request->data['User']['username'],
          'password' => $this->Auth->password(null),
          'name' => $this->request->data['User']['name'],
          'surname' => $this->request->data['User']['surname'],
          'chosenLayout' => $this->request->data['User']['chosenLayout'],
          'dateCreated' => $this->request->data['User']['dateCreated'],
          'dateModified' => $this->request->data['User']['dateModified'],
          'role_id' =>$this->request->data['User']['role_id']        
   ))) {

    $this->Session->setFlash(__('message_success_user_added', 
    array($this->request->data['User']['username'])), 'default', array(), 'success');
    $this->redirect(array('action' => 'index'));
   } 
   else {
    // Validation error
 $this->Session->setFlash(__('message_fail_validation'), 'default', array(), 'fail');
   }

次に、管理者として入力し、null またはランダムなパスワードでダミー ユーザーを作成しました。データベースの暗号化されたパスワードを確認すると、すべて同じ (ハッシュされた null 文字列) でした。これは、add()機能の変更が機能したことを意味します...

UsersController の内部login():

// Login User
public function login() {

    // Check if the user is already logged in
    if ($this->Session->check('Auth.User.id')){ 

        // Redirect to login page
        $this->redirect($this->Auth->loginRedirect); 
    }
    else{
        // If the user is not logged in

        session_set_cookie_params(0); 

        // If the request is a POST request
        if ($this->request->is('post')) { 
            //get credentials
            $this->username = $this->request->data['User']['username'];
            $this->password = $this->request->data['User']['password'];
            $this->domain = $this->request->data['User']['domain'];
            //debug($this->username);
            debug($this->domain) ;
            //Check if username exists in local DB 
            //debug($this->User->findByUsername( $this->username ));
            if ($this->Auth->login(
                          array(
                           'username'=> $this->username,
                            'password'=> null)

                         )){

                //   debug($this->Auth->login(array(
                  //          'username'=> $this->username,
                    //        'password'=> null
                        // )));

    // Successful login
    // Get all the user information and store in Session
    //debug($this->Auth);
$this->User->id = $this->Auth->user('id');
    debug($this->User->id);
    debug($this->User);
$this->User->contain(array('User', 'Role' => array('Ui', 'Action.name')));
    $this->Session->write('User', $this->User->read());

        $actions = array();
foreach ($this->Session->read('User.Role.Action') as $key => $value){
array_push($actions, $value['name']);
}
$this->Session->write('User.Role.Action', $actions);
debug($actions);

// Render different layout depending on user type

   if($this->Session->read('User.Role.Ui.name') == Configure::read('usertype.msp')){

   $this->Session->write('SessionValues.ui', Configure::read('usertype.msp'));
$this->Auth->loginRedirect = array('controller' => 'PortStats', 'action' => 
   'index');
    }
else if($this->Session->read('User.Role.Ui.name') == 
    Configure::read('usertype.tsc')){

    $this->Session->write('SessionValues.ui', Configure::read('usertype.tsc'));
$this->Auth->loginRedirect = array('controller' => 'PortStats', 'action' => 
    'index');
                        }
else if($this->Session->read('User.Role.Ui.name') == 
    Configure::read('usertype.superAdminUserType')){
$this->Auth->loginRedirect = array('controller' => 'Uis', 'action' => 'index');
                        }

                    // Redirect to main login page
                $this->redirect($this->Auth->loginRedirect);

                    }
                    else {
                    // Failed login user
                    session_destroy();
                    $this->Session->setFlash(__('Login failed: 
          access not granted'), 'default', array(), 'fail');

                    }

                }
    }
}

次に、新しいユーザーでログインしようとしましたが、ログインに失敗したというメッセージが表示されました。つまり、 を$this->Auth->login返しますfalse

それはそれと同じくらい簡単なはずですが、何かがうまくいかないのです。

その間、私のデバッグ トレース:

警告 (2): foreach() に無効な引数が指定されました [APP\Controller\UsersController.php、85 行目]

4

1 に答える 1

1

単純化します。これはログインではなく登録プロセスであるため、これら 2 つのまったく異なるものを混同しないでください。

あなただけ

  • 適切な検証を含むユーザーを作成します
  • 成功したら、Auth->login($user['User']) を使用して認証セッションを手動で設定します
  • ここで登録した後、ユーザーが行きたい場所に手動でリダイレクトします

実際の例については、https://github.com/dereuromark/cakefest/blob/master/Controller/AccountController.php#L166を参照してください。

于 2013-09-04T12:07:47.380 に答える