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

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

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

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

Spring Boot

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

Q&A

解決済

1回答

921閲覧

SpringSecurityを使ったログイン認証がしたい

yys949

総合スコア9

Spring Security

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

Spring Boot

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

0グッド

0クリップ

投稿2020/06/29 11:13

編集2020/06/29 11:54

前提・実現したいこと

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で入力されたパスワードをハッシュ化し取得しするようにしています。
ただ今のままだと、入力されたパスワードと保存されているパスワードそれぞれのハッシュ化した値が異なるのか認証されません。
平文だと認証するのですが、、、

ハッシュ化し保存したパスワードで認証を行うにはどこを修正すればうまくいくのでしょうか。

全然見当がつかず、申し訳ないのですが、教えていただけないでしょうか。
よろしくお願いします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/06/29 11:44

ぱっとみ「JpaUserDetailsServiceImpl 」は呼ばれてますか?
yys949

2020/06/29 11:55

失礼しました。 ソースコピペしてきたつもりが読んでいるところを書いていなかったです。
退会済みユーザー

退会済みユーザー

2020/06/29 12:01

> UserDetails userDetails = (UserDetails)new User(user.getUserName(),encoder.encode(user.getPassword()),grantList); 暗号化済みのを暗号化してる? それとも平文を暗号化してる?
yys949

2020/06/29 12:07

よくみたら暗号化済みをさらに暗号化していました。 すでに暗号化済みで取得できていたのに平文を暗号化して照合させているものと勘違いしてさらに暗号化させていたためおかしなことになっているようでした。
guest

回答1

0

自己解決

asahina1979様の

UserDetails userDetails = (UserDetails)new User(user.getUserName(),encoder.encode(user.getPassword()),grantList);

暗号化済みのを暗号化してる?
それとも平文を暗号化してる?

とのコメントより、よく確認したところ暗号化済みのものをまた暗号化していました。

BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(); UserDetails userDetails = (UserDetails)new User(user.getUserName(),encoder.encode(user.getPassword()),grantList);

としていたところを、

// BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(); //UserDetailsはインタフェースなのでUserクラスのコンストラクタで生成したユーザオブジェクトを UserDetails userDetails = (UserDetails)new User(user.getUserName(), user.getPassword(),grantList);

とし暗号化したものを取得するだけにしたら問題なく認証ができました。

投稿2020/06/29 12:08

yys949

総合スコア9

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問