質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Spring Security

Spring Securityは、Springのサブプロジェクトの一つでWebアプリケーションに必要な機能を追加します。正規ユーザーであるかを確認するための「認証機能」と、ユーザーのアクセスを制御する「認可機能」を簡単に追加することが可能です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

1回答

1907閲覧

Spring boot,Spring Securityを使用したform認証とGoogle OAuth2認証を併用したい

SuguruSasuo

総合スコア22

Spring Security

Spring Securityは、Springのサブプロジェクトの一つでWebアプリケーションに必要な機能を追加します。正規ユーザーであるかを確認するための「認証機能」と、ユーザーのアクセスを制御する「認可機能」を簡単に追加することが可能です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2022/06/26 13:20

私が無知の為、大変ご面倒おかけしますが、力を貸して下さい。

実現したいこと

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

12<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

どうかよろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

すいません。自己解決しました。
formログイン成功後のリクエスト先のパラメーターにOAuth2AuthenticationTokenを指定したのが原因でした。
考えてくださった方、ありがとうございました。

投稿2022/06/26 16:46

SuguruSasuo

総合スコア22

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問