Spring徹底入門14章チュートリアルと自作のチャットアプリ用

データベースセットアップ

  • ユーザ情報確認 select Host, User from mysql.user;
  • ユーザ登録を、ハッシュ関数を指定してハッシュ化したパスワードを用いて行いたい。
  • MySQL8.0だと、create use syntaxで、IDENTIFIED WITH auth_plugin AS 'auth_string'の形式で、auth_pluginの形でハッシュ化されたパスワードで登録できるようである。MySQL5.7だと、IDENTIFIED BY PASSWORD 'auth_string'の形で同様の事ができたようだが、今はもうない形式のようである。
  • mysqljdbcのurl設定は、spring.datasource.url=jdbc:mysql://localhost:3306/chat?serverTimezone=JST.Timezoneを指定しないとエラーが出る。
  • ObjectクラスのhashCodeメソッドは何故この素数をフィールド数分掛けて後はフィールドに応じて色々足す感じの実装が多いというか一般的なんだろう。
  • equalsメソッドでthis==objという感じで引数のobjと==比較しているのは、何を比較しているのか。
  • JPAの複合キー指定のアノテーションは、@JoinColumnsがあるらしい。@JoinColumnを入れる事ができるようだ。
  • MySQLDROP TABLWのCASCADEオプションは何も意味が無いようだ。他のシステムからの移植を容易にするためにあるとのこと。
  • MySQLのkeyの属性のSERIALはSERIAL is an alias for BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE.とあり、色々な属性の組み合わせのようである。
  • @ManyToOneと@OneToManyでは、付けたエンティティが読み込まれるタイミングが異なるようである。@ManyToOneではJOIN FETCHされ、その都度?読み込まれるようで、@OneToManyでは最初に読み込まれる?
  • Repositoryでの@Queryでのエンティティ指定は、完全修飾名でやれば問題ないっぽい。
  • もしかしてやたら受け取るクエリの結果が多かったのは受け取り型が間違っていたからでは?専用のクラスを作らないといけないのかもしれない。ただ、やはり受け取る型もまたエンティティで、データベースでテーブルが無ければならないようだ。https://k-webs.jp/javaindex/post-1176 に詳しく書いてある。素晴らしい。
  • @OneToManyや@ManyToOneの間違いがあったようだ。多分。難しいし、最初は使わないようにしよう。JOIN ON文で指定すればどうにかなる。
  • @OneToManyや@ManyToOneを設定すれば、JOINで設定したエンティティ間のid一致等の条件を課さずに、勝手に結合してくれると思っていたが、そうでもないのかな?
  • クライアント側からサーバー側への送信は、基本的にURLを用いて行われるようである。@RequestParamを用いればコントローラ側でURLで指定したパラメータを取得できる。
  • ↑これは、Spring MVCやThymeleafだと、フォームの入力受け取り用のJavaBeansを定義してやって、それぞれの方式でタグにそのBeansを指定してやれば、Controller側でmodelの要素として受け取れるようである。
  • @ModelAttributeは、Controllerのメソッドに付ける時と引数に付ける時で挙動が異なるようで、受け取り用のJavaBeansクラスの型のオブジェクトを返すメソッドに付けておくことでビューからの入力をそのJavaBeans型としてmodelに格納し、postするControllerのメソッドの引数に付ける事で、Modelの中から指定した型のJavaBeansを探してきて、POSTしてきたビューの入力と紐付けるようである。https://kazkn.com/post/2017/use-model-attribute/に詳しく書いている。
  • model.addAttributeした属性は、いつまでアクセスできるんだろう。画面遷移またいでもアクセスできるようだが。
  • .loginProcessingUrl("/login")はの"/login"はフォーム認証でデフォルトでログイン処理を行うハンドラメソッドとのこと。
  • Spring Securityをpom.xmlに設定した時に出てくるログイン画面とコンソールに出てくる生成されたパスワードはSpring Boot のAutoConfigurationで出てくるように設定されているようだ。
  • MyChat.domain.service.room.LoginUserDetailsService.loadUserByUsername(String)をオーバーライドするとパスワードが出なくなるのは、@ConditionalOnMissingBeanがorg.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfigurationに設定されているため。
  • Collection<? extends GrantedAuthority>getAuthorities()の<? extends GrantedAuthority>がよく分からない。とりあえずcreateAuthorityListメソッドではSimpleGrantedAuthorityクラスのオブジェクトを格納するようだ。433pによると、Spring SecurityではROLE_で始まる権限情報をロールとして扱うようで、ROLE_プレフィックスは必ずいるようだ。
  • ピリオド3つは可変長引数を表す。
  • Spring Securityのログイン処理用フォームの入力値例外処理ってどうやるんだろうか。
  • ↑をやるためにログインフォームから認証処理までに一つコントローラを置いて、そこで認証処理をするようにしたら、Controllerからデフォルトの認証処理URL"/login"にフォワードさせると、何故かこのコントローラに書いた処理は全く使用されず、ログイン成功した。認証処理URLを"/login"から適当なものに変えると、このコントローラの処理は行われるが、認証処理URLには届かなくなった。どうやらサーブレットフィルタ等の設定をしなければならないらしい。
  • web.xmlをどこに配置すればいいか分からん。←基本的にSpring Bootではweb.xmlは使わない?
  • フォワードを許すには、springSecurityFilterChainの名前で登録されているフィルタの設定をいじる必要がある。設定を変えるにはAbstractSecurityWebApplicationInitializerを継承したクラスで色々やるらしい。
  • servletContext.getFilterRegistration(AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME).addMappingForUrlPatterns(EnumSet.of(DispatcherType.FORWARD), true, "/loginProcessing"); をWebSecurityConfigのconfigメソッドで実行する事でSpring Securityフィルタにログイン処理URLをマッピングしてFORWARDでもアクセスできるようにすることに成功した。