

Springでログイン機能の実装を行っています。  
以下の記事を参考にしました。

[Spring-Bootでログイン機能を実装してみる -
Qiita](https://qiita.com/a-pompom/items/80b3f4bb6414e8678829)

段階を踏んで実装を行っていて、formからsubmitした際に値の判定を行わずに、ただ他の画面に変遷するような機能をまず実装していました。

formで値を入力して、successForwardUrlで対象のURL（hello）に飛んで欲しいのですが、上手くいきません。  
login?errorの画面にいってしまいます。

記述に何か不備があるのでしょうか？

どなたか分かる方がいれば、よろしくお願いします。

### フォルダ構成

[![画像の説明をここに入力](https://i.stack.imgur.com/pNVf8.png)](https://i.stack.imgur.com/pNVf8.png)

### ソースコード

**list.html**

[code]

    <!doctype html>
    <html xmlns:th="http://www.thymeleaf.org">
    <head th:replace="~{layout/component :: head('ログイン')}">
    <body>
    <th:block th:replace="~{layout/component :: header}"></th:block>
    <div class="container">
        <th:block th:replace="~{layout/component :: container_top('ログイン')}"></th:block>
        <div class="row justify-content-start">
            <form method="post" th:action="@{/sign_in}">
                <table class="table table-bordered">
                    <tr>
                        <td>
                            <label>ログインID</label>
                        </td>
                        <td>
                            <input type="text" name="username">
                        </td>
                    </tr>
                    <tr>
                        <td>
                            <label>パスワード</label>
                        </td>
                        <td>
                            <input type="password" name="password">
                        </td>
                    </tr>
                </table>
                <div class="mb-3">
                    <input type="submit" value="確認" class="btn btn-outline-secondary">
                </div>
            </form>
        </div>
    </div>
    <footer th:replace="~{layout/component :: footer}"></footer>
    </body>
    </html>
    
[/code]

**WebSecurityConfig.java**

[code]

    package com.example.demo.login;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.config.annotation.web.builders.WebSecurity;
    import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
    import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
    import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
    @Configuration
    @EnableWebSecurity
    public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    
    
    
        //フォームの値と比較するDBから取得したパスワードは暗号化されているのでフォームの値も暗号化するために利用
        @Bean
        public BCryptPasswordEncoder passwordEncoder() {
            BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
            return bCryptPasswordEncoder;
        }
    
        @Override
        public void configure(WebSecurity web) throws Exception {
            web.ignoring().antMatchers(
                                "/images/**",
                                "/css/**",
                                "/javascript/**"
                                );
        }
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                .authorizeRequests()
                    .anyRequest().authenticated()
                    .and()
                .formLogin()
                    .loginPage("/login") //ログインページはコントローラを経由しないのでViewNameとの紐付けが必要
                    .loginProcessingUrl("/sign_in") //フォームのSubmitURL、このURLへリクエストが送られると認証処理が実行される
                    .usernameParameter("username") //リクエストパラメータのname属性を明示
                    .passwordParameter("password")
                    .successForwardUrl("/hello")
                    .failureUrl("/login?error")
                    .permitAll()
                    .and()
                .logout()
                    .logoutUrl("/logout")
                    .logoutSuccessUrl("/login?logout")
                    .permitAll();
        }
    }
    
[/code]

**MvcConfig.java**

[code]

    package com.example.demo.login;
    
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    
    @Configuration
    public class MvcConfig implements WebMvcConfigurer {
    
        /**
         * 「/login」というURLからlogin.htmlを呼び出す
         */
        public void addViewControllers(ViewControllerRegistry registry) {
            registry.addViewController("/login").setViewName("login");
        }
    
    }
    
[/code]


CC BY-SA 4.0
2021-03-21T01:38:11.990
74796
2021-03-22T17:48:32.837
2021-03-21T06:09:46.283
3060
44420
question
java spring spring-security
SpringSecurity　ログイン機能　formで変遷する時に必ずfailureUrlに飛ばされてしまう


リンク先の実装をどこまでされているか分かりませんが、質問文中のコードだけで判断すると、エンコーダ指定を行っているのが間違っています(ので常に認証失敗します)。

デフォルトでは `DelegatingPasswordEncoder` 形式([参考](https://docs.spring.io/spring-
security/site/docs/5.4.5/reference/html5/#authentication-password-storage-dpe-
format))で保持されているので、下記を削除する必要があります。

[code]

        @Bean
        public BCryptPasswordEncoder passwordEncoder() {
            BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
            return bCryptPasswordEncoder;
        }
    
[/code]

リンク先のコードでは [この辺り](https://github.com/a-pompom/spring-boot-
login_app_demo/blob/6ead60a0bd22226622cb39422aff6e2bcb6ce4e6/src/main/java/login/app/config/WebSecurityConfig.java#L83)
で手当しています(がQiita記事中では触れられていないようです)。

* * *

該当Qiita記事は他者が読んでわかりやすい記事とは思いませんので、別のサンプルコードを探された方が良いかと思います。


CC BY-SA 4.0
2021-03-21T10:38:44.410
74799
2021-03-22T17:48:32.837
2021-03-22T17:48:32.837
2808
2808
74796
answer