我有一个cakephp应用程序,需要用户通过SAML登录登录进行身份验证。为此,我点击了链接" https://github.com/zl4bv/CakePHP-simpleSAMLphp-Plugin"。
根据其文档,我已经下载了cakephp和simpleSAMLphp的新副本。现在,我的工作区中有一个cakephp文件夹和simpleSAMLphp文件夹。我已按照链接" https://simplesamlphp.org/docs/stable/"中所述安装了simpleSAMLphp。 我按照以下步骤操作: (1)我在apache配置中配置了simpleSAML,如下所示:
<VirtualHost *>
ServerName service.local-saml.com
DocumentRoot /var/www/simplesamlphp/www/
<Directory "/var/www/simplesamlphp/www/">
Order allow,deny
Allow from all
Require all granted
</Directory>
</VirtualHost>
(2)现在,在simplesamlphp应用程序文件夹中,我更改了&#39; auth.adminpassword&#39;,&#39; secretsalt&#39;,&#39; technicalcontact_name&#39;,&#39; technicalcontact_email&#39;在 /config/config.php 文件中。
(3)我使用了SAML:sp模块,默认情况下已启用。
(4)首先,我开始使用SAML作为身份提供者。
(5)我启用了&#39; enable.saml20-idp&#39; =&GT;是,在 /config/config.php 文件中。
(6)使用终端上的命令
创建一个ssl自签名证书sudo openssl req -new -x509 -days 3652 -nodes -out /etc/ssl/certs/simplesamlphp.crt -keyout /etc/ssl/certs/simplesamlphp.pem
(7)将上述证书移至 simplesamlphp / cert 。 (8)为 config / authsources.php
添加了私钥和证书'default-sp' => array(
'saml:SP',
'privatekey' => 'simplesamlphp.pem',
'certificate' => 'simplesamlphp.crt',
)
(9)将私钥和证书添加到&#34; metadata / saml20-idp-hosted.php &#34;文件也。
(10)更改了&#34; 元数据/ saml20-sp-remote.php &#34;
中的元数据$metadata['http://service.local-saml.com'] = array(
'AssertionConsumerService' => 'http://service.local-saml.com/simplesaml/module.php/saml/sp/saml2-acs.php/default-sp',
'SingleLogoutService' => 'http://service.local-saml.com/simplesaml/module.php/saml/sp/saml2-logout.php/default-sp',
);
(12)我输入了网址&#34; http://service.local-saml.com/simplesaml&#34;在浏览器上,它正常工作。我尝试使用default-sp选项登录,但它运行正常。
现在,我想在我的cakephp应用程序中使用这个simplesamlphp。 (13)为此,正如&#34; https://github.com/zl4bv/CakePHP-simpleSAMLphp-Plugin&#34;中所述,我将saml文件夹放在Cakephp的/ app / plugin文件夹中
(14)我在core.php和bootstrap.php文件中添加了行。
(15)我创建了一个usersController,并且与链接的示例文件中给出的相同。
(16)我添加了以下
'sp1' => array(
'saml:SP',
'privatekey' => 'simplesamlphp.pem',
'certificate' => 'simplesamlphp.crt',
'entityID' => 'http://localhost/cakephp1',
),
在simplesamlphp的config / authsources.php中。
(17)我在metadata / saml20-sp-remote.php
中添加了元数据$metadata['http://localhost/cakephp'] = array(
'AssertionConsumerService' => 'http://localhost/cakephp',
'SingleLogoutService' => 'http://localhost/cakephp',
);
当我在浏览器上输入 localhost / cakephp 时,重定向到&#34; https://openidp.feide.no/simplesaml/module.php/core/loginuserpass.php&#34;,用户的链接会输入他的用户名和密码,但是&#34; 国家信息丢失&#34;错误显示在&#34; http://service.local-saml.com/simplesaml/module.php/saml/sp/saml2-acs.php/sp1 &#34;并且用户不会返回&#34; localhost / cakephp &#34;。我希望用户在输入登录凭据时将用户返回到cakephp网址。
请帮助我,我错了,我错过了什么?
答案 0 :(得分:1)
似乎cakephp和simpleSAMLphp有会话冲突。一个可行的解决方案是安装memcache并使用memcache具有simpleSAMLphp的会话处理程序。 https://simplesamlphp.org/docs/stable/simplesamlphp-maintenance#section_2_1
但还有更多方法,请检查: https://simplesamlphp.org/docs/development/simplesamlphp-nostate
答案 1 :(得分:1)
您是否也在php.ini中设置了cookie域?
session.cookie_domain = ".feide.no"
NB!如果使用PHP会话,则还必须确保应用程序在设置cookie时使用相同的域。有关详细信息,请阅读this source。祝你好运。
答案 2 :(得分:0)
有一种简单的方法可以在没有这个插件的cakephp中包含simplesamlphp
1-在app / Lib文件夹中添加已配置和正常工作的simplesamlphp 2 - 在你的控制器中根据我的情况制作你的自定义方法我做了auth()
function auth()
{
$this->layout='ajax';
$this->autoRender=false;
require_once(APP . 'Lib/simplesamlphp/www/_include.php');
SimpleSAML_Logger::info('SAML2.0 - IdP.SSOService: Accessing SAML 2.0 IdP endpoint SSOService');
$metadata = SimpleSAML_Metadata_MetaDataStorageHandler::getMetadataHandler();
$idpEntityId = $metadata->getMetaDataCurrentEntityID('saml20-idp-hosted');
$idp = SimpleSAML_IdP::getById('saml2:' . $idpEntityId);
sspmod_saml_IdP_SAML2::receiveAuthnRequest($idp);
assert('FALSE');
}
而不是点击simplesamlphp的url 像这样 http://yoursimplesamlphpurl.com/saml2/idp/SSOService.php?spentityid=spname
使用你的cakephp应用程序的这个url http://your-cakeappurl.com/CakeControllername/auth?spentityid=spname