SpringSecurity基础:自定义登录和登出
自定义登录界面
前面我们已经了解了如何实现数据库权限验证,那么现在我们接着来看看,如何将登陆页面修改为我们自定义的样式。
首先我们要了解一下SpringSecurity是如何进行登陆验证的,我们可以观察一下默认的登陆界面中,表单内有哪些内容:
<div class="container"><form class="form-signin" method="post" action="/book_manager/login"><h2 class="form-signin-heading">Please sign in</h2><p><label for="username" class="sr-only">Username</label><input type="text" id="username" name="username" class="form-control" placeholder="Username" required="" autofocus=""></p><p><label for="password" class="sr-only">Password</label><input type="password" id="password" name="password" class="form-control" placeholder="Password" required=""></p>
<input name="_csrf" type="hidden" value="83421936-b84b-44e3-be47-58bb2c14571a"><button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button></form>
</div>
我们发现,首先有一个用户名的输入框和一个密码的输入框,我们需要在其中填写用户名和密码,但是我们发现,除了这两个输入框以外,还有一个input标签,它是隐藏的,并且它存储了一串类似于Hash值的东西,名称为"_csrf",其实看名字就知道,这玩意八成都是为了防止CSRF攻击而存在的。
从Spring Security 4.0开始,默认情况下会启用CSRF保护,以防止CSRF攻击应用程序,Spring Security CSRF会针对PATCH,POST,PUT和DELETE方法的请求(不仅仅只是登陆请求,这里指的是任何请求路径)进行防护,而这里的登陆表单正好是一个POST类型的请求。在默认配置下,无论是否登陆,页面中只要发起了PATCH,POST,PUT和DELETE请求一定会被拒绝,并返回403错误(注意,这里是个究极大坑),需要在请求的时候加入csrfToken才行,也就是"83421936-b84b-44e3-be47-58bb2c14571a",正是csrfToken,如果提交的是表单类型的数据,那么表单中必须包含此Token字符串,键名称为"_csrf";如果是JSON数据格式发送的,那么就需要在请求头中包含此Token字符串。
综上所述,我们最后提交的登陆表单,除了必须的用户名和密码,还包含了一个csrfToken字符串用于验证,防止攻击。
因此,我们在编写自己的登陆页面时,需要添加这样一个输入框:
<input type="text" th:name="${_csrf.getParameterName()}" th:value="${_csrf.token}" hidden>
隐藏即可,但是必须要有,而Token的键名称和Token字符串可以通过Thymeleaf从Model中获取,SpringSecurity会自动将Token信息添加到Model中。
接着我们就可以将我们自己的页面替换掉默认的页面了,我们需要重写另一个方法来实现:
@Override
protected void configure(HttpSecurity http) throws Exception {http.authorizeRequests() //首先需要配置哪些请求会被拦截,哪些请求必须具有什么角色才能访问.antMatchers("/static/**").permitAll() //静态资源,使用permitAll来运行任何人访问(注意一定要放在前面).antMatchers("/**").hasRole("user") //所有请求必须登陆并且是user角色才可以访问(不包含上面的静态资源)
}
需要配置登陆页面的地址和登陆请求发送的地址,这里登陆页面填写为/login
,登陆请求地址为/doLogin
,登陆页面需要我们自己去编写Controller来实现,登陆请求提交处理由SpringSecurity提供,只需要写路径就可以了。
@RequestMapping("/login")
public String login(){return "login";
}
配置好后,我们还需要配置一下退出登陆操作:
.and()
.logout()
.logoutUrl("/logout") //退出登陆的请求地址
.logoutSuccessUrl("/login"); //退出后重定向的地址
注意这里的退出登陆请求也必须是POST请求方式(因为开启了CSFR防护,需要添加Token),否则无法访问,这里主页面就这样写:
<body><form action="logout" method="post"><input type="text" th:name="${_csrf.getParameterName()}" th:value="${_csrf.token}" hidden><button>退出登陆</button></form>
</body>
</html>
登陆成功后,点击退出登陆按钮,就可以成功退出并回到登陆界面了。
由于我们在学习的过程中暂时用不到CSFR防护,因此可以将其关闭,这样直接使用get请求也可以退出登陆,并且登陆请求中无需再携带Token了,推荐关闭,因为不关闭后面可能会因为没考虑CSRF防护而遇到一连串的问题:
.and()
.csrf().disable();
这样就可以直接关闭此功能了,但是注意,这样将会导致您的Web网站存在安全漏洞。(这里为了之后省事,就关闭保护了,但是一定要记得在不关闭的情况下需要携带Token访问)
SpringSecurity基础:自定义登录和登出相关推荐
- 命令行客户端MySQL基本命令的使用(登录、登出、数据库操作的SQL语句、表结构的SQL语句、表数据操作的SQL语句)
1. 登录和登出数据库 登录数据库: 输入下面命令: mysql -uroot -p 说明: -u 后面是登录的用户名 [写成-u root也是可以的] -p 后面是登录密码, 如果不填写, 回车之 ...
- Springsecurity搭建自定义登录页面
Springsecurity搭建自定义登录页面 1.springSecurity的搭建 新建一个springboot的web项目,我这边只选中了web,建立后如下: image.png pom依赖: ...
- 通过session实现用户的登录与登出功能
通过session实现用户的登录与登出功能 本文讲解,就是在常见的登录注册页面中,我们是如何在登录之后,把用户的信息传送到后面的网页. 首先讲解原理,原理是session功能,通过session的在当 ...
- 9_用户的登录和登出
用户的登录和登出 之前我们已经讲到,项目到现在,我们一共建立了两个app,分别是article和bloguser. 登录 1. 配置根路由 打开iblog/urls.py path('bloguser ...
- 基于Jsoup实现搜狗微信搜索文章获取链接、搜索公众号信息、微信登录以及登出
2020-03-20更新 已上传至GitHub:https://github.com/Aquarius-Seven/demo-jsoup.git,相比CSDN资源,CommonUtil增加了一个处理需 ...
- 前端实现登录、登出、请求数据的一些思路整理
前端实现登录.登出.请求数据的一些思路整理(基于React.JWT技术) 登录.登出和数据请求是两种不同的数据交互方式,是互相独立的. 登录.登出基于 JWT(JSON WEB TOKEN) 技术,通 ...
- tp5登出_tp 5框架实现登录,登出及session登录状态检测功能示例
本文实例讲述了tp 5框架实现登录,登出及session登录状态检测功能.共享给大家供大家参考,详细如下: 1,访问http://localhost/tp5/admin.php时,判断有没有登录: 想 ...
- Spring Security OAuth2 单点登录和登出
文章目录 1. 单点登录 1.1 使用内存保存客户端和用户信息 1.1.1 认证中心 auth-server 1.1.2 子系统 service-1 1.1.3 测试 1.2 使用数据库保存客户端和用 ...
- 从零开始搭建服务器之登录和登出远程服务器
双 11 期间入手了一台云服务器,备案花了一两个星期,这两天终于备案通过了.于是在个人服务器上装了 Docker 容器用于部署项目,准备尽量把所有的服务都打包成容器,方便统一管理运维. 于是利用 do ...
最新文章
- LeetCode 1242. Web Crawler Multithreaded--Java 解法--网路爬虫并发系列--ConcurrentHashMap/Collections.synchroni
- 给HttpClient添加请求头(HttpClientFactory)
- 桥牌笔记:三个输墩压缩为一个
- 记录一次缓存系统的优化过程
- HTML5播放器:视频分段播放
- 1092 最好吃的月饼 (20分)_24行代码AC
- CF1028F. Make Symmetrical
- java udp 接受阻塞_Java UDP发送与接收
- AUTOSAR从入门到精通100讲(六)-Multicore-多核存储优化
- 2018南京区域赛 J-Prime Game
- Spark中导入scalax
- c++ 二维数组 排序_【算法】排序算法之计数排序
- Python内置函数sorted()和列表方法sort()排序规则不得不说的事
- lopatkin俄大神精简中文系统Windows 10 Enterprise 2016 LTSB 14393.577 x86-x64 ZH-CN PIP
- 医院计算机,医院计算机
- Exception thrown at 0x00007FF7A7B64FB3 in xx.exe: 0xC0000005: Access violation reading location 0x00
- 那些我们对2019技术世界趋势的预测都说准了吗?
- 彩色图像、灰度图像、二值图像和索引图像
- C++鼠标锁定或乱跳(坑人必备)
- web设置网页背景为好看炫酷的渐变色样式
热门文章
- Linux内核异常调试工具与方法
- Linux e1000e网卡驱动
- 网络互联技术——简介
- c++中随机生成实数
- STM32F10xxx20xxx21xxxL1xxxx Cortex-M3程序设计手册 阅读笔记三(1):Cortex-M3指令集概要
- 为什么 128 KB 的魂斗罗可以实现那么长的剧情?
- revit建模中复合墙与叠层墙区别?Revit中怎么创建叠层墙?
- Typora如何将图片使用相对路径保存到统一文件夹中(解决.md文档传输丢图片的方法)
- 7种常见的APPUI界面设计布局风格欣赏
- ping android模拟器,Android模拟器之间的网络通信及Ping主机