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

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

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

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

Java

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

Spring Boot

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

Q&A

1回答

7627閲覧

spring security DB認証ができません

aaa11

総合スコア14

Spring Security

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

Java

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

Spring Boot

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

0グッド

0クリップ

投稿2021/03/17 02:27

下記のエラーコードが原因で認証ができないと思います。
色々と変更を加えたり試しましたが認証できないので投稿しました。
アドバイスしていただけないでしょうか。

java

1//エラーコード 2 32021-03-17 11:18:28.505 ERROR 20683 --- [nio-8080-exec-3] w.a.UsernamePasswordAuthenticationFilter : An internal error occurred while trying to authenticate the user. 4 5org.springframework.security.authentication.InternalAuthenticationServiceException: UserDetailsService returned null, which is an interface contract violation 6 at org.springframework.security.authentication.dao.DaoAuthenticationProvider.retrieveUser(DaoAuthenticationProvider.java:95) ~[spring-security-core-5.4.5.jar:5.4.5]

java

1//WebSecurityConfig.java 2 3@Configuration 4@EnableWebSecurity 5public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 6 7 @Bean 8 public PasswordEncoder passwordEncoder() { 9 return new BCryptPasswordEncoder(); //パスワードのハッシュ化でBCryptを使う 10 } 11 12 @Override 13 public void configure(WebSecurity web) throws Exception { 14 // セキュリティ設定を無視するリクエスト設定 15 // 静的リソースに対するアクセスはセキュリティ設定を無視する 16 web.ignoring().antMatchers("/css/**"); 17 } 18 19 @Override 20 protected void configure(HttpSecurity http) throws Exception { 21 http.authorizeRequests() // 認証が必要となるURLを設定 22 .antMatchers("/login/**").permitAll() // /loginは認証不要 23 .anyRequest().authenticated(); // それ以外はすべて認証 24 25 http.formLogin() 26 .loginPage("/login") // ログインフォームのパス 27 .loginProcessingUrl("/login") // 認証処理を起動させるパス 28 .usernameParameter("userId") 29 .passwordParameter("password"); // ユーザ名とパスワード 30 31 http.logout() 32 // ログアウト処理を起動させるパス 33 .logoutRequestMatcher(new AntPathRequestMatcher("/logout**")) 34 .logoutSuccessUrl("/login"); // ログアウト完了時のパス 35 36 } 37 @Configuration 38 protected static class AuthenticationConfiguration 39 extends GlobalAuthenticationConfigurerAdapter { 40 @Autowired 41 UserDetailsServiceImpl userDetailsService; 42 43 @Override 44 public void init(AuthenticationManagerBuilder auth) throws Exception { 45 auth.userDetailsService(userDetailsService) 46 .passwordEncoder(new BCryptPasswordEncoder()); 47 } 48 } 49}

java

1//LoginController.java 2 3@Controller 4public class LoginController { 5 @RequestMapping("/login") 6 public String login(Model model) { 7 model.addAttribute("title","ログイン画面"); 8 return "login"; 9 } 10 @PostMapping("/login") 11 public String user() { 12 return "user"; 13 } 14}

java

1//LoginUser.java 2 3@Entity 4@Table(name = "loginuser") 5@Data 6public class LoginUser implements UserDetails { 7 8 @Id 9 @Column(name = "user_Id") 10 private String userId; 11 12 @Column(name = "name") 13 private String name; 14 15 @Column(name = "password") 16 private String password; 17 18 @Override 19 public Collection<? extends GrantedAuthority> getAuthorities() { 20 return null; 21 } 22 @Override 23 public String getUsername() { 24 return this.userId; 25 } 26 @Override 27 public boolean isAccountNonExpired() { 28 return true; 29 } 30 @Override 31 public boolean isAccountNonLocked() { 32 return true; 33 } 34 @Override 35 public boolean isCredentialsNonExpired() { 36 return true; 37 } 38 @Override 39 public boolean isEnabled() { 40 return true; 41 } 42} 43

java

1//LoginRepository.java 2 3 public interface LoginRepository extends JpaRepository<LoginUser, String> { 4 LoginUser findByUserId(String userId); 5 }

java

1//UserDetailsServiceImpl.java 2 3@Service 4public class UserDetailsServiceImpl implements UserDetailsService { 5 6 @Autowired 7 private LoginRepository repository; 8 @Override 9 public UserDetails loadUserByUsername(String userId) throws UsernameNotFoundException { 10 LoginUser user = repository.findByUserId(userId); 11 return user; 12 }

html

1//login.html 2 3<!DOCTYPE html> 4<html xmlns:th ="http://www.thymeleaf.org"> 5<head> 6<meta charset="UTF-8"> 7<title th:text ="${title}"></title> 8</head> 9<body> 10<h1 th:text="${title}"></h1> 11<form method = "post" action = "#" th:action="@{/login}"> 12 <label for="userId">ユーザーID:</label> 13 <input id="userId" name="userId" type="text"><br> 14 <label for="password">パスワード:</label> 15 <input id="password" name="password" type="text"><br> 16 <input type="submit" value="ログイン"> 17 </form> 18</body> 19</html>

html

1//user.html 2 3<!DOCTYPE html> 4<html xmlns:th ="http://www.thymeleaf.org"> 5<head> 6<meta charset="UTF-8"> 7<title>ユーザー画面</title> 8</head> 9<body> 10<h1>ユーザー画面</h1> 11</body> 12</html>

DBTable

1CREATE TABLE company_db.loginuser 2( 3 user_Id VARCHAR(255) NOT NULL, 4 password VARCHAR(255) NOT NULL, 5 name VARCHAR(20) NOT NULL, 6 CONSTRAINT PRIMARY KEY (user_Id) 7); 8 9//インサートするパスワードは1111をハッシュ化した値 10INSERT INTO company_db.loginuser 11(`user_Id`,`password`,`name`)VALUES('1111','$2a$10$EKa6c8meutUMkLiF6e.so.7ky/d71a8zBnWJM122M..LYkMszx7jK','山田太郎');

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

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

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

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

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

K_3578

2021/03/17 02:36

まず、エラー文は読まれたのでしょうか。
aaa11

2021/03/17 02:48

はい、読んでます。
K_3578

2021/03/17 02:57

質問文に書かれていなければ質問者さんが読まれて、 意味を理解していたとしても理解した上でどのようにエラーを解消しようとしたかはわかりかねます。 エラーを解消するのにご自分でどういう事をしたかを追記してください。
guest

回答1

0

エラーログにUserDetailsServiceからnullが返ったとログが出ているので、DBからユーザを取得できていないように見えます。

とりあえずそのエラーが出ないようにするには、
UserDetailsServiceImplクラスのloadUserByUsernameで該当するユーザが存在しない場合はUsernameNotFoundExceptionをスローする必要があります。

投稿2021/03/19 05:40

_abc

総合スコア12

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

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

aaa11

2021/03/20 01:28

ありがとうございます。試してみます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問