У меня есть два проекта в инфраструктуре yii, и я хочу использовать оба проекта, используя SimpleSAMLphp с SSO. Условие, которое мне нужно, это если я войду из первого проекта, мне нужен доступ ко второму проекту. Заранее спасибо.
как использовать SimpleSAMLphp в фреймворке yii?
Ответы (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
...
);
}
Надеюсь, поможет.
Это можно сделать просто с помощью каталога "vendors".
- Загрузите библиотеку PHP с сайта https://simplesamlphp.org/.
- Реализуйте его в Yii Framework как библиотеку поставщика. (http://www.yiiframework.com/doc/guide/1.1/en/extension.integration)
Удачи :)
Я наткнулся на расширение Yii для SimpleSAMLphp в github.
https://github.com/asasmoyo/yii-simplesamlphp
Вы можете загрузить simplesamlphp как библиотеку поставщика, а затем указать файл автозагрузки в расширении.
Помимо расширения, вы можете скопировать все необходимые конфигурации и метаданные в приложение и настроить конфигурацию SimpleSAML для загрузки конфигураций из вашего каталога, чтобы вы могли сохранить нетронутым пакет поставщика для будущих обновлений.