下記のエラーコードが原因で認証ができないと思います。
色々と変更を加えたり試しましたが認証できないので投稿しました。
アドバイスしていただけないでしょうか。
java
//エラーコード 2021-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. org.springframework.security.authentication.InternalAuthenticationServiceException: UserDetailsService returned null, which is an interface contract violation at org.springframework.security.authentication.dao.DaoAuthenticationProvider.retrieveUser(DaoAuthenticationProvider.java:95) ~[spring-security-core-5.4.5.jar:5.4.5]
java
//WebSecurityConfig.java @Configuration @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); //パスワードのハッシュ化でBCryptを使う } @Override public void configure(WebSecurity web) throws Exception { // セキュリティ設定を無視するリクエスト設定 // 静的リソースに対するアクセスはセキュリティ設定を無視する web.ignoring().antMatchers("/css/**"); } @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() // 認証が必要となるURLを設定 .antMatchers("/login/**").permitAll() // /loginは認証不要 .anyRequest().authenticated(); // それ以外はすべて認証 http.formLogin() .loginPage("/login") // ログインフォームのパス .loginProcessingUrl("/login") // 認証処理を起動させるパス .usernameParameter("userId") .passwordParameter("password"); // ユーザ名とパスワード http.logout() // ログアウト処理を起動させるパス .logoutRequestMatcher(new AntPathRequestMatcher("/logout**")) .logoutSuccessUrl("/login"); // ログアウト完了時のパス } @Configuration protected static class AuthenticationConfiguration extends GlobalAuthenticationConfigurerAdapter { @Autowired UserDetailsServiceImpl userDetailsService; @Override public void init(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailsService) .passwordEncoder(new BCryptPasswordEncoder()); } } }
java
//LoginController.java @Controller public class LoginController { @RequestMapping("/login") public String login(Model model) { model.addAttribute("title","ログイン画面"); return "login"; } @PostMapping("/login") public String user() { return "user"; } }
java
//LoginUser.java @Entity @Table(name = "loginuser") @Data public class LoginUser implements UserDetails { @Id @Column(name = "user_Id") private String userId; @Column(name = "name") private String name; @Column(name = "password") private String password; @Override public Collection<? extends GrantedAuthority> getAuthorities() { return null; } @Override public String getUsername() { return this.userId; } @Override public boolean isAccountNonExpired() { return true; } @Override public boolean isAccountNonLocked() { return true; } @Override public boolean isCredentialsNonExpired() { return true; } @Override public boolean isEnabled() { return true; } }
java
//LoginRepository.java public interface LoginRepository extends JpaRepository<LoginUser, String> { LoginUser findByUserId(String userId); }
java
//UserDetailsServiceImpl.java @Service public class UserDetailsServiceImpl implements UserDetailsService { @Autowired private LoginRepository repository; @Override public UserDetails loadUserByUsername(String userId) throws UsernameNotFoundException { LoginUser user = repository.findByUserId(userId); return user; }
html
//login.html <!DOCTYPE html> <html xmlns:th ="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title th:text ="${title}"></title> </head> <body> <h1 th:text="${title}"></h1> <form method = "post" action = "#" th:action="@{/login}"> <label for="userId">ユーザーID:</label> <input id="userId" name="userId" type="text"><br> <label for="password">パスワード:</label> <input id="password" name="password" type="text"><br> <input type="submit" value="ログイン"> </form> </body> </html>
html
//user.html <!DOCTYPE html> <html xmlns:th ="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>ユーザー画面</title> </head> <body> <h1>ユーザー画面</h1> </body> </html>
DBTable
CREATE TABLE company_db.loginuser ( user_Id VARCHAR(255) NOT NULL, password VARCHAR(255) NOT NULL, name VARCHAR(20) NOT NULL, CONSTRAINT PRIMARY KEY (user_Id) ); //インサートするパスワードは1111をハッシュ化した値 INSERT INTO company_db.loginuser (`user_Id`,`password`,`name`)VALUES('1111','$2a$10$EKa6c8meutUMkLiF6e.so.7ky/d71a8zBnWJM122M..LYkMszx7jK','山田太郎');
まだ回答がついていません
会員登録して回答してみよう