116 lines
3.7 KiB
PHP
116 lines
3.7 KiB
PHP
|
<?php
|
|||
|
|
|||
|
namespace app\models;
|
|||
|
|
|||
|
use Webauthn\AttestationStatement\AttestationStatementSupportManager;
|
|||
|
use Webauthn\Denormalizer\WebauthnSerializerFactory;
|
|||
|
use Webauthn\Exception\InvalidDataException;
|
|||
|
use Yii;
|
|||
|
|
|||
|
/**
|
|||
|
* This is the model class for table "public_key_credential_source".
|
|||
|
*
|
|||
|
* @property int $id 记录id
|
|||
|
* @property int $user_id 对应的用户id
|
|||
|
* @property string $public_key_credential_source PKCS
|
|||
|
*
|
|||
|
* @property User $user
|
|||
|
*/
|
|||
|
class PublicKeyCredentialSource extends \yii\db\ActiveRecord
|
|||
|
{
|
|||
|
/**
|
|||
|
* {@inheritdoc}
|
|||
|
*/
|
|||
|
public static function tableName()
|
|||
|
{
|
|||
|
return 'public_key_credential_source';
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* {@inheritdoc}
|
|||
|
*/
|
|||
|
public function rules()
|
|||
|
{
|
|||
|
return [
|
|||
|
[['user_id', 'public_key_credential_source'], 'required'],
|
|||
|
[['user_id'], 'integer'],
|
|||
|
[['public_key_credential_source'], 'string'],
|
|||
|
[['user_id'], 'exist', 'skipOnError' => true, 'targetClass' => User::class, 'targetAttribute' => ['user_id' => 'id']],
|
|||
|
];
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* {@inheritdoc}
|
|||
|
*/
|
|||
|
public function attributeLabels()
|
|||
|
{
|
|||
|
return [
|
|||
|
'id' => 'ID',
|
|||
|
'user_id' => 'User ID',
|
|||
|
'public_key_credential_source' => 'Public Key Credential Source',
|
|||
|
];
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* Gets query for [[User]].
|
|||
|
*
|
|||
|
* @return \yii\db\ActiveQuery
|
|||
|
*/
|
|||
|
public function getUser()
|
|||
|
{
|
|||
|
return $this->hasOne(User::class, ['id' => 'user_id']);
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 获取用户相关的所有公钥凭证
|
|||
|
* @param User $user
|
|||
|
* @return \Webauthn\PublicKeyCredentialSource[]
|
|||
|
*/
|
|||
|
public function findAllForUserEntity(User $user): array
|
|||
|
{
|
|||
|
$records = self::findAll(['user_id' => $user->id]);
|
|||
|
$publicKeyCredentialSources = [];
|
|||
|
$webauthnSerializerFactory = new WebauthnSerializerFactory(new AttestationStatementSupportManager());
|
|||
|
foreach ($records as $record) {
|
|||
|
$publicKeyCredentialSource = $webauthnSerializerFactory->create()->deserialize($record->public_key_credential_source, \Webauthn\PublicKeyCredentialSource::class, 'json');
|
|||
|
$publicKeyCredentialSources[] = $publicKeyCredentialSource;
|
|||
|
}
|
|||
|
return $publicKeyCredentialSources;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 从数据库中获取指定$id的记录,转为PublicKeyCredentialSource对象
|
|||
|
* @param int $id
|
|||
|
* @return \Webauthn\PublicKeyCredentialSource|null
|
|||
|
*/
|
|||
|
public function findOneByCredentialId(int $id): ?\Webauthn\PublicKeyCredentialSource
|
|||
|
{
|
|||
|
$record = self::findOne(['id' => $id]);
|
|||
|
if ($record === null) {
|
|||
|
return null;
|
|||
|
}
|
|||
|
$webauthnSerializerFactory = new WebauthnSerializerFactory(new AttestationStatementSupportManager());
|
|||
|
return $webauthnSerializerFactory->create()->deserialize($record->public_key_credential_source, \Webauthn\PublicKeyCredentialSource::class, 'json');
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* 保存PublicKeyCredentialSource对象到数据库
|
|||
|
* @param \Webauthn\PublicKeyCredentialSource $PKCS
|
|||
|
* @return void
|
|||
|
*/
|
|||
|
public function saveCredential(\Webauthn\PublicKeyCredentialSource $PKCS): void
|
|||
|
{
|
|||
|
// Create an instance of WebauthnSerializerFactory
|
|||
|
$webauthnSerializerFactory = new WebauthnSerializerFactory(new AttestationStatementSupportManager());
|
|||
|
|
|||
|
// Serialize the PublicKeyCredentialSource object into a JSON string
|
|||
|
$publicKeyCredentialSourceJson = $webauthnSerializerFactory->create()->serialize($PKCS, 'json');
|
|||
|
|
|||
|
// Save the JSON string to the public_key_credential_source field in the database
|
|||
|
$this->public_key_credential_source = $publicKeyCredentialSourceJson;
|
|||
|
$this->user_id = Yii::$app->user->id;
|
|||
|
// Save the record to the database
|
|||
|
$this->save();
|
|||
|
}
|
|||
|
}
|