やりたいこと
SpringBootにおいて、フロント側でログインしているユーザーの情報を扱いたい。ユーザーidごとに表示を変えたり、ログインしているロールによって表示を変えたりなどが柔軟に表現できる。
手順
いかに大まかな手順をメモ。
DAOでサーバー側からユーザー情報を取得
これはシンプルにapiを叩いてユーザー情報を取得するDAOを実装するだけ。略。
UserDetailsServiceを実装したクラスの作成
UserDetailsServiceはSpringBootが提供するインターフェースである。抽象メソッドであるloadUserByUsernameをオーバーライドする。このメソッドはUserDetails型のオブジェクトを返却するように実装する。
@Service
public class UserDetailsServiceImpl implements UserDetailsService {
private final Dao dao;
public UserDetailsServiceImpl(Dao Dao) {
this.dao = dao;
}
@Override
public UserDetails loadUserByUsername(String username) {
/** daoからuser情報を取ってくる処理
* 略
*/
// UserDetails型のオブジェクトをreturn
return loginUser;
}
}
WebSecurityConfigurerAdapterクラスを継承したクラスを実装
WebSecurityConfigurerAdapterクラスもSpringBootが提供するクラスであり、内部で先ほど実装したUserDetailsServiceImplをインジェクトすれば良い。
@EnableWebSecurity
public class LoginUserConfig extends WebSecurityConfigurerAdapter {
@Autowired
UserDetailsServiceImpl userDetailsServiceImpl;
}
ここで@EnableWebSecurityアノテーションも忘れないこと。
呼び出し
ここまでできれば後は、コントローラー側からloginユーザーの情報をバインドできる。
@Controller
@RequestMapping("/hoge")
public class HogeController {
/** 諸々省略
* コンストラクタ、インジェクション、など
*/
@GetMapping(path = "/fuga")
public String fuga(@AuthenticationPrincipal LoginUser loginUser) {
// 処理
}
}
ここではLoginUserはUserDetailsを継承したクラスとしている。
これでコントローラーのメソッド内でログインユーザーの情報が扱えるようになる。