avris/micrus-social

Micrus 框架的社会登录处理程序

v3.4.1 2017-07-20 21:16 UTC

This package is auto-updated.

Last update: 2024-08-28 09:46:19 UTC


README

这是一个为 Micrus 框架 提供用户注册、登录和账户管理实现(包括社交媒体登录 OAuth2)的模块。

要查看示例实现,请访问 Dibsy (git 仓库)。

目前它支持以下社交平台

  • Facebook
  • Twitter
  • Google Plus
  • Github
  • Gitlab
  • LinkedIn
  • Microsoft
  • Yahoo

要安装此模块,打开文件 app/Config/modules.yml 并添加

 - Avris\Micrus\Social\SocialModule

然后运行

composer require avris/micrus-social

该模块使用

基本登录

该模块定义了两个抽象模型:BaseUserBaseAuthenticator。您需要在 App\Model 命名空间中扩展它们。

<?php
namespace App\Model;

use Avris\Micrus\Social\Model\BaseUser;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 */
class User extends BaseUser
{
    // project specific logic here
}

<?php
namespace App\Model;

use Avris\Micrus\Social\Model\BaseAuthenticator;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 */
class Authenticator extends BaseAuthenticator
{
    // project specific logic here
}

同样也适用于控制器。为了激活它,您需要将其“移动”到 App\Controller 命名空间,在那里您可以按照自己的意愿扩展它

<?php
namespace App\Controller;

use Avris\Micrus\Social\SocialController;
use Avris\Micrus\Annotations as M;

class UserController extends SocialController
{
}

现在您需要做的就是渲染登录/账户/注销链接

{% include 'User/indicator' %}

该模块将提供所有必要的控制器、表单、视图、翻译(目前仅支持英文)和发送电子邮件(参见: Micrus Mailer)。

您几乎可以自定义所有内容,主要通过在 App\View\Crud 中创建自己的模板、扩展上述模型和控制器以及在 App\Locale 中添加您的翻译来实现。

设置

config.yml 中,您可以更改已启用源列表

social:
  sources: [facebook, google, twitter]
  assertHasMethodLeft: false

当设置 assertHasMethodLeft 选项时,SocialModule 将不允许用户撤销他们的社交登录权限,如果他们没有其他启用(如密码)的登录选项。

社交媒体登录

您将需要提供 OAuth 提供商的应用凭据。您可以在以下位置获取它们

处理程序

此模块将处理您的应用程序和 OAuth 提供商之间的通信,但您将需要处理结果(在数据库中持久化用户,登录)。为此,请声明一个处理程序服务,如下所示

userManager:
  class: App\Service\User\UserManager
  parameters: [ '@orm.entityManager', '@securityManager', '@request']
  tags: [defaultParameters]

示例内容

<?php
namespace App\Service;

use App\Model\Authenticator;
use App\Model\User;
use Avris\Micrus\Controller\Http\Request;
use Avris\Micrus\Model\User\AuthenticatorInterface;
use Avris\Micrus\Social\SocialLoginException;
use Avris\Micrus\Social\SocialLoginHandlerInterface;
use Avris\Micrus\Tool\SecurityManager;
use Doctrine\ORM\EntityManager;

class UserManager implements SocialLoginHandlerInterface
{
    /** @var EntityManager */
    protected $em;

    /** @var SecurityManager */
    protected $sm;

    /** @var Request */
    protected $request;

    public function __construct(
        EntityManager $em,
        SecurityManager $sm,
        Request $request
    ) {
        $this->em = $em;
        $this->sm = $sm;
        $this->request = $request;
    }

    public function login(User $user)
    {
        if (!$user->isActive()) {
            $this->request->addFlash('danger', l('entity.User.custom.inactive'));
            return 'home';
        }

        $this->em->persist($user);
        $this->em->flush();
        $this->sm->login($user);

        return 'serverList';
    }

    public function loginSocial($source, $payload)
    {
        $user = $this->em->getRepository('Authenticator')->findUserBySocialAuth($source, $payload['id'])
            ?: new User($payload['email']);

        if (!$user->getAuthenticators($source)->count()) {
            $user->createAuthenticator($source, $payload);
        }

        return $this->login($user);
    }

    public function loginSocialFail(SocialLoginException $e)
    {
        $this->request->addFlash('danger', l('entity.User.socialLogin.loginFailed', ['%source%' => $e->getSource()]));

        return 'home';
    }

    public function revokeSocial(AuthenticatorInterface $auth)
    {
        /** @var Authenticator $auth */
        $auth->setValid(false);
        $this->em->persist($auth);
        $this->em->flush();
    }

    public function updateSocial(AuthenticatorInterface $auth, array $old, array $new)
    {
        /** @var Authenticator $auth */
        $auth->setPayload($new);
        $this->em->persist($auth);
    }
}

登录按钮

要向用户提供社交登录的链接,请使用带有参数 sourcefacebooktwittergoogle)的 socialLogin 路由。您也可以这样显示所有可用的源

return $this->render([
    // ...
    'socialSources' => $this->get('socialManager')->getSources(),
]);

并在视图中

<ul>
    {% for source in socialSources %}
        <li>
            <a href="{{ route('socialLogin', {source: source}) }}">
                <span class="{{ source.icon }}"></span>
            </a>
        </li>
    {% endfor %}
</ul>

扩展表单

要扩展由 Social Module 定义的任何表单,只需覆盖 SocialController::FORM_* 常量即可。

class UserController extends SocialController
{
    const FORM_ACCOUNT = 'App\Form\MyAccountForm';
}

使用用户名

默认情况下,Social Module 使用电子邮件作为用户标识符。然而,它也内置了对用户名的支持。如果启用,则在注册期间将要求选择用户名,用户可以使用该用户名或电子邮件登录。

config.yml

social:
  useUsername: true

App\Model\User

<?php
namespace App\Model;

use Avris\Micrus\Social\Model\BaseUser;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(options={"collate"="utf8mb4_unicode_ci", "charset"="utf8mb4"})
 */
class User extends BaseUser
{
    /**
     * @var string
     * @ORM\Column(type="string", unique=true, nullable=true, length=36)
     */
    private $username;

    public function __construct($username = null, $email = null)
    {
        $this->username = $username;
        parent::__construct($email);
    }

    public function getIdentifier()
    {
        return $this->getUsername();
    }

    /**
     * @return string
     */
    public function getUsername()
    {
        return $this->username;
    }

    /**
     * @param string $username
     * @return User
     */
    public function setUsername($username)
    {
        $this->username = $username;
        return $this;
    }
}

最后在 services.yml

userProvider:
  class: Avris\Micrus\Social\EmailOrUsernameUserProvider
  params: ['@orm']

版权