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/>
<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" %>
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。