下記のエラーコードが原因で認証ができないと思います。
色々と変更を加えたり試しましたが認証できないので投稿しました。
アドバイスしていただけないでしょうか。
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','山田太郎');