5.3. Java 設定及表單登入
接著,既然我們並沒有提到任何 HTML 或 JSP 檔,你可能會懷疑系統提示要登入的表格從哪裡來。
雖然預設設定並沒有特別為登入頁面設定一個 URL,Spring Security 還是會基於一些預設被啟用的功能,自動產生一個頁面、使該頁面對處理提交登入的 URL 使用標準設定、自動設定使用者登入後會轉向的預設目標 URL 等等。
不過自動產生登入畫面雖然讓建立跟快速運作起來很方便,大多數的應用程式還是會希望提供特定的登入頁面。我們可以透過以下設定來達成:
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login") // 1.
.permitAll(); // 2.
}
- 此處的設定表示登入頁面的實體位置
- 讓所有使用端都能取得登入頁面
基於目前設定的 JSP 登入頁面範例如下:
<c:url value="/login" var="loginUrl"/>
<form action="${loginUrl}" method="post"> <!-- 1. -->
<c:if test="${param.error != null}"> <!-- 2. -->
<p>
Invalid username and password.
</p>
</c:if>
<c:if test="${param.logout != null}"> <!-- 3. -->
<p>
You have been logged out.
</p>
</c:if>
<p>
<label for="username">Username</label>
<input type="text" id="username" name="username"/> <!-- 4. -->
</p>
<p>
<label for="password">Password</label>
<input type="password" id="password" name="password"/> <!-- 5. -->
</p>
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/> <!-- 6. -->
<button type="submit" class="btn">Log in</button>
</form>
- POST 請求到
/login
以驗證使用者 - 如果查詢參數
error
存在,驗證會被嘗試並失敗 - 如果查詢參數
logout
存在,則使用者會被成功登出 - HTTP 主體中必須存在以 username 為名稱的使用者名稱參數
- HTTP 主體中必須存在以 password 為名稱的密碼參數
- HTTP 主體中必須包含 CSRF Token