SpringSecurity专题(三)-实现自定义登录界面


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

注意:本文是在入门案例代码的基础上演示的!

1.页面准备

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

1.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>

1.2.home.jsp页面

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

1.3.其他页面

在这里插入图片描述

2.SpringSecurity相关配置

2.1.配置认证信息

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

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:security="http://www.springframework.org/schema/security"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.2.xsd
    http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-4.2.xsd">


    <!--直接释放无需经过SpringSecurity过滤器的静态资源-->
    <security:http pattern="/css/**" security="none"/>
    <security:http pattern="/img/**" security="none"/>
    <security:http pattern="/plugins/**" security="none"/>
    <security:http pattern="/failer.jsp" security="none"/>
    <security:http pattern="/favicon.ico" security="none"/>

    <!--设置可以用spring的el表达式配置Spring Security并自动生成对应配置组件(过滤器)-->
    <security:http auto-config="true" use-expressions="true">
        <!--指定login.jsp页面可以被匿名访问-->
        <security:intercept-url pattern="/login.jsp" access="permitAll()"/>
        <!--使用spring的el表达式来指定项目所有资源访问都必须有ROLE_USER或ROLE_ADMIN角色-->
        <security:intercept-url pattern="/**" access="hasAnyRole('ROLE_USER','ROLE_ADMIN')"/>
        <!--指定自定义的认证页面-->
        <security:form-login login-page="/login.jsp"
                             login-processing-url="/login"
                             default-target-url="/index.jsp"
                             authentication-failure-url="/failer.jsp"/>
        <!--指定退出登录后跳转的页面-->
        <security:logout logout-url="/logout"
                         logout-success-url="/login.jsp"/>
    </security:http>
    
    <!--设置Spring Security认证用户信息的来源-->
    <security:authentication-manager>
        <security:authentication-provider>
            <security:user-service>
                <security:user name="user" password="{noop}user" authorities="ROLE_USER"/>
                <security:user name="admin" password="{noop}admin" authorities="ROLE_ADMIN"/>
            </security:user-service>
        </security:authentication-provider>
    </security:authentication-manager>

</beans>

3.登录测试

再次启动项目后就可以看到自定义的酷炫认证页面了!
在这里插入图片描述
可以访问到,然后提交登录看看
注意表单设置
在这里插入图片描述
然后访问出现了403错误
然后你开开心心的输入了用户名user,密码user,就出现了如下的界面:
在这里插入图片描述
403什么异常?这是SpringSecurity中的权限不足!这个异常怎么来的?还记得上面SpringSecurity内置认证页面源码中的那个_csrf隐藏input吗?问题就在这了!

4.关闭csrf拦截

上面我们在账号和角色都正确的情况下,登录后出现了 403错误,原因是因为 csrf过滤器拦截了,那为什么系统提供的登录界面没问题呢?原因是如下
在这里插入图片描述
在系统提供的登录表单中隐藏的有csrf相关的信息。这时我们可以关闭csrf过滤器,来实现登录工作
在这里插入图片描述
在这里插入图片描述

5.csrf防护

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

5.1.CsrfFilter源码查看

在这里插入图片描述
this.requireCsrfProtectionMatcher.matches(request)方法
在这里插入图片描述

在这里插入图片描述
通过 GET HEAD TRACE OPTIONS 提交的数据不会csrf 验证!

通过源码分析,我们明白了,自己的认证页面,请求方式为POST,但却没有携带token,所以才出现了403权限不足的异常。那么如何处理这个问题呢?

方式一:直接禁用csrf,不推荐。
方式二:在认证页面携带token请求。

5.2.在认证页面携带token请求

  • 前面关闭的我们需要放开
    在这里插入图片描述
  • 页面动态token
    导入security标签
    在这里插入图片描述

<security:csrfInput/>在表单中使用,作用和下面的一致
在这里插入图片描述
<security:csrfMetaTags/>:ajax方式提交的时候使用

注:HttpSessionCsrfTokenRepository对象负责生成token并放入session域中。

6.注销

在index.jsp中添加注销链接
在这里插入图片描述
在这里插入图片描述
点击后出现了404错误原因是:自定义的注销功能必须通过post方式提交才行,所以如下

在这里插入图片描述
在这里插入图片描述
出现这个原因是 csrf的原因,加标签即可
在这里插入图片描述
搞定~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Spring Security中,可以通过配置来自定义登录页面。需要进行以下几个步骤: 1. 创建自定义登录页面。可以在项目中创建一个JSP或HTML文件,用于显示登录表单。 2. 在Spring Security的配置文件中指定自定义登录页面。可以使用`<security:form-login>`元素来配置登录页面的路径,例如:`<security:form-login login-page="/login.jsp" />`。其中,`login-page`属性指定了登录页面的路径。 3. 确保自定义登录页面可以被匿名访问。可以使用`<security:intercept-url>`元素来配置URL的访问权限,例如:`<security:intercept-url pattern="/login.jsp" access="permitAll" />`。其中,`pattern`属性指定了匹配的URL路径,`access`属性指定了访问该URL的权限。 通过以上配置,您可以实现Spring Security的自定义登录界面。请注意,在配置文件中的其他部分可能还有其他相关配置,比如配置认证信息、配置退出登录等。详细配置可以参考引用和引用中的示例代码和解释。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [SpringSecurity实现定义登录界面](https://blog.csdn.net/qq_38526573/article/details/103402060)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值