前提として、一段階目の認証はSpringSecurityを利用したパスワード認証を行います。
一段階目の認証が成功した場合に、ワンタイムパスワード等で二段階目の認証を自作したいと思っています。
問題として、一段階目の認証がSuccessした時点でセッションに認可情報が設定されるため、二段階目の認証画面よりURL直入力によるアクセスが行われた場合、Controllerでの認可が通ってしまいます。※ControllerにてROLE認証を行っている。
そこで、一段階目の認証では仮のROLEを設定しておき、二段階目の認証時に正しいロールで更新ができれば。と考えたのですが、更新方法がわかりません。
以下に試行イメージのソースを記載します。下記の@PreAuthorizeアノテーションではUserDetailsのコンストラクタで登録されたロールで認証されているようです。
正しい更新方法や、別の推奨のアプローチなどありましたら、ご教示をお願いします。
UserDetailsインタフェースの実装
java
1public class SampleUserDetails extends User { 2 public SampleUserDetails(Account account) { 3 super(account.getUsername(), account.getPassword(), AuthorityUtils 4 .createAuthorityList("ROLE_HOGE")); // 仮のロール 5 this.account = account; 6 }
ワンタイムパスワード認証コントローラ
java
1@Controller 2public class OnetimeController { 3 public String execute() throws Exception { 4 // 以下、試行コード 5 Authentication auth = SecurityContextHolder.getContext().getAuthentication(); 6 List<GrantedAuthority> updatedAuthorities = new ArrayList<>(auth.getAuthorities()); 7 updatedAuthorities.add(new SimpleGrantedAuthority("ROLE_ADMIN")); //正しいロール 8 Authentication newAuth = new UsernamePasswordAuthenticationToken(auth.getPrincipal(), auth.getCredentials(), updatedAuthorities); 9 SecurityContextHolder.getContext().setAuthentication(newAuth); 10 11 ・ 12 ・ 13 ・ 14 }
ログイン成功時に表示する画面のコントローラ
java
1@Controller 2public class HomeController { 3 @PreAuthorize("hasRole('ROLE_ADMIN')") // ロール制御(ワンタイムパスワード認証前では「access denied」となってほしい) 4 public String execute() throws Exception { 5 ・ 6 ・ 7 ・ 8 }
あなたの回答
tips
プレビュー