menu
書いてる野郎
orebike@gmail.com
よく見る、ログイン時の「ログインしたままにする」のチェックのやつ。
これも Spring Security はやってくれるっぽい。こういう全部おんぶにだっこ系の仕組みは全部やってもらわないと詰むので嬉しい。
このように設定する
@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { // 中略 @Override protected void configure(HttpSecurity http) throws Exception { // 中略 http // ログイン維持の設定するよ宣言 .rememberMe() // 使用する cookie の名前 深い意味は無いがわかりにくくしておいたほうがよいだろう .rememberMeCookieName("hogehoge_keep_login") // 画面から送り込まれるパラメータの名前 .rememberMeParameter("login_hogehoge_keep_login") // ハッシュ化時に用いられるソルト的な値 .key("unkounkounko") // どのぐらい維持するか(単位秒) .tokenValiditySeconds(30 * 24 * 60 * 60); } }
このように設定して、ログインフォームに項目を1個追加するだけで完了する。
<!DOCTYPE HTML> <html xmlns:th="http://www.thymeleaf.org"> <head> <title>Login</title> </head> <body> <h1>Login</h1> <form method="post" th:action="@{'/doLogin'}"> id: <input type="text" name="login_id" /> password: <input type="password" name="login_password" /> keep login: <input type="checkbox" name="login_hogehoge_keep_login" /> <input id="login_button" type="submit" value="login" /> </form> </body> </html>
仕組みとしては cookie に ↓のような値をセットする
【username と 有効期限 を 連結してbase64 エンコードしたモノ】 + 【username と有効期限とハッシュ化されたパスワードと key をくっつけたモノを MD5 ハッシュ化したもの】
つまり username と 有効期限は Cookie 値の頭を見ればわかり、key はシステム側が知っているので、 username でハッシュ化されたパスワードを引いて、こいつとの一致を確認できれば認証は確からしいということでログインをシミュレートする。
確率的にこの仕組を突破するのはかなり難しそうではあるが、いくつかのガードが甘い(ユーザー名がすぐバレるとか)ので合わせ技一本の可能性が高まる。
特に username というのはメールアドレスのことが多くこれが漏れるのはいろいろよろしくない。 といいつつマイナーサービスでの他人の Cookie を盗むなんて結構たいへんだとは思うんだが。
key の値は指定されていないとランダム値が使われるようだがこの値はサーバ起動時にリセットされるようなので、key を明示的に指定しておいたほうがよい
セキュリティとしてもっとガチにやりたい場合は tokenRepository というのを指定して、そのセキュリティ機構を実装してやればいいらしい(DBにトークンを入れるとか)