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

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

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

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

Java

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

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Spring Boot

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

Q&A

解決済

2回答

1858閲覧

SpringSecurityでハッシュ化したパスワードでログインができない

takahiro00

総合スコア84

Spring Security

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

Java

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

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Spring Boot

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

0グッド

1クリップ

投稿2019/02/16 09:05

編集2019/03/01 13:27

前提・実現したいこと

SpringSecurityのPasswordEncoderでハッシュ化したパスワードでログインをすることができません。
やりたいこととしては、現在アカウントのパスワード変更機能を作ってるのですが、あらかじめハッシュ化してDBに登録していたパスワードを、画面から入力されたパスワードをハッシュ化してupdateをかけて新しいパスワードでログインできるようにしたいのですが、パスワードを変更した後、新しいパスワードでログインをすることができません。DBは更新されているのですが、、、
ご教授お願いいたします。

該当のソースコード

String newPassHash = passwordEncoder.encode(newPass);
↑newPassが新しく変更をするパスワードです。
passwordChangeService.passwordChangeGo(passwordChange);
↑でDBにupdateをかける処理をしています。(DBは確実に更新できてるので、記載を省略します。)

java

1 @RequestMapping(value = "password-change-go", method = RequestMethod.POST) 2 public ModelAndView passwordChangeGo(@Valid @ModelAttribute PasswordChange passwordChange, BindingResult bindingResult, 3 ModelAndView mav, Principal principal){ 4 //ログインユーザのメールアドレス取得 5 String address = principal.getName(); 6 //ログインユーザの現在のパスワードを取得 7 PasswordChangeCollation passwordChangeCollation = passwordChangeService.passwordChangeCol(address); 8 String dbPass = passwordChangeCollation.getPassword(); 9 //入力したパスワード 10 String inPass = passwordChange.getNowPassword(); 11 //パスワード照合 12 if (passwordEncoder.matches(inPass, dbPass)) { 13 System.out.println("一致"); 14 //新しいパスワードを取得 15 String newPass = passwordChange.getNewPassword(); 16 //確認用パスワードを取得 17 String conPass = passwordChange.getConfPassword(); 18 //新しいパスワードと確認用パスワードの照合 19 if(newPass.equals(conPass)){ 20 System.out.println("確認OK"); 21 //入力されたパスワードのハッシュ化 22 String newPassHash = passwordEncoder.encode(newPass); 23 passwordChange.setNewPasswordHash(passwordEncoder.encode(newPassHash)); 24 //パスワード変更処理 25 passwordChange.setUsername(address); 26 passwordChangeService.passwordChangeGo(passwordChange); 27 }else{ 28 System.out.println("確認NG"); 29 } 30 }else{ 31 System.out.println("不一致"); 32 } 33 return null; 34 }

ログイン部分?は以下です

java

1package com.kproject01.impl; 2 3import org.springframework.beans.factory.annotation.Autowired; 4import org.springframework.security.core.userdetails.UserDetails; 5import org.springframework.security.core.userdetails.UserDetailsService; 6import org.springframework.security.core.userdetails.UsernameNotFoundException; 7import org.springframework.stereotype.Service; 8 9import com.kproject01.data.LoginUserData; 10import com.kproject01.entity.MUser; 11import com.kproject01.repository.UserRepository; 12 13@Service 14public class LoginUserDetailsServiceImpl implements UserDetailsService { 15 16 @Autowired 17 UserRepository userRepository; 18 19 @Override 20 public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { 21 MUser user = userRepository.findByUsername(username); 22 23 if (user == null) { 24 throw new UsernameNotFoundException("not found"); 25 } 26 return new LoginUserData(user); 27 } 28 29} 30

一応コンフィグ部分も記載します。

java

1package com.kproject01.config; 2 3import org.springframework.context.annotation.Bean; 4import org.springframework.context.annotation.Configuration; 5import org.springframework.security.config.annotation.web.builders.HttpSecurity; 6import org.springframework.security.config.annotation.web.builders.WebSecurity; 7import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; 8import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; 9import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; 10import org.springframework.security.crypto.password.PasswordEncoder; 11 12@Configuration 13@EnableWebSecurity 14public class SecurityConfig extends WebSecurityConfigurerAdapter { 15 16 @Override 17 public void configure(WebSecurity web) throws Exception { 18 web.ignoring().antMatchers("/webjars/**", "/favicon.ico", "/css/**", 19 "/js/**", "/img/**"); 20 } 21 22 @Override 23 protected void configure(HttpSecurity http) throws Exception { 24 http.authorizeRequests().antMatchers("/") 25 .permitAll().antMatchers("/admin").hasRole("ADMIN") 26 .anyRequest().authenticated().and().formLogin() 27 .loginProcessingUrl("/authenticate").loginPage("/") 28 .failureUrl("/?error").defaultSuccessUrl("/user-top", true) 29 .usernameParameter("username").passwordParameter("password") 30 .and().logout().logoutSuccessUrl("/").and(); 31 } 32 33 @Bean 34 PasswordEncoder passwordEncoder() { 35 return new BCryptPasswordEncoder(); 36 } 37 38}

補足情報(FW/ツールのバージョンなど)

java8
SpringBoot2.0

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/02/16 10:52

ぱっとみ UserDetailsServie の読み込み先がメモリ(デフォルト)だな
takahiro00

2019/03/19 13:25

分からなすぎて死にそう
guest

回答2

0

DBのパラメータ使ってログインしたいなら
configファイルの方に

@Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailsService); } ``` が必要でuserDetailsServiceを継承したクラスにログインユーザ取得処理を書くって やり方が一般的です!

投稿2019/02/25 09:06

mk222222

総合スコア59

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

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

takahiro00

2019/03/01 13:23

回答ありがとうございます。 試してみたのですが、上記ソースをconfigファイルに記載するとuserDetailsServiceが見つからないと言われてしまうのですが、configファイルでuserDetailsServiceを継承するという事でしょうか???????
guest

0

自己解決

自己解決しました。
パスワードハッシュ化部分で二重にハッシュ化してました。

java

1//入力されたパスワードのハッシュ化 2 String newPassHash = passwordEncoder.encode(newPass); 3 passwordChange.setNewPasswordHash(passwordEncoder.encode(newPassHash)

以下のように直したら正常にパスワード変更してログインできました。

java

1//入力されたパスワードのハッシュ化 2 String newPassHash = passwordEncoder.encode(newPass); 3 passwordChange.setNewPasswordHash(newPassHash);

ご回答いただいた皆様
ありがとうございました。

投稿2019/05/03 10:47

takahiro00

総合スコア84

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問