联合身份模式 Federated Identity Pattern
描述
把身份验证委托给外部的用户认证系统。
背景和问题
用户在有商业关系的不同应用程序中认证,可能需要使用不同的凭证。
解决方案
联合身份的认证机制,简单一点,就是用户中心。
注意事项
- 身份验证的单点故障。将应用程序部署到多个数据中心,以保持应用程序的可靠性和可用性。
- 身份验证机制。基于角色的访问控制(RBAC),需要允许更精细的资源控制。
何时使用
- 单点登陆。
- 全平台的统一身份认证机制。
- 多个应用之间的身份认证。
结构中包含的角色
- Consumer 消费者
- TokenProvider 令牌提供者
- Service 服务
最小可表达代码
// 令牌提供者
class TokenProvider
{
protected $users = [
['id' => 1, 'phone' => 12121212121, 'name' => '吖三', 'token' => 'aaa'],
['id' => 2, 'phone' => 12323232323, 'name' => '吖四', 'token' => 'bbb'],
];
public function getTokenByPhone($phone)
{
foreach ($this->users as $user) {
if ($phone == $user['phone']) {
return $user['token'];
}
}
return null;
}
public function getNameByToken($token)
{
foreach ($this->users as $user) {
if ($token == $user['token']) {
return $user['name'];
}
}
return null;
}
}
// 消费者
class Consumer
{
public function getToken()
{
return $this->tokens[0];
}
public function accessResource()
{
$phone = 123232323231;
$token = (new TokenProvider)->getTokenByPhone($phone);
(new Service)->debug($token);
}
}
// 服务
class Service
{
public function debug($token)
{
$name = (new TokenProvider)->getNameByToken($token);
if ($name) {
var_dump("我是{$name}");
} else {
var_dump("找不到用户!");
}
}
}
(new Consumer)->accessResource();
推荐文章: