覚えたら書く

IT関係のデベロッパとして日々覚えたことを書き残したいです。twitter: @yyoshikaw

Spring Boot - Controllerで認証済みのユーザ情報を受け取る

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";
    }
}