как использовать SimpleSAMLphp в фреймворке yii?

У меня есть два проекта в инфраструктуре yii, и я хочу использовать оба проекта, используя SimpleSAMLphp с SSO. Условие, которое мне нужно, это если я войду из первого проекта, мне нужен доступ ко второму проекту. Заранее спасибо.


person Anil Bhattarai100    schedule 03.04.2014    source источник
comment
Было бы неплохо, если бы вы разместили какой-нибудь код и уточнили, в чем именно заключается проблема. См. этот yiiframework.com/forum/index.php/topic/   -  person asok Buzz    schedule 03.04.2014
comment
Вы оформляли заказ в simplesamlphp.org/docs/stable/authorize:authorize   -  person Bhim Prasad Ale    schedule 03.04.2014
comment
@ Рохан Але, спасибо за совет, но, пожалуйста, не могли бы вы дать мне способ реализовать это в инфраструктуре yii.   -  person Anil Bhattarai100    schedule 03.04.2014


Ответы (3)


Сначала вы загружаете библиотеку SAML, временно отключив автозагрузчик Yii. Это просто для того, чтобы вы могли использовать классы и методы 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
        ...
    );
}

Надеюсь, поможет.

person clapas    schedule 09.10.2014

Это можно сделать просто с помощью каталога "vendors".

  1. Загрузите библиотеку PHP с сайта https://simplesamlphp.org/.
  2. Реализуйте его в Yii Framework как библиотеку поставщика. (http://www.yiiframework.com/doc/guide/1.1/en/extension.integration)

Удачи :)

person Rochak Chauhan    schedule 30.09.2014

Я наткнулся на расширение Yii для SimpleSAMLphp в github.

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

Вы можете загрузить simplesamlphp как библиотеку поставщика, а затем указать файл автозагрузки в расширении.

Помимо расширения, вы можете скопировать все необходимые конфигурации и метаданные в приложение и настроить конфигурацию SimpleSAML для загрузки конфигураций из вашего каталога, чтобы вы могли сохранить нетронутым пакет поставщика для будущих обновлений.

person Tihomir Mihaylov    schedule 19.05.2015
comment
хорошо, нашел, но вопрос был задан 5 лет назад :) что означает пакет yii1 я все еще ищу пакет yii1 - person Abdul Manan; 05.07.2019