gpt4 book ai didi

symfony - FOSFacebookBundle 和 FOSUserBundle

转载 作者:行者123 更新时间:2023-12-02 16:04:17 26 4
gpt4 key购买 nike

我正在尝试设置 FOSFacebookBundle 和 FOSUserBundle,以便用户可以使用注册帐户或 Facebook 帐户登录。

相关代码如下:

config.yml:

fos_user:
db_driver: orm
firewall_name: public
user_class: Fam\DiaBundle\Entity\User
from_email:
address: info@famdia.com
sender_name: Staff
registration:
confirmation:
enabled: true

fos_facebook:

file: %kernel.root_dir%/../vendor/facebook/src/base_facebook.php
alias: facebook
app_id: 1234567890
secret: abcdefg1234567890
cookie: true
permissions: [email]
culture: us_US

安全.yml

#
# app/config/security.yml
#
#

services:
my.facebook.user:
class: Fam\Dia\Security\User\Provider\FacebookProvider
arguments:
facebook: "@fos_facebook.api"
userManager: "@fos_user.user_manager"
validator: "@validator"
container: "@service_container"
security:
factories:
- "%kernel.root_dir%/../vendor/bundles/FOS/FacebookBundle/Resources/config/security_factories.xml"

providers:
chain_provider:
providers: [fos_userbundle, my_fos_facebook_provider]
fos_userbundle:
id: fos_user.user_manager
my_fos_facebook_provider:
id: my.facebook.user

encoders:
"FOS\UserBundle\Model\UserInterface": sha512

firewalls:
public:
pattern: ^/
fos_facebook:
app_url: "http://apps.facebook.com/dia/"
server_url: "http://diafam.com/facebookApp/"
login_path: /login
check_path: /login_check
default_target_path: /
provider: my_fos_facebook_provider
form_login:
login_path: /login
check_path: /login_check
provider: fos_userbundle
anonymous: true
logout: true


access_control:
- { path: ^/secured/.*, role: [IS_AUTHENTICATED_FULLY] } # This is the route secured with fos_facebook
- { path: ^/facebook/, role: [ROLE_FACEBOOK] }
- { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin/, role: ROLE_ADMIN }
# FOS facebook
- { path: ^/login_check, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/.*, role: [IS_AUTHENTICATED_ANONYMOUSLY] }
#- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https }

路由.yml

_security_check:
pattern: /login_check
_security_logout:
pattern: /logout

_security_login:
pattern: /login

FacebookProvider.php

<?php

// src/Fam\DiaBundle\Security\User\Provider/FacebookProvider.php

namespace Fam\DiaBundle\Security\User\Provider;

use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
use Symfony\Component\Security\Core\User\UserProviderInterface;
use Symfony\Component\Security\Core\User\UserInterface;
use \BaseFacebook;
use \FacebookApiException;

class FacebookProvider implements UserProviderInterface
{
/**
* @var \Facebook
*/
protected $facebook;
protected $userManager;
protected $validator;

public function __construct(BaseFacebook $facebook, $userManager, $validator)
{
$this->facebook = $facebook;
$this->userManager = $userManager;
$this->validator = $validator;
}

public function supportsClass($class)
{
return $this->userManager->supportsClass($class);
}

public function findUserByFbId($fbId)
{
return $this->userManager->findUserBy(array('facebookId' => $fbId));
}

public function loadUserByUsername($username)
{
$user = $this->findUserByFbId($username);

try {
$fbdata = $this->facebook->api('/me');
} catch (FacebookApiException $e) {
$fbdata = null;
}

if (!empty($fbdata)) {
if (empty($user)) {
$user = $this->userManager->createUser();
$user->setEnabled(true);
$user->setPassword('');
}

// TODO use http://developers.facebook.com/docs/api/realtime
$user->setFBData($fbdata);

if (count($this->validator->validate($user, 'Facebook'))) {
// TODO: the user was found obviously, but doesnt match our expectations, do something smart
throw new UsernameNotFoundException('The facebook user could not be stored');
}
$this->userManager->updateUser($user);
}

if (empty($user)) {
throw new UsernameNotFoundException('The user is not authenticated on facebook');
}

return $user;
}

public function refreshUser(UserInterface $user)
{
if (!$this->supportsClass(get_class($user)) || !$user->getFacebookId()) {
throw new UnsupportedUserException(sprintf('Instances of "%s" are not supported.', get_class($user)));
}

return $this->loadUserByUsername($user->getFacebookId());
}
}

登录.html.twig

{% extends '::base.html.twig' %}


{% block body %}
{{ facebook_initialize({'xfbml': true, 'fbAsyncInit': 'onFbInit();'}) }}
{{ facebook_login_button({'autologoutlink': true}) }}
<script>
function goLogIn(){
window.location.href = "{{ path('_security_check') }}";
}

function onFbInit() {
if (typeof(FB) != 'undefined' && FB != null ) {
FB.Event.subscribe('auth.statusChange', function(response) {
if (response.session || response.authResponse) {
setTimeout(goLogIn, 500);
} else {
window.location.href = "{{ path('_security_logout') }}";
}
});
}
}
</script>


{% for key, message in app.session.getFlashes() %}
<div class="{{ key }}">
{{ message|trans({}, 'FOSUserBundle') }}
</div>
{% endfor %}


{% if error %}
<div>{{ error }}</div>
{% endif %}

<form action="{{ path("fos_user_security_check") }}" method="post">
<h5><label for="username">{{ 'security.login.username'|trans({}, 'FOSUserBundle') }}</label><br/>
<input type="text" id="username" name="_username" value="{{ last_username }}" size=30 /><p>

<label for="password">{{ 'security.login.password'|trans({}, 'FOSUserBundle') }}</label><br/>
<input type="password" id="password" name="_password" size=30 /><p>

<input type="checkbox" id="remember_me" name="_remember_me" value="on" />
<label for="remember_me">{{ 'security.login.remember_me'|trans({}, 'FOSUserBundle') }}</label><p>

<input type="submit" id="_submit" name="_submit" value="Entra" />
</form>
</div>

{% endblock body %}

你可以帮我吗?

最佳答案

解决方案如下:

在routing.yml中

_security_check:
pattern: /loginFb

在 security.yml 中:

      fos_facebook:
check_path: /loginFb

在默认 Controller 中:

    /**
* Dummy controller.
*
* @Route("/loginFb")
* @Template
*
*
* */
public function loginFbAction() {
}

关于symfony - FOSFacebookBundle 和 FOSUserBundle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9046669/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com