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

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

ただいまの
回答率

90.76%

  • Java

    13155questions

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

  • Spring

    639questions

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

  • Spring Boot

    446questions

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

Springセキュリティにあるログイン機能の動きについて

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 231

a0841_1974

score 15

いつもお世話になっております。

Springセキュリティにあるログイン機能を使用した際の動きについて
分からない事があります。
ご存知の方がいらっしゃれば教えて頂けますでしょうか。

【ご質問】
以下のようなconfig、ログイン画面、menu画面、コントローラーがあります。
この状態で、ログイン画面から担当者IDにadmin、パスワードにadminを入力して
ログインボタンを押すと、何故か再度ログイン画面が表示されます。

ログインボタンを押すと、menu画面に遷移させたいのですが、
どのようにすればmenu画面に遷移できるのでしょうか。

(補足)
1.コントローラーのreturn "login/login";、return "login/menu";にbreakpointをはり、
ログインボタンを押した際にどちらに来るかを確認したところ、
return "login/login";に来ました。

2.configのweb.ignoring().antMatchers()に/**を追加して、
ログイン画面から担当者IDにadmin、パスワードにadminを入力して
ログインボタンを押すとmenu画面に遷移できました。

config

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter  {

    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/static/**","/fonts/**","/jasperreports/**");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
           .authorizeRequests()
               .antMatchers("/trans/**").permitAll()
               .anyRequest().authenticated()
           .and()
           .formLogin()
           .loginPage("/login")
           .usernameParameter("tantousya_id")
           .passwordParameter("password")
           .permitAll();

    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
           .inMemoryAuthentication()
           .withUser("test1").password("test1").roles("USER")
           .and()
           .withUser("admin").password("admin").roles("USER","ADMIN");


    }
}


ログイン画面

<form id="loginForm" method="POST" action="/login/login" >
  <div class="form-group">
    <label for="uname1">担当者ID</label>
    <input type="text" id="tantousya_id" name="tantousya_id" class="form-control form-control-lg rounded-0" required="required" >
  </div>
  <div class="form-group">
    <label for="uname1">パスワード</label>
    <input type="password" id="password" name="password" class="form-control form-control-lg rounded-0" required="required" >
  </div>
  <button class="btn btn-success btn-lg float-right" id="btnLogin" type="submit">ログイン</button>
</form>


コントローラー

@Controller
@Scope("request")
@RequestMapping(value="/login")
public class RegistContainerLogic {

  @RequestMapping(method=RequestMethod.GET)
  public String index(Model model){
      return "login/login";
  }

  @RequestMapping(value="/login", method=RequestMethod.POST)
  public String login(@ModelAttribute("formModel") RegistForm input,Model model){
      model.addAttribute("tantousya_id", input.getTantousya_id());
      return "login/menu";
  }
}


menu画面

<!DOCTYPE html>
<html lang="ja" xmlns="http://www.thymleaf.org">
  <head>
    <meta http-equiv="Content-type" content="text/html; charset=UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>menu</title>
    <link rel="stylesheet" th:href="@{/webjars/bootstrap/4.0.0-1/css/bootstrap.min.css}" />
  </head>
  <body>
   <td th:text="${tantousya_id}"></td>

    <script type="text/javascript" th:src="@{/webjars/jquery/3.3.1/jquery.min.js}"></script>
    <script type="text/javascript" th:src="@{/webjars/bootstrap/4.0.0-1/js/bootstrap.min.js}"></script>
  </body>
</html>


RegistForm

public class RegistForm implements Serializable {

    private static final long serialVersionUID = 1L;

    private String tantousya_id;
    private String password;

    public String getTantousya_id() {
        return tantousya_id;
    }
    public void setTantousya_id(String tantousya_id) {
        this.tantousya_id = tantousya_id;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}


以上です。
よろしくお願いいたします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

以下の内容でmenu画面に遷移する事が出来ました。

config 

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter  {

    // SpringSecurityの制限を無視してほしい場所の指定
    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/static/**","/fonts/**","/jasperreports/**","/webjars/**");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
           .authorizeRequests()
           .antMatchers("/login").permitAll()
           .anyRequest().authenticated();

        http
           .formLogin()
               .loginPage("/login")
               .usernameParameter("tantousya_id")
               .passwordParameter("password")
               .successForwardUrl("/menu")
               .failureForwardUrl("/login_failure")
               .permitAll()
               .and()
           .logout()
               .permitAll();

    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        PasswordEncoder passwordEncoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
        auth
           .inMemoryAuthentication()
           .withUser("user").password(passwordEncoder.encode("password")).roles("USER")
           .and()
           .withUser("admin").password(passwordEncoder.encode("password")).roles("ADMIN");

    }

ログイン

                  <form id="loginForm" method="POST" th:action="@{/login}" >
                    <div class="form-group">
                      <label for="uname1">担当者ID</label>
                      <input type="text" id="tantousya_id" name="tantousya_id" class="form-control form-control-lg rounded-0" required="required" >
                    </div>
                    <div class="form-group">
                      <label for="uname1">パスワード</label>
                      <input type="password" id="password" name="password" class="form-control form-control-lg rounded-0" required="required" >
                    </div>
                    <button class="btn btn-success btn-lg float-right" id="btnLogin" type="submit">ログイン</button>
                  </form>

コントローラー

@Controller
@Scope("request")
public class RegistContainerLogic {

    @RequestMapping(value="/login", method=RequestMethod.GET)
     public String index(Model model){
        return "login/login";
    }

    @RequestMapping(value="/menu", method=RequestMethod.POST)
    public String menu(@ModelAttribute("formModel") RegistForm input,Model model){
        model.addAttribute("tantousya_id", input.getTantousya_id());
        return "login/menu";
    }

    @RequestMapping(value="/login_failure", method=RequestMethod.POST)
    public String login_failure(@ModelAttribute("formModel") @Validated RegistForm input,BindingResult result,Model model){
        return "login/login";
    }
}


menu画面,RegistFormの修正はありません。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Java

    13155questions

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

  • Spring

    639questions

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

  • Spring Boot

    446questions

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