avris / micrus-social
Micrus 框架的社会登录处理程序
Requires
- abraham/twitteroauth: ^0.6.4
- avris/micrus: ^3.0
- avris/micrus-annotations: ^3.0
- avris/micrus-assetic: ^3.0
- avris/micrus-doctrine: ^3.0
- avris/micrus-forms: ^3.1
- avris/micrus-imagine: ^3.0
- avris/micrus-mailer: ^3.0
- avris/micrus-twig: ^3.0
- facebook/php-sdk-v4: ^5.1
- google/apiclient: ^2.0
- guzzlehttp/guzzle: ^6.2
README
这是一个为 Micrus 框架 提供用户注册、登录和账户管理实现(包括社交媒体登录 OAuth2)的模块。
目前它支持以下社交平台
- Google Plus
- Github
- Gitlab
- Microsoft
- Yahoo
要安装此模块,打开文件 app/Config/modules.yml
并添加
- Avris\Micrus\Social\SocialModule
然后运行
composer require avris/micrus-social
该模块使用
基本登录
该模块定义了两个抽象模型:BaseUser
和 BaseAuthenticator
。您需要在 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 提供商的应用凭据。您可以在以下位置获取它们
- developers.facebook.com
- dev.twitter.com
- console.developers.google.com
- github.com/settings/developers
- gitlab.com/profile/applications
- www.linkedin.com/secure/developer
- apps.dev.microsoft.com
- developer.yahoo.com/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);
}
}
登录按钮
要向用户提供社交登录的链接,请使用带有参数 source
(facebook
、twitter
或 google
)的 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']
版权
- 作者: Andrzej Prusinowski (Avris.it)
- 许可证: MIT