我有两个项目在yii框架,我想使用两个项目使用SimpleSAMLphp与SSO。条件,我需要的是,如果我从第一个项目登录,我想访问第二个项目。谢谢你提前。
qnzebej01#
首先,你通过暂时禁用Yii autoloader来加载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类的过滤器:
CFilter
<?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()方法:
filters()
public function filters() { return array( array( 'lib.SAMLControl' ) , // perform access control for CRUD operations ... ); }
希望能有所帮助。
axr492tv2#
它可以简单地使用“vendors”目录来完成。1.从https://simplesamlphp.org/下载PHP库1.在Yii Framework中实现它作为一个供应商库。(http://www.yiiframework.com/doc/guide/1.1/en/extension.integration)祝你好运:)
a2mppw5e3#
我在github中遇到了SimpleSAMLphp的Yii扩展https://github.com/asasmoyo/yii-simplesamlphp您可以将Simplesamlphp作为供应商库加载,然后在扩展名中指定自动加载文件。除了扩展之外,您还可以将所有必需的配置和元数据复制到应用程序中,并配置SimpleSAML配置以从目录加载配置,这样您就可以保持供应商包不变,以备将来更新。
3条答案
按热度按时间qnzebej01#
首先,你通过暂时禁用Yii autoloader来加载SAML库。这只是为了让你使用SAML类和方法:
然后定义一个扩展
CFilter
Yii类的过滤器:最后,在您想要限制的控制器中,重写
filters()
方法:希望能有所帮助。
axr492tv2#
它可以简单地使用“vendors”目录来完成。
1.从https://simplesamlphp.org/下载PHP库
1.在Yii Framework中实现它作为一个供应商库。(http://www.yiiframework.com/doc/guide/1.1/en/extension.integration)
祝你好运:)
a2mppw5e3#
我在github中遇到了SimpleSAMLphp的Yii扩展
https://github.com/asasmoyo/yii-simplesamlphp
您可以将Simplesamlphp作为供应商库加载,然后在扩展名中指定自动加载文件。
除了扩展之外,您还可以将所有必需的配置和元数据复制到应用程序中,并配置SimpleSAML配置以从目录加载配置,这样您就可以保持供应商包不变,以备将来更新。