スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Spring MVC Spring Securityでログイン情報を保存する(クッキー)

以前、Spring Securityを使ったログイン画面の紹介をしたが、その中の「Remember me」(ログイン情報を保存する機能)についてはJSPだけ対応して機能は未実装だったため、今回実装したいと思う。

また、ログイン情報の保存は、クッキー(Cookie)を使用しており、クッキーがどのようなものかについても併せて確認したい。

■Spring Securityを使ったログイン画面に関する過去の記事
Spring MVC Spring Securityを使ってみる

◎動作検証にあたっての各バージョンは以下の通り
  • SpringFramework 3.2.8.RELEASE
  • Java 1.7
  • Tomcat 7.0

1.ログイン画面
Cookie_1.png
「Remember me」にチェックを入れて「Login」ボタンを押下する。


2.security-db.xml(関連箇所のみ掲載)

<sec:http auto-config="true">
<sec:intercept-url pattern="/book/list/**" access="ROLE_ADMIN,ROLE_USER"/>
<sec:intercept-url pattern="/book/edit/**" access="ROLE_ADMIN"/>
<sec:form-login login-page="/login.jsp" default-target-url="/book"
authentication-failure-url="/login.jsp?error=true"/>
<sec:logout logout-url="/logout" logout-success-url="/login.jsp"/>
<sec:remember-me token-validity-seconds="#{60}" />
<sec:access-denied-handler error-page="/error.jsp" />
</sec:http>

7行目の「sec:remember-me」が今回追加したタグとなる。「token-validity-seconds」属性には保存期間を秒単位で設定する。今回はテストのため60秒としている。この設定で、「Remember me」にチェックを入れて「Login」ボタンを押下した場合、60秒間、ログイン情報が保持されるようになる。ログイン情報が保持されている間は、一旦ブラウザを閉じても、再びログインすることなく、一覧画面を表示することができる。ちなみに、保存期間を1時間とする場合は、#{60*60}のような計算式も可能。


2.LogFilter.java

package jp.co.sample.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LogFilter implements Filter {

private static Logger logger = LoggerFactory.getLogger(LogFilter.class);

public void init(FilterConfig config) throws ServletException {
}

public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {

logger.info("doFilter start");
//クッキーの情報を表示
Cookie cookies[]=((HttpServletRequest) req).getCookies();
if(cookies!=null){
for(int i=0;i<cookies.length;i++){
logger.info( "Cookie_Name_{}: {}",i+1,cookies[i].getName());
logger.info( "Cookie_Value_{}: {}",i+1,cookies[i].getValue());
}
}

chain.doFilter(req, res);
logger.info("doFilter end");
}

public void destroy() {
}
}

フィルターを使って、クッキーの情報をログ出力するようにしている。


3.動作確認
①ログイン画面「Remember me」にチェックを入れて「Login」ボタンを押下した場合のログ

INFO LogFilter - doFilter start
INFO LogFilter - Cookie_Name_1: JSESSIONID
INFO LogFilter - Cookie_Value_1: 8E825B197D1F205E2B154CE52E77B97D
INFO LogFilter - Cookie_Name_2: SPRING_SECURITY_REMEMBER_ME_COOKIE
INFO LogFilter - Cookie_Value_2: dGVzdGFkbWluOjE0MzAzMTA1MjgyMzc6NTlkYzdkNzM0ZWQwZThlYTZhODA5MzU0ZDY3ZDgzOGM
INFO LogFilter - doFilter end

「JSESSIONID」と「SPRING_SECURITY_REMEMBER_ME_COOKIE」のクッキーが生成されていることが確認できる。
「JSESSIONID」は、クライアントを認識するための、サーブレットの仕様で定められたクッキーとなる。
もうひとつの「SPRING_SECURITY_REMEMBER_ME_COOKIE」が、名前から分かる通り「Remember me」にチェックを入れて生成されたクッキーとなる。(チェックを入れなければ、「SPRING_SECURITY_REMEMBER_ME_COOKIE」は生成されない。)

せっかくなので、クッキーのファイルも確認してみる。

今回は、IE(Internet Explorer)11を使って動作確認している。IE11におけるクッキーの保存先は、「ツール」-「インターネット オプション」-「全般」タブ-「設定」ボタンを押下-「インターネット一時ファイル」タブの現在の場所で確認できる。「ファイルの表示」ボタンを押下すれば、現在の場所で記載されているフォルダ配下のファイルを確認できる。

そして、フィルタリングにより抽出した該当のクッキーが下記となる。

Cookie_5.png

有効期限日時が最終変更日時からちょうど1分(60秒)後となっていることが確認できる。また、クッキーは単なるテキストファイルであることも分かる。ちなみにこのファイルは、ログアウトすると削除される。そのため、有効期限内であっても、ログアウトすると、再度ログイン処理が必要となる。

クッキーは有効期限の違いにより、「ブラウザが開いている間のみ有効」なものと「ブラウザを閉じても有効」なものに分けられる。有効期限が過去やマイナス値などの場合が、前者に該当する。

クッキーの仕組みについても少し触れておくと、クッキーはサーバー側のレスポンスから生成(ソースイメージ:「response.addCookie(cookie);」)して、クライアントへ送信している。そして、クライアントはリクエストのヘッダーにクッキーを付与して、サーバーへ送信している。このやりとりを行うことで値を保持している。ちなみに、値を保持する仕組みとしてカートなどで使用されるHttpSessionは、リクエストから生成(ソースイメージ:「request.getSession();」)され、「session.setAttribute("cart",cart);」のようにして値を常にサーバー側で保持する点が大きく異なる。

試しに、有効期限内にブラウザを閉じ、「http://localhost:8080/SpringWebSample/book/list/page/1」にアクセスしてみる。
Cookie_3.png

再度、ログイン処理することなく、一覧画面が表示された。

また、有効期限(今回は60秒後)を過ぎると、「http://localhost:8080/SpringWebSample/book/list/page/1」にアクセスしても、ログイン画面が表示されることも確認できた。


クッキーがどのような場面でよく使われているのか把握できていなかったので、仕組みも含め、非常に勉強になった。


■過去のSpring関連記事
Spring関連記事 Index

スポンサーサイト

コメントの投稿

非公開コメント

プロフィール

bookmount8

Author:bookmount8
システムエンジニア。サーバーサイドでjavaを扱うことが多い。最近は、ミドルやフロント周りも関心あり。

最新記事
カテゴリ
検索フォーム
最新コメント
月別アーカイブ
これまでの訪問者数
ブロとも申請フォーム

この人とブロともになる

RSSリンクの表示
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。