1

BaseAuthenticate から継承する CakePHP 2 用の独自の Auth コンポーネントを作成しています。このコンポーネントは、情報を $_SESSION 変数に保存する外部ライブラリ (/usr/share/php にあります) を使用します。私の問題は、ページを変更すると、この情報がすべて $_SESSION から削除されるため、外部ライブラリが既に接続していることを認識しないことです。

Auth.MyAuthenticateComponent で $this->Session->write を使って lib で追加された $_SESSION の内容を保存しようとしましたが、これも削除されています。

ご協力いただきありがとうございます。

編集 :

コード :

class AppController extends Controller {
    public $use = array('User');
    public $components = array(
        'Session',
        'Auth' => array(
            'loginRedirect' => array('controller' => 'Sheets', 'action' => 'index'),
            'logoutRedirect' => array('controller' => 'Users', 'action' => 'login')
        )
    );

    public function beforeFilter()
    {
        $this->Auth->authenticate = array('Arise');
    }
}

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

    public function beforeFilter()
    {
        parent::beforeFilter();
        $this->Auth->allow('login');
        $this->Auth->authenticate = array('Arise');
    }

    public function login()
    {
        if ($this->request->is('post')) {
           if ($this->Auth->login())
                return $this->redirect($this->Auth->redirect());
            else
                $this->Session->setFlash('Error');
        }
    }

    public function logout()
    {
        $this->redirect($this->Auth->logout());
    }
}

App::uses('BaseAuthenticate', 'Controller/Component/Auth');
require_once('/usr/share/php/openid/consumer/consumer.php');

class AriseAuthenticate extends BaseAuthenticate
{
    protected function _ariseAuthenticate($openid_url)
    {
        $consumer =& AriseOpenID::getInstance();
        $required = array(
            'http://somewhere/types/identifiant',
            'http://axschema.org/namePerson/first',
            'http://axschema.org/namePerson/friendly'
        );

        $consumer->setReturnTo('http://mysite/users/login');
        $consumer->setTrustRoot('http://mysite/users/login');
        $consumer->authenticate($openid_url, $required);

        if ($consumer->isLogged()) {
            $first_name = $consumer->getSingle('http://axschema.org/namePerson/first');
            $nick = $consumer->getSingle('http://axschema.org/namePerson/friendly');
            $id_arise = $consumer->getSingle('http://openid.iiens.net/types/identifiant');

            return array(
                'id_arise' => $id_arise,
                'first_name' => $first_name,
                'nick' => $nick
            );
        }

        return false;
    }

    public function checkUser($result)
    {
        $User = ClassRegistry::init('User');
        $result = $User->find('first', array(
            'conditions' => array(
                'id_arise' => $result['id_arise']
            )
        ));

        if (!$result) {
            $User->create();
            $User->save(array(
                'id_arise' => $result['id_arise'],
                'first_name' => $result['first_name'],
                'nick' => $result['nick']
            ));

            $result = $User->find('first', array(
                'conditions' => array(
                    'id_arise' => $result['id_arise']
                )
            ));
        }

        $user = $result['User'];
        unset($result['User']);

        return array_merge($user, $result);
    }

    public function authenticate(CakeRequest $request, CakeResponse $response)        
    {
        if (!$request->is('post'))
            return false;

        $openid_url = (array_key_exists('login', $request->data))
            ? $request->data['login']['openid_url']
            : NULL;

        $openid_url = ($openid_url == '') ? NULL : $openid_url;

        if ($result = $this->_ariseAuthenticate($openid_url))
            return $this->checkUser($result);

        return false;
    }

    public function getUser()
    {
        if ($result = $this->_ariseAuthenticate(NULL))
            return $this->checkUser($result);

        return false;
    }
}
4

1 に答える 1

0

認証アダプターを単体テストしていますか? 何が悪いのかわかりにくいですが、私は多かれ少なかれ、authenticate() が配列を返さず、常に false だと確信していますか? authenticate() が有効なユーザー データを返す場合、それはセッションに書き込まれるためです。

構成されたすべてを呼び出すhttp://api.cakephp.org/2.3/source-class-AuthComponent.html#690を呼び出す http://api.cakephp.org/2.3/source-class-AuthComponent.html#543 を参照してください。認証アダプター。アダプターがユーザー配列を返す場合、それは機能するはずです。したがって、アダプターが配列を返さないと思います。

于 2013-07-02T12:05:33.567 に答える