Spring Boot
を利用したアプリケーションを構築する際、
Spring Security
で認証を行ったあと、認証済みのユーザ情報を各Controllerで簡単に受け取ることができます。
WebSecurityConfigurerAdapter
を継承したクラスに@EnableWebSecurity
アノテーションを付与します
import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; @Configuration @EnableWebSecurity public class AppWebSecurity extends WebSecurityConfigurerAdapter { ・・・ }
本サンプルでは独自のユーザ情報(以下クラス)を定義し、認証時にUserDetailsService
を実装したクラスがこのユーザ情報を返すようにしておきます。
(このエントリでは、UserDetailsServiceの実装クラスの記述を省略しています)
import lombok.AllArgsConstructor; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; import java.util.Collection; @AllArgsConstructor public final class AppUserDetail implements UserDetails { private final AppUser appUser; private final Collection<? extends GrantedAuthority> authorities; @Override public Collection<? extends GrantedAuthority> getAuthorities() { return authorities; } @Override public String getPassword() { return appUser.getPassword(); } @Override public String getUsername() { return appUser.getStaffName(); } @Override public boolean isAccountNonExpired() { return appUser.isEnabled(); } @Override public boolean isAccountNonLocked() { return appUser.isEnabled(); } @Override public boolean isCredentialsNonExpired() { return appUser.isEnabled(); } @Override public boolean isEnabled() { return appUser.isEnabled(); } }
コントローラに定義したメソッドの引数に@AuthenticationPrincipal
アノテーションを付与します。
こうすると、その引数に認証したユーザ情報が自動的に渡されるようになります。
import lombok.extern.slf4j.Slf4j; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller @Slf4j public class DebugController { @RequestMapping({"/debug"}) public String debug(@AuthenticationPrincipal AppUserDetail userDetail) { log.info("debug: {}", userDetail); return "user"; } }