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

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

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

HTTPにおけるCookieとは、クライアントのウェブブラウザ上に保存された一時的なデータを指します。クライアント側のJavaScriptでも、サーバー側のHTTPヘッダーでもクッキーの読み書き・修正・削除が可能です。

Spring Security

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

Java

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

Tomcat

TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

Spring Boot

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

Q&A

解決済

1回答

3490閲覧

spring security remember-me not working

isacRu

総合スコア64

Cookie

HTTPにおけるCookieとは、クライアントのウェブブラウザ上に保存された一時的なデータを指します。クライアント側のJavaScriptでも、サーバー側のHTTPヘッダーでもクッキーの読み書き・修正・削除が可能です。

Spring Security

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

Java

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

Tomcat

TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

Spring Boot

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

0グッド

0クリップ

投稿2019/06/25 10:50

編集2019/06/25 12:14

困っていること

spring securityの機能であるremember-meを実装しても、30分たらずで画面再読み込みするとログイン画面がでてしまいます。remember-meのCookie情報も消えていました。
※ログイン直後は開発コンソールを見ると、remember-meのCookie情報は保存されていました。

試したこと

以下のURLを何個か参考にしましたが、結果はかわらず…

→ちなみにこのサイトに載ってる方法で試すと、なぜかUserDetailsServiceのloadUserByUsernameが2回呼び出されるという謎仕様が発生します。

環境

  • OS: Windows_NT x64 10.0.18362
  • vscode: Version: 1.35.1 (user setup)
  • Chrome: 66.0.3359.181
  • Java: Version1.8
  • Spring Boot 5
  • tomcat 9

実装内容

※ソースは途中より引用

html5

1<div class="container"> 2 <form method="POST" th:action="@{/login}" class="form-signin"> 3 <div class="form-label-group" th:classappend="${param.error} ? 'is-invalid'"> 4 <h1 th:text="#{app.title}" class="form-heading text-center"></h1> 5 <input name="loginId" type="text" class="form-control" placeholder="ログインID" required /> 6 <input id="input_pass" type="password" class="form-control" placeholder="パスワード" required /> 7 <input name="password" id="encrypt_pass" type="hidden" /> 8 <div class="custom-control custom-checkbox"> 9 <input type="checkbox" class="custom-control-input" name="remember-me" id="remember-me" value="true" checked> 10 <label class="custom-control-label" for="remember-me">ログイン状態を保持する</label> 11 </div> 12 <button id="login" type="submit" class="btn btn-primary btn-block btn-flat"> 13 <span class="oi oi-account-login"></span> 14 <span>&thinsp;ログイン</span> 15 </button> 16 <input type="hidden" name="_csrf" value="5e5f0472-c675-43ad-be0a-d673a0325db4" /> 17 </div> 18 </form> 19</div>

Java

1@Override 2protected void configure(HttpSecurity http) throws Exception { 3 http 4 .headers() 5 .frameOptions().sameOrigin() 6 .and() 7 .authorizeRequests() 8 .antMatchers("/resources/**", "/webjars/**","/css/**","/js/**","/img/**").permitAll() 9 .antMatchers("/login").permitAll() 10 .antMatchers("/error").permitAll() 11 .antMatchers("/admin/**").hasAuthority("ADMIN") 12 .antMatchers("/**").hasAnyAuthority("ADMIN","USER") 13 .anyRequest().authenticated() 14 .and() 15 .formLogin() 16 .loginPage("/login") 17 .defaultSuccessUrl("/top") 18 .failureUrl("/login?error") 19 .usernameParameter("loginId") 20 .passwordParameter("password") 21 .permitAll() 22 .and() 23 .logout() 24 .logoutRequestMatcher(new AntPathRequestMatcher("/logout")) 25 .logoutSuccessUrl("/login?logout") 26 .permitAll() 27 .and() 28 .rememberMe().tokenRepository(tokenRepository()).tokenValiditySeconds(30 * 24 * 60 * 60) 29 .and() 30 .exceptionHandling() 31 .accessDeniedPage("/error"); 32} 33 34@Bean 35public PersistentTokenRepository tokenRepository(){ 36 JdbcTokenRepositoryImpl tr = new JdbcTokenRepositoryImpl(); 37 tr.setDataSource(dataSource); 38 return tr; 39}

セキュリティ対策としてtokenRepositoryを宣言したり、tokenValiditySecondsログイン情報保持時間を指定してます。
お世話になりますが、誰か原因がわかる方ご教示お願い致します。

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

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

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

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

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

guest

回答1

0

自己解決

回答がなかったのは無理ありませんね
以上のソースであれば本来動作して当たり前だからです。

原因
結論からUserDetailsServiceのloadUserByUsernameを呼び出す際username引数でユーザーが見つからなかったため、ログイン画面が表示されていました。セッションタイムアウト後にこのメソッドは必ず呼び出されていますが、そこで認証失敗すれば、ログイン保持機能処理までたどり着きません。
なぜユーザー認証失敗になったかというと、username引数にuserid以外に別の文字列を連結しており(わざと)、当然useridで検索しようとしますが、別の文字列が邪魔でユーザー検索結果がnullとなってしまいました。

ということなんですゎ
自作自演となってしまいましたが、誰か参考になれば幸いです。
ま、イレギュラーケースなので(;^ω^)

投稿2019/07/21 08:50

isacRu

総合スコア64

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問