spring實戰-Spring-security自定義登入登出、防csrf攻擊及檢視保護
阿新 • • 發佈:2018-11-04
第十篇: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,登出連線
4,登入之後,可以在頁面展示登入的使用者名稱<!-- 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>
<sec:authentication property="principal" var="authentication"/>
使用者名稱:${authentication.username} <br/>
<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" %>