SpringSecurity-2(认证和授权+SpringSecurity入门案例+自定义认证+数据库认证)

4 SpringSecurity使用自定义认证页面

4.1 在SpringSecurity主配置文件中指定认证页面配置信息
4.1.1 配置springSecurity.xml配置文件
<?xmlversion="1.0"encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:security="http://www.springframework.org/schema/security"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security.xsd">

<!--资源不过滤-->
<security:httpsecurity="none"pattern="/login.html"></security:http>
<security:httpsecurity="none"pattern="/failer.html"></security:http>
<!--
auto-config:true开启spring-security的自动配置
use-expressions="false"开启使用spring表达式的功能
-->
<security:httpauto-config="true"use-expressions="true">
<!--指定login.jsp页面可以被匿名访问-->
<security:intercept-urlpattern="/login.jsp"access="permitAll()"/>
<!--
intercept-url:拦截的请求资源/**所有的请求全部拦截
access:访问资源所需要的权限
-->
<security:intercept-urlpattern="/**"access="hasAnyRole('ROLE_USER','ROLE_ADMIN')"></security:intercept-url>
<!--
配置自定义表单
login-page:自定义的登录页面
login-processing-url:表单提交之后,交给那么action去处理springSecurity默认提供了一个叫/login的逻辑处理
username-parameter:值必须和登录表单里面的控件名称保持一致。
password-parameter值必须和登录表单里面的控件名称保持一致。
authentication-failure-forward-url:认证失败之后,需要跳转的页面
default-target-url:认证成功之后,需要跳转的页面
-->
<security:form-loginlogin-page="/login.jsp"login-processing-url="/login"
username-parameter="username"password-parameter="password"
authentication-failure-forward-url="/failer.html"
default-target-url="/index.jsp"
/>
<!--指定退出登录后跳转的页面-->
<security:logoutlogout-url="/logout"
logout-success-url="/login.jsp"/>
</security:http>
<!--配置认证管理器-->
<security:authentication-manager>
<!--配置认证提供者-->
<security:authentication-provider>
<!--配置认证服务-->
<security:user-service>
<!--
配置认证者
name用户名
password密码
authorities权限资源
-->
<security:username="user"password="{noop}user"authorities="ROLE_USER"></security:user>
<security:username="admin"password="{noop}admin"authorities="ROLE_ADMIN"></security:user>
</security:user-service>
</security:authentication-provider>
</security:authentication-manager>
</beans>
4.1.2 定义login.jsp
<%@pagecontentType="text/html;charset=UTF-8"language="java"%>
<html>

<head>
<title>Title</title>
</head>

<body>
<formaction="/login"method="post">
<security:csrfInput/>
<%--<security:csrfMetaTags/>--%><%--ajax提交用这个--%>
用户名:<inputtype="text"name="username"><br>
密码:<inputtype="password"name="password"><br>
<inputtype="submit"value="提交">
</form>
</body>
</html>

再次启动项目后就可以看到自定义的酷炫认证页面了:

在这里插入图片描述

然后你开开心心的输入了用户名user,密码user,就出现了如下的界面:

在这里插入图片描述

403什么异常?这是SpringSecurity中的权限不足!这个异常怎么来的?还记得上面SpringSecurity内置认证页面源码中的那个_csrf隐藏input吗?问题就在这了!
在这里插入图片描述

4.2 SpringSecurity的csrf防护机制

CSRF(Cross-siterequestforgery)跨站请求伪造,是一种难以防范的网络攻击方式。

在这里插入图片描述

4.2.1 SpringSecurity中CsrfFilter过滤器说明

打开CsrfFilter过滤器源码:

在这里插入图片描述

如何查看GET HEAD ERTRACE OPTIONS方法直接放行?点击if语句里面的matches方法。

在这里插入图片描述

查看其实现类DefaultRequiresCsrfMatcher

在这里插入图片描述

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

4.2.2 禁用csrf防护机制

在SpringSecurity主配置文件中添加禁用crsf防护的配置。

在这里插入图片描述

但是这种方法一般不使用,禁用csrf过滤器,风险很大。

4.2.3 在认证页面携带token请求

先把禁用csrf过滤器的配置去掉。
在这里插入图片描述

再次请求,我们发现认证成功

4.2.4 退出认证

如何在主页上显示当前认证成功的用户呢?
在index.jsp页面上添加:
欢迎你,<security:authenticationproperty="principal.username"/>

4.2.4.1 禁用csrf过滤器
<!--关闭CSRF,默认是开启的允许我们使用自定义的表单-->
<security:csrfdisabled="true"/>
<ahref="${pageContext.request.contextPath}/logout">注销</a>

最后定义如下:

在这里插入图片描述

4.2.4.2 没有禁用csrf过滤器

如果没有禁用csrf过滤器,那么上面这种方法就不好使了。我们需要使用表单的post方法进行退出。

<formaction="${pageContext.request.contextPath}/logout"method="post">
<security:csrfInput/>
<inputtype="submit"value="注销">
</form>

最后定义如下:

在这里插入图片描述

  • 13
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yinying293

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值