自定义登录界面

前面我们已经了解了如何实现数据库权限验证,那么现在我们接着来看看,如何将登陆页面修改为我们自定义的样式。

首先我们要了解一下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基础:自定义登录和登出相关推荐

  1. 命令行客户端MySQL基本命令的使用(登录、登出、数据库操作的SQL语句、表结构的SQL语句、表数据操作的SQL语句)

    1. 登录和登出数据库 登录数据库: 输入下面命令: mysql -uroot -p 说明: -u 后面是登录的用户名  [写成-u root也是可以的] -p 后面是登录密码, 如果不填写, 回车之 ...

  2. Springsecurity搭建自定义登录页面

    Springsecurity搭建自定义登录页面 1.springSecurity的搭建 新建一个springboot的web项目,我这边只选中了web,建立后如下: image.png pom依赖: ...

  3. 通过session实现用户的登录与登出功能

    通过session实现用户的登录与登出功能 本文讲解,就是在常见的登录注册页面中,我们是如何在登录之后,把用户的信息传送到后面的网页. 首先讲解原理,原理是session功能,通过session的在当 ...

  4. 9_用户的登录和登出

    用户的登录和登出 之前我们已经讲到,项目到现在,我们一共建立了两个app,分别是article和bloguser. 登录 1. 配置根路由 打开iblog/urls.py path('bloguser ...

  5. 基于Jsoup实现搜狗微信搜索文章获取链接、搜索公众号信息、微信登录以及登出

    2020-03-20更新 已上传至GitHub:https://github.com/Aquarius-Seven/demo-jsoup.git,相比CSDN资源,CommonUtil增加了一个处理需 ...

  6. 前端实现登录、登出、请求数据的一些思路整理

    前端实现登录.登出.请求数据的一些思路整理(基于React.JWT技术) 登录.登出和数据请求是两种不同的数据交互方式,是互相独立的. 登录.登出基于 JWT(JSON WEB TOKEN) 技术,通 ...

  7. tp5登出_tp 5框架实现登录,登出及session登录状态检测功能示例

    本文实例讲述了tp 5框架实现登录,登出及session登录状态检测功能.共享给大家供大家参考,详细如下: 1,访问http://localhost/tp5/admin.php时,判断有没有登录: 想 ...

  8. Spring Security OAuth2 单点登录和登出

    文章目录 1. 单点登录 1.1 使用内存保存客户端和用户信息 1.1.1 认证中心 auth-server 1.1.2 子系统 service-1 1.1.3 测试 1.2 使用数据库保存客户端和用 ...

  9. 从零开始搭建服务器之登录和登出远程服务器

    双 11 期间入手了一台云服务器,备案花了一两个星期,这两天终于备案通过了.于是在个人服务器上装了 Docker 容器用于部署项目,准备尽量把所有的服务都打包成容器,方便统一管理运维. 于是利用 do ...

最新文章

  1. LeetCode 1242. Web Crawler Multithreaded--Java 解法--网路爬虫并发系列--ConcurrentHashMap/Collections.synchroni
  2. 给HttpClient添加请求头(HttpClientFactory)
  3. 桥牌笔记:三个输墩压缩为一个
  4. 记录一次缓存系统的优化过程
  5. HTML5播放器:视频分段播放
  6. 1092 最好吃的月饼 (20分)_24行代码AC
  7. CF1028F. Make Symmetrical
  8. java udp 接受阻塞_Java UDP发送与接收
  9. AUTOSAR从入门到精通100讲(六)-Multicore-多核存储优化
  10. 2018南京区域赛 J-Prime Game
  11. Spark中导入scalax
  12. c++ 二维数组 排序_【算法】排序算法之计数排序
  13. Python内置函数sorted()和列表方法sort()排序规则不得不说的事
  14. lopatkin俄大神精简中文系统Windows 10 Enterprise 2016 LTSB 14393.577 x86-x64 ZH-CN PIP
  15. 医院计算机,医院计算机
  16. Exception thrown at 0x00007FF7A7B64FB3 in xx.exe: 0xC0000005: Access violation reading location 0x00
  17. 那些我们对2019技术世界趋势的预测都说准了吗?
  18. 彩色图像、灰度图像、二值图像和索引图像
  19. C++鼠标锁定或乱跳(坑人必备)
  20. web设置网页背景为好看炫酷的渐变色样式

热门文章

  1. Linux内核异常调试工具与方法
  2. Linux e1000e网卡驱动
  3. 网络互联技术——简介
  4. c++中随机生成实数
  5. STM32F10xxx20xxx21xxxL1xxxx Cortex-M3程序设计手册 阅读笔记三(1):Cortex-M3指令集概要
  6. 为什么 128 KB 的魂斗罗可以实现那么长的剧情?
  7. revit建模中复合墙与叠层墙区别?Revit中怎么创建叠层墙?
  8. Typora如何将图片使用相对路径保存到统一文件夹中(解决.md文档传输丢图片的方法)
  9. 7种常见的APPUI界面设计布局风格欣赏
  10. ping android模拟器,Android模拟器之间的网络通信及Ping主机