SpringBootSecurity学习(03)网页版登录添加自定义登录页面
自定义登录页面
前面无论是使用默认配置,还是自定义配置类,都是使用的springboot-security自带的登录页面,自带的登录页面在这个版本虽然设计的非常不错,但是在实际开发中,我们通常还是使用自己的登录页面。下面来写一个非常简单的登录页面:

这个页面只有填写用户名和密码的地方,然后就是一个form表单提交,没有任何其他内容。特别注意!!这里页面虽然引入了thymeleaf模板,但是没有使用thymeleaf的任何标签属性,使用的是原生的html标签。继续下面,然后是定义登录页面的路径:

这样登录页面就添加完成了。
修改配置类
在配置类中添加自定义登录页面很简单,定义登录页面链接即可:

配置完成后,启动项目,访问登录页面,可以看到这样一个错误:

显示重定向次数过多。原来前面我们授权配置的时候,所有自定义的路径在未登录的情况下,都会重定向到登录页面,现在登录路径也是自定义的,所以它一直在自我重定向。登录路径本身要配置成不需要授权就能访问的路径才合理。配置方式很简单,只需要加上一个 permitAll 方法即可:

现在重启项目,访问登录可以正常访问,输入账号也可以正常访问了!
csrf配置
上面的页面和配置类修改好了以后,输入账号登录,却发现登录一直不成功,总是会跳转到登录页面。这是什么原因呢?上面的提到了页面使用的是原生的html标签,没有使用thymeleaf模板的属性。先说这种原生的情况,之所以登录不成功,原因是Spring Security默认是开启CSRF的,所以需要请求中包含CSRF的token信息,在其官方文档中,提供了在form中嵌入一个hidden标签来获取token信息,其原理是,hidden标签使用了Spring Security提供的标签,即${_csrf.parameterName}、${_csrf.token}, 后台页面渲染过程中,将此标签解所对应的值解析出来,这样,我们的form表单,就嵌入了Spring Security的所需的token信息,在后续的提交登录请求时,就不会出现没有CSRF token的异常。做法如下:

这时候登录,就发现可以成功。在springboot2.1.x版本下,还有第二种更好的解决方案,就是使用thymeleaf模板的form标签属性:

在form标签中,使用th:action属性,这样会在表单中默认添加一个hidden的input标签,效果和第一种解决方式类似,查看源码,就可以看到:

另外,还有一个解决办法是,通过关闭CSRF来解决,这个几乎在任何场景中都能解决这个问题(上面这个解决方案,可能在某些渲染模板不能解析出来token值,不过可以通过后台程序来获取token值,然后自己定义变量来渲染到form中,这个也是可以的)。具体的做法是通过修改配置文件来关闭,我这里使用的是SpringBoot开发的项目,配置文件直接写在配置类中,通过.csrf().disable()来关闭。不过这种方案,会迎来CSRF攻击,不建议在生产环境中使用,如果系统对外界做了隔离,这样做也是可以的。大部分的生产环境采用的也多是这种方案。

上面三种解决方案都可以解决登录不成功的问题。
配置登录成功后的默认页面
现在security登录成功后默认会跳转到一个路径,这个路径就是登录链接去掉后面的/login,这个默认跳转也是可以配置的:

然后再把默认页面改为/home路径:

现在我们登录成功,跳转的就是/home:

配置登出
除了登录,security还有自带的登出,即退出系统功能,默认路径就是/logout。我们可以在home页面中加一个登出操作:

退出后,默认进入的自然是登录页面,但是浏览器路径上面,要显示出刚才是退出系统了。所以应该显示的路径是/login?logout,但是由于这个路径没有授权,会再次跳转到登录页面,显示的也就还是/login,所以我们对登出也要进行授权:

现在显示的就是正常的退出后的路径:

