1. 程式人生 > >spring實戰-Spring-security自定義登入登出、防csrf攻擊及檢視保護

spring實戰-Spring-security自定義登入登出、防csrf攻擊及檢視保護

第十篇:Spring-security自定義登入登出、防csrf攻擊及檢視保護

這是Spring及SpringMVC的最後一篇,本次主要演示SpringSecurity更使用的示例,如自定義的登入頁面,系統登出,防止CSRF跨站攻擊,以及檢視保護檢視保護可以定義到按鈕級別的許可權

先看自定義的登入頁面

1,還是SecurityConfig的configure配置

@Override
	protected void configure(HttpSecurity http) throws Exception {
		whitelistHandler.handle(http)
			.authorizeRequests()
				.anyRequest().authenticated()
		.and()
			.formLogin()
	        .loginPage("/home/login")	/*自定義登入頁面地址*/
        .and()
	        .logout()
	        	.logoutUrl("/logout")	/*自定義登出連結*/
        		.logoutSuccessUrl("/home/login") /*如果成功登出,需要跳轉的頁面*/
		.and()
          	.rememberMe()	/*登入的記住我選項*/
		        .tokenRepository(new InMemoryTokenRepositoryImpl())
		        .tokenValiditySeconds(2419200)/*記住登入狀態4周*/
		        .key("idatKey");
	}

2,自定義登入檢視,需要注意這裡有個 <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>隱藏域,

security預設啟用防CSRF攻擊,所以必須有這個,否則會報錯。同時注意form的action和username,password

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>

<h2>
	<s:message code="idat.login" text="welcome to login" />
</h2>
<c:url value="/home/regist" var="registUrl"/>
<a href="${registUrl }">Register</a>

<form name='form' action='login' method='POST'>
	<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
	<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 colspan='2'><input id="remember_me" path="remember-me" type="checkbox" /> 
				<label for="remember_me" class="inline">Remember me</label></td>
		</tr>
		<tr>
			<td colspan='2'><input name="submit" type="submit" value="Login" /></td>
		</tr>
	</table>
</form>

通過以上方式,我們定義了自己的登入頁面,可以在這個頁面裡面做美化工作,可以不再使用以前那個醜陋的登入頁面了

3,登出連線

<!-- spring4 如果開啟了scrf需要通過post的方式登出 -->
<c:url value="/logout" var="logoutUrl"/>
<form action="${logoutUrl }" method="post">
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
<input type="submit" value="logout"/>
</form>
4,登入之後,可以在頁面展示登入的使用者名稱

<sec:authentication property="principal" var="authentication"/>
使用者名稱:${authentication.username} <br/>


5,檢視保護

<sec:authorize url="/home/admin">
<c:url value="/home/admin" var="adminUrl"/>
<a href="${adminUrl }">Admin</a>
</sec:authorize>
如果當前登入使用者擁有/home/admin的訪問許可權,則檢視會渲染超連結控制元件<a href="${adminUrl }">Admin</a>,否則不會顯示

該方法可以擴充套件到任何html表單,可以通過這種方式讓許可權精細到按鈕級別


以上關於檢視的還需要引用標籤

<%@ taglib uri="http://www.springframework.org/security/tags" prefix="sec" %>