好吧,如果您想允许来自 Facebook 的请求能够绕过您的 sfGuard 安全性,这可能是一个巨大的安全漏洞。如果有人在 Facebook 上点击该链接,则无需登录即可访问您的网站。
您可以通过调整抓取您页面的 Facebook 机器人来解决问题。爬虫的用户代理是:"facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)"。因此,通过查看用户代理可以很容易地允许访问其请求。 但是,今天任何人都可以轻松欺骗用户代理。
也许你必须找到其他方法。我想有一种简单的页面,每个人都可以访问,并且在其中显示最少的信息(比如只有艺术家和歌曲名称而无法播放。但只是为了确保,如果有人没有登录尝试查看页面,它不会重定向到登录页面,而是重定向到这个轻量级页面。你明白了吗?
然后,您可以放置一个巨大的按钮,让新人注册以查看完整页面。
无论如何,无论如何你都会发现,你应该使用过滤器(在filters.yml)来实现它。过滤器在任何操作之前执行。所以这是进行此类检查的理想场所。
您将找到有关过滤器的信息:
编辑:
我会那样做的。首先,创建一个名为“facebook bot”的用户,并将其id放入/apps/frontend/config/app.yml:
all:
facebook_bot_id: 56 // sf_guard_user_id
然后创建一个简单的过滤器lib/filter/facebookBotFilter.php
<?php
class facebookBotFilter extends sfFilter
{
public function execute ($filterChain)
{
$context = $this->getContext();
$controller = $context->getController();
$request = $context->getRequest();
$user = $context->getUser();
// get the user agent
$pathArray = $request->getPathInfoArray();
$useragent = isset($pathArray['HTTP_USER_AGENT']) ? $pathArray['HTTP_USER_AGENT'] : '';
if (preg_math('/facebookexternalhit', $useragent))
{
$member = Doctrine_Core::getTable('sfGuardUser')->find(sfConfig::get('app_facebook_bot_id'));
// logged in the facebook bot
$user->signIn($member);
}
// execute next filter
$filterChain->execute();
}
}
别忘了启用apps/frontend/config/filters.yml中的过滤器:
rendering: ~
facebookBotFilter:
class: facebookBotFilter
security: ~