7

yii フレームワークに 2 つのプロジェクトがあり、SimpleSAMLphp と SSO を使用して両方のプロジェクトを使用したいと考えています。必要な条件は、最初のプロジェクトからログインした場合、2 番目のプロジェクトにアクセスしたいということです。前もって感謝します。

4

3 に答える 3

2

最初に、Yii オートローダーを一時的に無効にして SAML ライブラリをロードします。これは、SAML クラスとメソッドを使用できるようにするためのものです。

<?php
class YiiSAML extends CComponent {
    private $_yiiSAML = null;
    static private function pre() {
        require_once (Yii::app()->params['simpleSAML'] . '/lib/_autoload.php');
        // temporary disable Yii autoloader
        spl_autoload_unregister(array(
            'YiiBase',
            'autoload'
        ));
    }
    static private function post() {
        // enable Yii autoloader
        spl_autoload_register(array(
            'YiiBase',
            'autoload'
        ));
    }
    public function __construct() {
        self::pre();
        //We select our authentication source:
        $this->_yiiSAML = new SimpleSAML_Auth_Simple(Yii::app()->params['authSource']);
        self::post();
    }
    static public function loggedOut($param, $stage) {
        self::pre();
        $state = SimpleSAML_Auth_State::loadState($param, $stage);
        self::post();
        if (isset($state['saml:sp:LogoutStatus'])) {
            $ls = $state['saml:sp:LogoutStatus']; /* Only for SAML SP */
        } else return true;
        return $ls['Code'] === 'urn:oasis:names:tc:SAML:2.0:status:Success' && !isset($ls['SubCode']);
    }
    public function __call($method, $args) {
        $params = (is_array($args) and !empty($args)) ? $args[0] : $args;
        if (method_exists($this->_yiiSAML, $method)) return $this->_yiiSAML->$method($params);
        else throw new YiiSAMLException(Yii::t('app', 'The method {method} does not exist in the SAML class', array(
        '{method}' => $method
    )));
    }
}
class YiiSAMLException extends CException {
}

CFilter次に、 Yii クラスを拡張するフィルターを定義します。

<?php
Yii::import('lib.YiiSAML');
class SAMLControl extends CFilter {
    protected function preFilter($filterChain) {
        $msg = Yii::t('yii', 'You are not authorized to perform this action.');
        $saml = new YiiSAML();
        if (Yii::app()->user->isGuest) {
            Yii::app()->user->loginRequired();
            return false;
        } else {
            $saml_attributes = $saml->getAttributes();
            if (!$saml->isAuthenticated() or Yii::app()->user->id != $saml_attributes['User.id'][0]) {
                Yii::app()->user->logout();
                Yii::app()->user->loginRequired();
                return false;
            }
            return true;
        }
    }
}

filters()最後に、制限したいコントローラーで、メソッドをオーバーライドします。

public function filters() {
    return array(
        array(
            'lib.SAMLControl'
        ) , // perform access control for CRUD operations
        ...
    );
}

それが役に立てば幸い。

于 2014-10-09T16:10:04.687 に答える
0

「vendors」ディレクトリを使用するだけで実行できます。

  1. https://simplesamlphp.org/から PHP ライブラリをダウンロードします。
  2. ベンダー ライブラリとして Yii Framework に実装します。( http://www.yiiframework.com/doc/guide/1.1/en/extension.integration )

幸運を :)

于 2014-09-30T04:59:48.367 に答える
0

github で SimpleSAMLphp の Yii 拡張機能を見つけました。

https://github.com/asasmoyo/yii-simplesamlphp

simplesamlphp をベンダー ライブラリとしてロードし、拡張機能で autoload ファイルを指定できます。

拡張機能とは別に、必要なすべての構成とメタデータをアプリケーションにコピーし、ディレクトリから構成をロードするように SimpleSAML 構成を構成できるため、将来の更新のためにベンダー パッケージをそのままにしておくことができます。

于 2015-05-19T19:50:48.400 に答える