专栏首页波波烤鸭SpringSecurity实现自定义登录界面

SpringSecurity实现自定义登录界面

  前面通过入门案例介绍,我们发现在SpringSecurity中如果我们没有使用自定义的登录界面,那么SpringSecurity会给我们提供一个系统登录界面。但真实项目中我们一般都会使用自定义的登录界面,本文我们就来介绍下如何实现该操作。 注意:本文是在入门案例代码的基础上演示的!

一、页面准备

我们准备如下相关的jsp页面

1.login.jsp页面

<%--
  Created by IntelliJ IDEA.
  User: dengp
  Date: 2019/12/1
  Time: 20:40
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h1>登录管理</h1>
    
    <form>
        账号:<input type="text" name="username"><br>
        密码:<input type="password" name="password"><br>
        <input type="submit" value="登录"><br>
    </form>
    <img src="img/a1.jpg">
</body>
</html>

2.home.jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h1>home界面</h1>
</body>
</html>

3.其他页面

二、SpringSecurity相关配置

1.配置认证信息

配置登录和注销相关的信息

<security:http auto-config="true" use-expressions="true">
    <!--
        拦截资源
        pattern="/**" 拦截所有的资源
        access="hasanyrole('role1')" 表示只有role1这个角色可以访问资源
     -->
    <security:intercept-url pattern="/**" access="hasanyrole('role_user')"></security:intercept-url>
    <!--
        配置认证信息
     login-page="/login.jsp"  自定义的登录页面
     login-processing-url="/login" security中处理登录的请求
     default-target-url="/home.jsp" 默认的跳转地址
     authentication-failure-url="/failure.jsp" 登录失败的跳转地址
     -->
    <security:form-login login-page="/login.jsp"
                        login-processing-url="/login"
                         default-target-url="/home.jsp"
                         authentication-failure-url="/failure.jsp"
    />
    <!-- 配置退出的登录信息 -->
    <security:logout logout-url="/logout"
                     logout-success-url="/login.jsp"
    />
</security:http>

2.认证界面匿名访问

前面配置的

<security:intercept-url pattern="/**" access="hasanyrole('role_user')"></security:intercept-url>

会使登录界面不可访问,所以我们需要方法

3.放过静态资源

同样的系统的 js css 等静态资源文件也会被对应的过滤器拦截,所以也需要方法

4.登录测试

启动服务我们访问登录试试

可以访问到,然后提交登录看看 注意表单设置

然后访问出现了403错误

三、关闭csrf拦截

  上面我们在账号和角色都正确的情况下,登录后出现了 403错误,原因是因为 csrf过滤器拦截了,那为什么系统提供的登录界面没问题呢?原因是如下

在系统提供的登录表单中隐藏的有csrf相关的信息。这时我们可以关闭csrf过滤器,来实现登录工作

重启服务再测试就可以了

四、csrf防护

  上面我们通过关闭csrf过滤器实现了认证功能,但是系统将面临csrf攻击的风险,所以我们需要放开服务,同时也要能够完成认证。首先我们来看下CsrfFilter的源码

1.CsrfFilter源码查看

this.requireCsrfProtectionMatcher.matches(request)方法

通过 GET HEAD TRACE OPTIONS 提交的数据不会 csrf 验证

2.放开过滤器

前面关闭的我们需要放开

3.页面动态token

导入security标签

security:csrfInput/ 在表单中使用,作用和下面的一致

security:csrfMetaTags/:ajax方式提交的时候使用

五、注销功能

在home.jsp中添加注销链接

点击后出现了404错误原因是:自定义的注销功能必须通过post方式提交才行,所以如下

出现这个原因是 csrf的原因,加标签即可

搞定~

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • SpringBoot【整合JSP】

    SpringBoot中默认是不支持jsp的,但是我们某些情况下可以又需要用到,所以本文记录下SpringBoot整合jsp的过程

    用户4919348
  • SpringMVC教程6[Restful和拦截器]

      RESTful是一种软件设计规范,是客户端和服务端进行数据交互的一个规范。 早期使用JSP页面开发网页时,数据交互基本都是通过表单提交,然后通过内置对象传递...

    用户4919348
  • Hadoop之HDFS01【介绍】

    &esmp; HDFS(Hadoop Distributed File System)分布式文件系统。HDFS是一个高度容错性的系统,适合部署在廉价的机器上。H...

    用户4919348
  • JS-DOM2级封装练习题--点击登录弹出登录对话框

    xing.org1^
  • Python中socket的UDP学习(3)

    萌海无涯
  • 第十七章 Python网络编程

    在网络上的两个程序通过一个双向的通信连接实现数据的交换,这个链接的一端称为一个Socket(套接字),用于描述IP地址和端口。

    py3study
  • 第33天 初识socket编程

      MAC:  mac地址是在每一个计算机出厂的时候就会烧录进网卡内的一串数字,用来唯一的表示一台计算机

    py3study
  • python3 socket实现简单

    #!/usr/bin/env python # -- encoding: utf-8 -- ''' @Author : {liush} @License ...

    py3study
  • php实现socket网络编程

    之前本人其实写过一个tcp多进程服务器了http://www.php20.cn/article/139,本文将总结以及完善php实现网络服务器相关代码

    仙士可
  • 使用PyInstaller打包webssh

    接前一篇博客,为了使webssh更容易安装部署,我在想是不是可以把webssh打包成一个独立的可执行文件,这样使用起来不是更方便呢。于是乎我想到了是不是可以使用...

    kongxx

扫码关注云+社区

领取腾讯云代金券