第十篇: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/>
<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" %>