STACKJAVA

Code ví dụ Spring Security Remember Me (Tự động login)

Code ví dụ Spring Security Remember Me (Tự động login).

(Xem thêm: Ví dụ Spring Boot Remember Me (annotation config))

Ở bài này mình sẽ sử dụng lại ví dụ Spring Security, Tạo form login – XML Config

Bình thường sau khi đăng nhập, người dùng sẽ phải đăng nhập lại sau khi session timeout (thường là 30 phút hoặc cài đặt trong file web.xml) tuy nhiên với những trường hợp người dùng không muốn phải đăng nhập nhiều lần thì ta thường thấy có chức năng ‘remember me’, khi sử dụng chức năng này người dùng sẽ không phải login lại sau khi session timeout.

Cơ chế hoạt động của chức năng ‘remember me’, sau khi login với lựa chọn ‘remember me’ hệ thống sẽ ghi một cookie lên trình duyệt, mỗi khi truy cập các trang/đường dẫn yêu cầu đăng nhập thì hệ thống sẽ kiểm tra cookie đó, nếu cookie hợp lệ và còn hạn thì người dùng không cần phải login lại.

Cấu hình Spring Security Remember Me

Để bật chức năng Spring Security Remember Me ta dùng thẻ <remember-me key="uniqueAndSecret"/>

Ví dụ:

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"
  xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd">

  <http auto-config="true">
    <intercept-url pattern="/admin**" access="hasRole('ROLE_ADMIN')" />
    <form-login login-page="/login" login-processing-url="/j_spring_security_login"
      default-target-url="/admin" authentication-failure-url="/login?error"
      username-parameter="username" password-parameter="password" />
    <logout logout-url="/j_spring_security_logout"
      logout-success-url="/logout" delete-cookies="JSESSIONID" />

    <remember-me key="uniqueAndSecret" token-validity-seconds="1296000"/>
  </http>

  <authentication-manager>
    <authentication-provider>
      <user-service>
        <user name="kai" password="{noop}123456" authorities="ROLE_ADMIN" />
      </user-service>
    </authentication-provider>
  </authentication-manager>
</beans:beans>

Thuộc tính token-validity-seconds dùng để xác định thời gian hết hạn cho cookie remember me. (mặc định là 2 tuần)

Form login

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<title>login</title>
</head>
<body>
  <h1>Spring MVC-Security Login Form</h1>
  <h2>${message}</h2>

  <form name='loginForm' action="<c:url value='j_spring_security_login' />" method='POST'>
    <table>
      <tr>
        <td>User:</td>
        <td><input type='text' name='username'></td>
      </tr>
      <tr>
        <td>Password:</td>
        <td><input type='password' name='password' /></td>
      </tr>
      <tr>
                <td>Remember Me:</td>
                <td><input type="checkbox" name="remember-me" /></td>
            </tr>
      <tr>
        <td colspan='2'><input name="submit" type="submit" value="login" /></td>
      </tr>
    </table>
    <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />

  </form>
</body>
</html>

Lưu ý, sau khi logout hoặc thay đổi password thì token remember me sẽ không còn tác dụng, ta phải login với remember me lại.

Demo:

Đăng nhập với tài khoản kai/123456 và chọn ‘Remember Me’

Kiển thị cookie của trang web sau khi đăng nhập

Ta thấy có cookies ‘remember-me’ với thời gian hết hạn (username, password chứa trong nội dung)

Thử xóa cookie ‘JSESSIONID’ và tải lại trang /admin

Vẫn truy cập bình thường vì ta đã có cookie ‘remember-me’ chưa hết hạn.

Bây giờ bạn thử xóa cookie ‘JSESSIONID’ cho trường hợp login không chọn ‘Remember Me’ ta sẽ không thể truy cập được trang /admin mà buộc phải login lại.

Code ví dụ Spring Security Remember Me (Tự động login) stackjava.com

Okay, Done!

Download code ví dụ trên tại đây.

 

References:

https://docs.spring.io/spring-security/site/docs/3.0.x/reference/remember-me.html