Closed a-pompom closed 5 years ago
Security Context上のユーザ名は一意制約は設けるが、varcharを参照に持たせると将来的に投稿の検索などで動作が重くなることが懸念される。 よって、主キーのユーザIDをSecurity Context上へ持たせる手段がないか調査する。
以下のように実装した。
CustomUserの生成 →認証処理で利用するUserクラスはコンストラクタにはユーザ名・パスワードを必要としているが、フィールドには自由に値を持たせられる。 よって、今回はSpring SecurityのUserクラスを継承したCusotmUserクラスを生成し、プロパティとしてDBの主キーのユーザIDを追加した。
投稿登録処理の実装 →登録処理自体はユーザ情報の登録と同様の流れで実装でき、サービス内で投稿と投稿者を結びつけるためにセッションから取得したユーザIDを投稿エンティティへセットした。 具体的な取得処理は以下のようになる。
private void setUserID(HomeDto dto) { //セッション上のユーザID情報を取得 Authentication auth = SecurityContextHolder.getContext().getAuthentication(); CustomUser user = (CustomUser)auth.getPrincipal();
//投稿情報に投稿者情報を紐付け
dto.getPost().setPostUserId(user.getUserId());
}
---
今回の参考情報:
[CustomUserの生成](https://stackoverflow.com/questions/22678891/how-to-get-user-id-from-customuser-on-spring-security)
DBへ投稿情報を登録した際にリダイレクトをしているが、 これは直接initメソッドを呼び出すと、POSTパラメータが残った状態となり、 URLへ載ってしまいセキュリティ上の問題が発生することに起因している。 リダイレクトでは同画面のフォワードのような動作をし、一度POSTパラメータを破棄した後にGETリクエストを同画面へ発行するので、安全に画面遷移ができるようになる。
Security Conxtexへユーザ情報を持たせることができるようになったので、 次のステップとして、投稿をDBへ保存する機能を実装する。
上記ステップで実装を進めていく。