私が無知の為、大変ご面倒おかけしますが、力を貸して下さい。
実現したいこと
SpringSecurityを使用して、同じログイン画面でform認証とGoogle OAuth2認証を併用したいです。
起こっている問題
Google OAuth2認証はログイン出来、画面遷移するが、form認証を行うと、以下のエラーメッセージが現れてログインが出来ない。
ErrorMessage
1java.lang.IllegalStateException: Current user principal is not of type [org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken]: UsernamePasswordAuthenticationToken [Principal=com.test.main.AuthUserDetails@62f854e2, Credentials=[PROTECTED], Authenticated=true, Details=WebAuthenticationDetails [RemoteIpAddress=0:0:0:0:0:0:0:1, SessionId=9793C4B6FBC9D3FA656F567410ED74E3], Granted Authorities=[USER]] 2 at org.springframework.web.servlet.mvc.method.annotation.ServletRequestMethodArgumentResolver.resolveArgument(ServletRequestMethodArgumentResolver.java:169) ~[spring-webmvc-5.3.13.jar:5.3.13] 3 at org.springframework.web.servlet.mvc.method.annotation.ServletRequestMethodArgumentResolver.resolveArgument(ServletRequestMethodArgumentResolver.java:124) ~[spring-webmvc-5.3.13.jar:5.3.13] 4 at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) ~[spring-web-5.3.13.jar:5.3.13] 5
エラーが出ている該当のソースコード
Java:AuthUserDetails.java
1package com.test.main; 2 3import java.util.Collection; 4 5import org.springframework.security.core.GrantedAuthority; 6import org.springframework.security.core.userdetails.UserDetails; 7 8public class AuthUserDetails implements UserDetails { 9 10 private AuthEntity auth; 11 private Collection<GrantedAuthority> authorities; 12 13 public AuthUserDetails() {} 14 15 public AuthUserDetails(AuthEntity auth, Collection<GrantedAuthority> authorities) { 16 this.auth = auth; 17 this.authorities = authorities; 18 } ←ここでエラー発生 19 20 @Override 21 public Collection<? extends GrantedAuthority> getAuthorities() { 22 return this.authorities; 23 } 24 25 @Override 26 public String getPassword() { 27 return auth.getPassword(); 28 } 29 30 @Override 31 public String getUsername() { 32 return auth.getUsername(); 33 } 34 35 @Override 36 public boolean isAccountNonExpired() { 37 return true; 38 } 39 40 @Override 41 public boolean isAccountNonLocked() { 42 return true; 43 } 44 45 @Override 46 public boolean isCredentialsNonExpired() { 47 return true; 48 } 49 50 @Override 51 public boolean isEnabled() { 52 return true; 53 } 54}
関係があると思っているソースコード
HTML:login.html
1略 2<body> 3 <div> 4 <div> 5 <form action="#" th:action="@{/login}" method="post" th:object="${loginForm}" id="loginF"> 6 <input type="text" id="username" name="username" placeholder="メールアドレス" /> 7 <input type="password" id="password" name="password" placeholder="パスワード" /> 8 <button type = "submit"> 9 </form> 10 <div> 11 <a th:href="@{/oauth2/authorization/google}" class="anchor"><span>Googleアカウントでログイン</span></a> 12 </div> 13 </div> 14 </div> 15</body> 16</html>
Java:DbSecurityConfig.java
1package com.test.main; 2 3import org.springframework.beans.factory.annotation.Autowired; 4import org.springframework.context.annotation.Bean; 5import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; 6import org.springframework.security.config.annotation.web.builders.HttpSecurity; 7import org.springframework.security.config.annotation.web.builders.WebSecurity; 8import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; 9import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; 10import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; 11import org.springframework.security.crypto.password.PasswordEncoder; 12import org.springframework.security.web.firewall.DefaultHttpFirewall; 13 14import com.komesuku.main.model.service.AuthAccountService; 15 16@EnableWebSecurity 17public class DbSecurityConfig extends WebSecurityConfigurerAdapter { 18 19 @Autowired 20 private AuthAccountService userDetailsService; 21 22 @Bean 23 public PasswordEncoder passwordEncoder() { 24 return new BCryptPasswordEncoder(); 25 } 26 27 @Override 28 public void configure(WebSecurity web) { 29 DefaultHttpFirewall firewall = new DefaultHttpFirewall(); 30 web.httpFirewall(firewall); 31 } 32 33 @Override 34 protected void configure(HttpSecurity http) throws Exception { 35 http.authorizeRequests().antMatchers("/css/**", "/png/**", "/js/**", "/regist", "/forgot", "/message", "/registPass", "/registPassDone", "/reYesterday").permitAll() 36 .anyRequest().authenticated() 37 .and() 38 .formLogin() 39 .loginPage("/login").permitAll() 40 .defaultSuccessUrl("/success",true) 41 .and() 42 .oauth2Login() 43 .loginPage("/login").permitAll() 44 .defaultSuccessUrl("/success",true) 45 .and() 46 .logout().logoutUrl("/logout").logoutSuccessUrl("/login").permitAll(); 47 http.requiresChannel().anyRequest().requiresSecure(); 48 } 49 50 @Override 51 protected void configure(AuthenticationManagerBuilder auth) throws Exception { 52 auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder()); 53 } 54} 55
Java:AuthAccountService.java
1package com.test.main.model.service; 2 3import org.springframework.beans.factory.annotation.Autowired; 4import org.springframework.jdbc.core.JdbcTemplate; 5import org.springframework.security.core.authority.AuthorityUtils; 6import org.springframework.security.core.userdetails.UserDetails; 7import org.springframework.security.core.userdetails.UserDetailsService; 8import org.springframework.security.core.userdetails.UsernameNotFoundException; 9import org.springframework.stereotype.Service; 10import org.springframework.transaction.annotation.Transactional; 11import org.springframework.util.ObjectUtils; 12 13import com.komesuku.main.AuthEntity; 14import com.komesuku.main.AuthMapper; 15import com.komesuku.main.AuthUserDetails; 16 17@Service 18public class AuthAccountService implements UserDetailsService { 19 20 @Autowired 21 private AuthMapper mapper; 22 23 @Autowired 24 JdbcTemplate jdbcTemplate; 25 26 @Override 27 public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { 28 if(ObjectUtils.isEmpty(username)) { 29 throw new UsernameNotFoundException("ユーザー名を入力してください"); 30 } 31 AuthEntity auth = mapper.findByUsername(username); 32 if(auth == null) { 33 throw new UsernameNotFoundException("ユーザーが見つかりません"); 34 } 35 36 return new AuthUserDetails(auth, AuthorityUtils.createAuthorityList("USER")); 37 38 } 39} 40
Java:AuthEntity.java
1package com.test.main; 2 3import javax.validation.constraints.NotBlank; 4import javax.validation.constraints.Size; 5 6import lombok.Data; 7 8@Data 9public class AuthEntity { 10 11 public AuthEntity(String username, String password) { 12 this.username = username; 13 this.password = password; 14 } 15 16 @NotBlank(message="必須項目です") 17 @Size(max=50,message="必須項目です") 18 private String username; 19 20 @NotBlank(message="必須項目です") 21 @Size(max=100,message="必須項目です") 22 private String password; 23 24} 25
試した事
・エラーメッセージより、form認証がGoogle OAuth認証だと判断されている為、Webセキュリティコンフィグに@Orderを設置し順番を指定した
→ 結果同じエラー
参考資料
・第4回:Spring Security 5でサポートされたOAuth 2.0 Loginの動作をカスタマイズしてみる
https://qiita.com/kazuki43zoo/items/53804e18337933a77ad0#%E7%8B%AC%E8%87%AA%E8%AA%8D%E8%A8%BC%E3%81%A8oauth-20-login%E6%A9%9F%E8%83%BD%E3%81%AE%E4%BD%B5%E7%94%A8
・Spring Security 使い方メモ 認証・認可
https://qiita.com/opengl-8080/items/032ed0fa27a239bdc1cc
どうかよろしくお願い致します。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。