前提・実現したいこと
SpringSecurityを使ったログイン認証機能を作っています。
新しいユーザーの登録機能を実装したのですが、その時にパスワードはハッシュ化して保存するようにしました。
ハッシュ化したのはいいんですが、認証ができずに困っています。
JpaUserDetailsServiceImpl.java
1@Component 2@Service 3public class JpaUserDetailsServiceImpl implements UserDetailsService { 4 5 //DBからユーザ情報を検索するメソッドを実装したクラス 6 @Autowired 7 private LoginUserDao userDao; 8 9 @Autowired 10 HttpSession session; 11 12 13 14 /** 15 * UserDetailsServiceインタフェースの実装メソッド 16 * フォームから取得したユーザ名でDBを検索し、合致するものが存在したとき、 17 * パスワード、権限情報と共にUserDetailsオブジェクトを生成 18 * コンフィグクラスで上入力値とDBから取得したパスワードと比較し、ログイン判定を行う 19 */ 20 @Override 21 public UserDetails loadUserByUsername(String userId) throws UsernameNotFoundException { 22 23 UserEntity user = userDao.findUser(userId); 24 25 if (user == null) { 26 throw new UsernameNotFoundException("User" + userId + "was not found in the database"); 27 } 28 29 session.setAttribute("userId", userId); 30 31 List<GrantedAuthority> grantList = new ArrayList<GrantedAuthority>(); 32 GrantedAuthority authority = new SimpleGrantedAuthority("USERS"); 33 grantList.add(authority); 34 35 BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(); 36 37 UserDetails userDetails = (UserDetails)new User(user.getUserName(),encoder.encode(user.getPassword()),grantList); 38 39 return userDetails; 40 } 41} 42
WebSecurityConfig.java
1@Configuration 2@EnableWebSecurity 3public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 4 5 @Autowired 6 private JpaUserDetailsServiceImpl userDetailsService; 7 8 @Autowired 9 private SuccessHandler successHandler; 10 11 @Autowired 12 private FailureHandler failureHandler; 13 14 @Override 15 public void configure(WebSecurity web) throws Exception { 16 web.ignoring().antMatchers( 17 "/images/**", 18 "/css/**", 19 "/js/**" 20 ); 21 } 22 23 @Override 24 protected void configure(HttpSecurity http) throws Exception { 25 http 26 .authorizeRequests() 27 .antMatchers("/add/**").permitAll() 28 .anyRequest().authenticated() 29 .and() 30 .formLogin() 31 .loginPage("/login") 32 .loginProcessingUrl("/index") 33 .failureUrl("/login?error") 34 .defaultSuccessUrl("/index") 35 .usernameParameter("userId") 36 .passwordParameter("password").permitAll() 37 .successHandler(successHandler) 38 .failureHandler(failureHandler) 39 .and() 40 .logout() 41 .logoutUrl("/logout") 42 .logoutSuccessUrl("/login?logout") 43 .permitAll(); 44 } 45 46 @Bean 47 PasswordEncoder passwordEncod() { 48 return new BCryptPasswordEncoder(); 49 } 50 51 @Autowired 52 public void configure(AuthenticationManagerBuilder auth) throws Exception{ 53 auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder()); 54 } 55 56} 57
LoginController.java
1@Controller 2public class LoginController { 3 4 @Autowired 5 UserForm userForm; 6 7 @Autowired 8 UserService userService; 9 10 @Autowired 11 private LoginUserDao userDao; 12 13 @Autowired 14 HttpSession session; 15 16 @GetMapping({ "/", "/login" }) 17 public String loginForm(UserForm userForm, Model model) { 18 19 return "/login"; 20 } 21 22 @GetMapping("/index") 23 public String afterLogin(Model model) { 24 25 String userId = (String) session.getAttribute("userId"); 26 UserEntity userInfo = userDao.findUser(userId); 27 model.addAttribute("loginUser", userInfo); 28 29 System.out.println(userInfo.getPassword()); 30 31 return "/index"; 32 } 33 34} 35
WebSecurityConfig.javaでBCryptPasswordEncoderを設定して、JpaUserDetailsServiceImplで入力されたパスワードをハッシュ化し取得しするようにしています。
ただ今のままだと、入力されたパスワードと保存されているパスワードそれぞれのハッシュ化した値が異なるのか認証されません。
平文だと認証するのですが、、、
ハッシュ化し保存したパスワードで認証を行うにはどこを修正すればうまくいくのでしょうか。
全然見当がつかず、申し訳ないのですが、教えていただけないでしょうか。
よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー