Subject.php 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. <?php
  2. namespace fphammerle\yii2\auth\clientcert;
  3. class Subject extends \yii\db\ActiveRecord
  4. {
  5. public static function tableName()
  6. {
  7. return 'identity_cert_subject';
  8. }
  9. public function __construct(\yii\web\IdentityInterface $identity = null, $dn = null)
  10. {
  11. $this->identity = $identity;
  12. $this->distinguished_name = $dn;
  13. }
  14. public function rules()
  15. {
  16. return [
  17. [['distinguished_name', 'identity_id'], 'required'],
  18. [['distinguished_name'], 'required'],
  19. [['distinguished_name'], 'string'],
  20. [['distinguished_name'], 'unique'],
  21. [['identity_id'], self::getIdentityIdSchema()->type],
  22. ];
  23. }
  24. public static function getIdentityClass()
  25. {
  26. return \Yii::$app->user->identityClass;
  27. }
  28. /**
  29. * @return \yii\db\TableSchema
  30. */
  31. public static function getIdentityTableSchema()
  32. {
  33. $cls = Subject::getIdentityClass();
  34. return (new $cls)->getTableSchema();
  35. }
  36. /**
  37. * @return \yii\db\ColumnSchema
  38. */
  39. public static function getIdentityIdSchema()
  40. {
  41. $keys = array_filter(
  42. self::getIdentityTableSchema()->columns,
  43. function($c) { return $c->isPrimaryKey; }
  44. );
  45. assert(sizeof($keys) == 1);
  46. return array_pop($keys);
  47. }
  48. public function getIdentity()
  49. {
  50. return $this->hasOne(
  51. self::getIdentityClass(),
  52. [Subject::getIdentityIdSchema()->name => 'identity_id']
  53. );
  54. }
  55. public function setIdentity(\yii\web\IdentityInterface $identity = null)
  56. {
  57. if($identity === null) {
  58. $this->identity_id = null;
  59. } else {
  60. $cls = self::getIdentityClass();
  61. if($identity instanceof $cls) {
  62. // @see \yii\web\IdentityInterface::getId()
  63. $this->identity_id = $identity->getId();
  64. } else {
  65. throw new \InvalidArgumentException(sprintf(
  66. "expected instance of %s,\n%s given",
  67. $cls,
  68. get_class($identity)
  69. ));
  70. }
  71. }
  72. // TODO: update related record
  73. // $this->getRelatedRecords()['identity'] = $identity;
  74. }
  75. public static function findByDistinguishedName($dn)
  76. {
  77. return self::findOne(['distinguished_name' => $dn]);
  78. }
  79. }