代码地址 : https://gitee.com/blueses/spring-boot-security 03
SpringBootSecurity学习(03)网页版登录添加自定义登录页面的更多相关文章
- 移动端ios网页版收起键盘导致页面空白解决办法
失焦的时候把窗口滚动位置设置到(0,0)就行了 <input type="text" onblur="window.scrollTo(0, 0);"> ...
- SpringBootSecurity学习(12)前后端分离版之简单登录
前后端分离 前面讨论了springboot下security很多常用的功能,其它的功能建议参考官方文档学习.网页版登录的形式现在已经不是最流行的了,最流行的是前后端分离的登录方式,前端单独成为一个项目 ...
- h5 网页版的微博微信QQ登录
一:微博 1,先说微博吧,首先你的去http://open.weibo.com/wiki/先注册账号,通过验证审核.然后的创建网页应用.微博审核不通过的原因就是域名和网站地址,一定要按实际写的.一定要 ...
- CROW-5 WEB APP引擎商业计划书(HTML5方向)-微信网页版微信公众平台登录-水仙谷
CROW-5 WEB APP引擎商业计划书(HTML5方向)-微信网页版微信公众平台登录-水仙谷 CROW-5 WEB APP引擎商业计划书(HTML5方向)
- 用requests登录微信网页版,并接收发送消息
首先,网页版微信登录大致分为以下几个流程(都是大家可以通过抓包得到): 1.登陆主页后,会生成一个UUID,这是个用户标识,在后面请求二维码会用到 def get_uuid(self): '''获取u ...
- 利用 JavaScript SDK 部署网页版“Facebook 登录”
facebook开发者平台https://developers.facebook.com/ 利用 JavaScript SDK 部署网页版“Facebook 登录” 通过采用 Javascript 版 ...
- Java 语言实现简易版扫码登录
基本介绍 相信大家对二维码都不陌生,生活中到处充斥着扫码登录的场景,如登录网页版微信.支付宝等.最近学习了一下扫码登录的原理,感觉蛮有趣的,于是自己实现了一个简易版扫码登录的 Demo,以此记录一下学 ...
- 微信开放平台开发——网页微信扫码登录(OAuth2.0)
1.OAuth2.0 OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. 允许用户提供 ...
- php微信开放平台--第三方网页微信扫码登录(OAuth2.0)
第一.OAuth2.0 OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. 允许用户提 ...
随机推荐
- HTML页面仿WORD样式
公司要求不再浏览器中添加office插件的前提下.展示WORD文档中的内容要求一一对应.经过查询资料以及调整,得出如下相关资料: 1 标题样式: 目录 -- 宋体 小二 加粗 一级标题 -- 微软雅 ...
- C#数据结构_查找
查找:静态查找和动态查找. 衡量查找算法的最主要的标准是平均查找长度(Average Search Length,简 称 ASL).平均查找长度是指在查找过程中进行的关键码比较次数的平均值. 顺序查找 ...
- Leetcode之二分法专题-275. H指数 II(H-Index II)
Leetcode之二分法专题-275. H指数 II(H-Index II) 给定一位研究者论文被引用次数的数组(被引用次数是非负整数),数组已经按照升序排列.编写一个方法,计算出研究者的 h 指数. ...
- JS之clientWidth、offsetWidth等属性介绍
一.clientXXX 属性 代码演示 // css 部分 <style> .test{ width:100px; height:100px; border:1px solid red; ...
- library not found for -ljpush-ios-3.2.1错误
很多人在更新pod后报 library not found for -ljpush-ios-3.2.1(举例)错误,这其实是包含版本号类型错误. 究其原因:使用了版本号做库名字,pod升级后 Podf ...
- windows服务autofac注入quartz任务
一.nuget下载相关类库引用 install-package Quartz install-package Autofac install-package Autofac.Configuration ...
- hdu 3265 Posters(线段树+扫描线+面积并)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3265 题意:给你一张挖了洞的墙纸贴在墙上,问你总面积有多少. 挖了洞后其实就是多了几个矩形墙纸,一张墙 ...
- hdu 4513(Manacher)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4513 题解:就是在Manacher判断回文串的过程中添加一条条件 Ma[i + dp[i] - 2] ...
- happen before 原则
并发一直都是程序开发者绕不开的难题,在上一篇文章中我们知道了导致并发问题的源头是 : 多核 CPU 缓存导致程序的可见性问题.多线程间切换带来的原子性问题以及编译优化带来的顺序性问题. 原子性问题我们 ...
- springmvc——@InitBinder注解
转自http://www.cnblogs.com/douJiangYouTiao888/p/6765220.html 有些类型的数据是无法自动转换的,比如请求参数中包含时间类型的数据,无法自动映射到C ...