現在行っていること
- Symfony5のチュートリアル15章を行っています。
- 具体的には「管理者画面」について、セキュリティを高めるために、Userエンティティを作成し、「管理者画面」に入るには、ユーザー名とパスワードを答えられる人のみOKにする実装をしていました。
間違えてしまったこと
- 「管理者」を一人のユーザーとして、データベースにパスワード設定するために、
①パスワードをエンコードし、
②エンコードされた値をデータベースに保存する
処理を行いました。 - しかし、SQL文の改行に手こずってしまい、自分で設定したエンコードとチュートリアルのエンコードをごちゃ混ぜにして登録してしまいました。
そこから立てた修正するための仮説
- パスワードをデコードできないか?(管理者画面に入れれば良いため)
- パスワードの値を更新する
の2通りを考えました。一つ目はググったのですがパスワードに関しては難しそうと諦めました。
2つ目についてUPDATE文
を試みたのですがうまく行きません????
教えて欲しいこと
UPDATE文
で対象のディレクトリがないと言われてしまうのはなぜでしょうか。
- チュートリアルの作業環境と同じように、dockerや、PostgreSQL、php、symfony CLIを使って実践していました。
- PostgreSQLについては、docker Hubから、イメージをpullして作っています。
- そもそも
UPDATE文
のコマンドが誤っているのではないかと思い、教えて欲しいです????
追記 データベースの構造について
Doctrine
を使用- 管理者画面を作成するために
EasyAdmin
を使用
(1)Conferenceテーブル(Entityディレクトリ配下)
- city, string, 255, (nullable)no
- year, string, 4, (nullable)no
- isInternational, boolean, (nullable)no
(2)Commentテーブル(Entityディレクトリ配下)
- author, string, 255, (nullable)no
- text, text, (nullable)no
- email, string, 255, (nullable)no
- createdAt, datetime, (nullable)no
- photoFilename, string, 255, (nullable)yes
関連づけ
- カンファンレスは n個のコメントを持つので、one-to-many の関連づけをしている
(3)Adminテーブル(Entityディレクトリ配下)
- カンファレンスへの参加者が、ユーザー登録をする機能は作らない
- 管理者を一つのユーザー登録とし、認証するシステムを作る
- そのために
Userエンティティ
を使って作成した
補足 どうやってAdminテーブル作ったか?
- 管理者は Doctrine に格納し
- 管理者のユニークな表示名を username
- 各ユーザーがパスワードを1つ持つことに(yes)とした
terminal
1noMacBook-Air guestbook % symfony console make:user Admin 2 3 Do you want to store user data in the database (via Doctrine)? (yes/no) [yes]: 4 > yes 5 6 Enter a property name that will be the unique "display" name for the user (e.g. email, username, uuid) [email]: 7 > username 8 9 Will this app need to hash/check user passwords? Choose No if passwords are not needed or will be checked/hashed by some other system (e.g. a single sign-on server). 10 11 Does this app need to hash/check user passwords? (yes/no) [yes]: 12 > yes 13 14 created: src/Entity/Admin.php 15 created: src/Repository/AdminRepository.php 16 updated: src/Entity/Admin.php 17 updated: config/packages/security.yaml 18 19 20 Success! 21 22
- 上記のように、マイグレーションファイルを作成するときは、ユーザーネームとパスワードの指定しかしていないが、その後の、SQL文を書くときは、"ロール"を書いた。
terminal
1 2$ symfony run psql -c "INSERT INTO admin (id, username, roles, password) \ 3 VALUES (nextval('admin_id_seq'), 'admin', '[\"ROLE_ADMIN\"]', \ 4 '$argon2id$v=19$m=65536,t=4,p=1$BQG+jovPcunctc30xG5PxQ$TiGbx451NKdo+g9vLtfkMy4KjASKSOcnNxjij4gTX1s')" 5 6
(参考)Adminテーブルのマイグレーションファイル
php
1<?php 2 3declare(strict_types=1); 4 5namespace DoctrineMigrations; 6 7use Doctrine\DBAL\Schema\Schema; 8use Doctrine\Migrations\AbstractMigration; 9 10/** 11 * Auto-generated Migration: Please modify to your needs! 12 */ 13final class Version20210804210848 extends AbstractMigration 14{ 15 public function getDescription(): string 16 { 17 return ''; 18 } 19 20 public function up(Schema $schema): void 21 { 22 // this up() migration is auto-generated, please modify it to your needs 23 $this->addSql('CREATE SEQUENCE admin_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); 24 $this->addSql('CREATE TABLE admin (id INT NOT NULL, username VARCHAR(180) NOT NULL, roles JSON NOT NULL, password VARCHAR(255) NOT NULL, PRIMARY KEY(id))'); 25 $this->addSql('CREATE UNIQUE INDEX UNIQ_880E0D76F85E0677 ON admin (username)'); 26 $this->addSql('CREATE UNIQUE INDEX UNIQ_911533C8989D9B62 ON conference (slug)'); 27 } 28 29 public function down(Schema $schema): void 30 { 31 // this down() migration is auto-generated, please modify it to your needs 32 $this->addSql('CREATE SCHEMA public'); 33 $this->addSql('DROP SEQUENCE admin_id_seq CASCADE'); 34 $this->addSql('DROP TABLE admin'); 35 $this->addSql('DROP INDEX UNIQ_911533C8989D9B62'); 36 } 37} 38 39
(参考)Adminテーブルのモデル(エンティティファイル)
php
1<?php 2 3namespace App\Entity; 4 5use App\Repository\AdminRepository; 6use Doctrine\ORM\Mapping as ORM; 7use Symfony\Component\Security\Core\User\UserInterface; 8 9/** 10 * @ORM\Entity(repositoryClass=AdminRepository::class) 11 */ 12class Admin implements UserInterface 13{ 14 /** 15 * @ORM\Id 16 * @ORM\GeneratedValue 17 * @ORM\Column(type="integer") 18 */ 19 private $id; 20 21 /** 22 * @ORM\Column(type="string", length=180, unique=true) 23 */ 24 private $username; 25 26 /** 27 * @ORM\Column(type="json") 28 */ 29 private $roles = []; 30 31 /** 32 * @var string The hashed password 33 * @ORM\Column(type="string") 34 */ 35 private $password; 36 37 public function getId(): ?int 38 { 39 return $this->id; 40 } 41 42 /** 43 * A visual identifier that represents this user. 44 * 45 * @see UserInterface 46 */ 47 public function getUsername(): string 48 { 49 return (string) $this->username; 50 } 51 52 public function setUsername(string $username): self 53 { 54 $this->username = $username; 55 56 return $this; 57 } 58 59 public function __toString(): string 60 { 61 return $this->username; 62 } 63 64 /** 65 * @see UserInterface 66 */ 67 public function getRoles(): array 68 { 69 $roles = $this->roles; 70 // guarantee every user at least has ROLE_USER 71 $roles[] = 'ROLE_USER'; 72 73 return array_unique($roles); 74 } 75 76 public function setRoles(array $roles): self 77 { 78 $this->roles = $roles; 79 80 return $this; 81 } 82 83 /** 84 * @see UserInterface 85 */ 86 public function getPassword(): string 87 { 88 return $this->password; 89 } 90 91 public function setPassword(string $password): self 92 { 93 $this->password = $password; 94 95 return $this; 96 } 97 98 /** 99 * Returning a salt is only needed, if you are not using a modern 100 * hashing algorithm (e.g. bcrypt or sodium) in your security.yaml. 101 * 102 * @see UserInterface 103 */ 104 public function getSalt(): ?string 105 { 106 return null; 107 } 108 109 /** 110 * @see UserInterface 111 */ 112 public function eraseCredentials() 113 { 114 // If you store any temporary, sensitive data on the user, clear it here 115 // $this->plainPassword = null; 116 } 117} 118
回答1件
あなたの回答
tips
プレビュー