前言

在前面的2个章节中,一一哥 带大家认识了Spring Security中的第基本认证与表单认证 2种认证方式,其中表单认证是Spring Security默认的认证方式,也是开发时最常用的认证方式。有的小伙伴会问,不是还有第3种认证方式吗?对的,还有第三种摘要认证方式!在本文中,我们来学习了解一下HTTP摘要认证。

但是对于摘要认证,我们仅做了解即可,因为这种认证方式仅比基本认证稍微安全一点,开发时用的也不是很多。抱着艺多不压身的心态,我们多了解一点反正也没坏处。

一. HTTP摘要认证

1. 认证方式

小伙伴们,大家先跟我回顾一下Spring Security中的认证方式,有如下3种:

  • ①. HTTP基本认证;
  • ②. Form表单认证;
  • ③. HTTP摘要认证;

2. HTTP摘要认证

那么这个摘要认证是怎么回事呢?我们先来看看它的概念。

HTTP摘要认证和HTTP基本认证一样,也是在RFC2616中定义的一种认证方式,它的出现是为了弥补HTTP基本认证存在的安全隐患,但该认证方式也并不是很安全。HTTP摘要认证会使用对通信双方来说都可知的口令进行校验,且最终以密文的形式来传输数据,所以相对于基本认证来说,稍微安全了一些

原来这就是摘要认证啊,懂了?要是还没懂,我们继续往下看摘要认证的认证模型吧。

3. HTTP摘要认证模型

HTTP摘要认证与基本认证类似,基于简单的“挑战-回应”模型。当我们发起一个未经认证的请求时,服务器会返回一个401回应,并给客户端返回与验证相关的参数,期待客户端依据这些参数继续做出回应,从而完成整个验证过程。

这时候你可能会问,服务端会给客户端返回哪些与验证相关的参数呢?挺多的,你往下看!

4. HTTP摘要认证核心参数

服务端给客户端返回的验证相关参数如下:

  • username: 用户名。
  • password: 用户密码。
  • realm: 认证域,由服务器返回。
  • opaque: 透传字符串,客户端应原样返回。
  • method: 请求的方法。
  • nonce: 由服务器生成的随机字符串,包含过期时间(默认过期时间300s)和密钥。
  • nc: 即nonce-count,指请求的次数,用于计数,防止重放攻击。qop被指定时,nc也必须被指定。
  • cnonce: 客户端发给服务器的随机字符串,qop被指定时,cnonce也必须被指定。
  • qop: 保护级别,客户端根据此参数指定摘要算法。若取值为 auth,则只进行身份验证;若取值为auth-int,则还需要校验内容完整性,默认的qop为auth。
  • uri: 请求的uri。
  • response: 客户端根据算法算出的摘要值,这个算法取决于qop。
  • algorithm: 摘要算法,目前仅支持MD5。
  • entity-body: 页面实体,非消息实体,仅在auth-int中支持。

通常服务器端返回的数据包括realm、opaque、nonce、qop等字段,如果客户端需要做出验证回应,就必须按照一定的算法得到一些新的数据并一起返回。在以上各种参数中,对服务器而言,最重要的字段是nonce;对客户端而言,最重要的字段是response。

参数好多啊,这谁能记得住啊!说实话,我也记不住,其实对这些参数记几个重要的即可,其余的以后开发时,如果真的用得到,打开 一一哥 的这篇博文,查查是啥意思就好。

二. 摘要认证代码实现

纸上得来终觉浅,绝知此事要躬行!摘要认证的理论知识,我们就了解这么多,还是带大家来实操一把,把代码给搞出来。

注意:

我实现这个摘要认证时,结合了数据库查询,这属于后面章节的内容,算是超纲了,如果小伙伴看不懂,到时候请结合后面关于数据库查询的章节一起看!

1. 编写测试接口

我们还是在上个案例的基础上,对项目加以改造,编写Web测试接口,具体创建过程参考上文:

《Spring Security系列教程03--创建SpringSecurity项目》

@RestController
public class IndexController {@GetMapping("/admin/hello")public String helloAdmin() {return "hello, admin";}@GetMapping("/user/hello")public String helloUser() {return "hello, user";}@GetMapping("/visitor/hello")public String helloVisitor() {return "hello, visitor";}}

2. 创建SecurityConfig配置类

当然,对于Spring Security来说,比较关键的就是要有一个SecurityConfig配置类,这里比较重要的是配置摘要认证入口端点DigestAuthenticationEntryPoint。

@EnableWebSecurity(debug = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Autowiredprivate DigestAuthenticationEntryPoint digestAuthenticationEntryPoint;@Autowiredprivate MyUserDetailsService userDetailsService;//配置认证入口端点,主要是设置认证参数信息@Beanpublic DigestAuthenticationEntryPoint digestAuthenticationEntryPoint(){DigestAuthenticationEntryPoint point=new DigestAuthenticationEntryPoint();point.setKey("Security Demos");point.setRealmName("yyg");point.setNonceValiditySeconds(500);return point;}public DigestAuthenticationFilter digestAuthenticationFilter(){DigestAuthenticationFilter filter=new DigestAuthenticationFilter();filter.setAuthenticationEntryPoint(digestAuthenticationEntryPoint);filter.setUserDetailsService(userDetailsService);return filter;}@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/admin/**").hasRole("ADMIN").antMatchers("/user/**").hasRole("USER").antMatchers("/visitor/**").permitAll().anyRequest().authenticated().and().csrf().disable()//当未认证时访问某些资源,则由该认证入口类来处理..exceptionHandling().authenticationEntryPoint(digestAuthenticationEntryPoint).and()//添加自定义过滤器到过滤器链中.addFilter(digestAuthenticationFilter());}}

3. 代码结构

本案例的项目包结构如下,供各位参考。

4. 测试接口

接着来访问一下需要认证的接口,比如/admin/hello接口,这时候会发现浏览器弹出了一个用户名密码的认证窗口。然后我们在浏览器中可以看到HTTP摘要认证信息,realm是我们自定义的“yyg”,qop是默认的“auth”方式。

由此可见,此时摘要认证的方式已经生效。

5. HTTP摘要认证弊端

HTTP摘要认证与HTTP基本认证一样,都是基于HTTP层面的认证方式,也不能使用Session对象,因而也不支持Remember-Me功能。该方式虽然解决了HTTP基本认证中以明文传输密码的问题,但并未解决密码明文存储的问题,所以依然有安全隐患,所以在开发中,摘要认证的方式也不怎么使用。

这就是所谓的摘要认证方式,我就给大家介绍这么多,各位对其仅做了解即可。在3种认证方式里,我们应该重点掌握表单认证的实现。

Spring Security系列教程06--实现HTTP摘要认证相关推荐

  1. Spring Security系列教程03--创建SpringSecurity项目

    前言 在上一章节中,一一哥 已经带大家认识了Spring Security,对其基本概念已有所了解,但是作为一个合格的程序员,最关键的肯定还是得动起手来,所以从本篇文章开始,我就带大家搭建第一个Spr ...

  2. 千锋教育威哥学Java——爆破专栏丨Spring Security系列教程之解决Spring Security环境中的跨域问题

    前言 上一章节中,一一哥 给各位讲解了同源策略和跨域问题,以及跨域问题的解决方案,在本篇文章中,我会带大家进行代码实现,看看在Spring Security环境中如何解决跨域问题. 需要更多教程,微信 ...

  3. Spring Security系列教程解决Spring Security环境中的跨域问题

    原创:千锋一一哥 前言 上一章节中,一一哥 给各位讲解了同源策略和跨域问题,以及跨域问题的解决方案,在本篇文章中,我会带大家进行代码实现,看看在Spring Security环境中如何解决跨域问题. ...

  4. Spring Security系列教程11--Spring Security核心API讲解

    前言 经过前面几个章节的学习,一一哥 带大家实现了基于内存和数据库模型的认证与授权,尤其是基于自定义的数据库模型更是可以帮助我们进行灵活开发.但是前面章节的内容,属于让我们达到了 "会用&q ...

  5. Spring Security系列教程-Spring Security核心API讲解

    前言 经过前面几个章节的学习,一一哥 带大家实现了基于内存和数据库模型的认证与授权,尤其是基于自定义的数据库模型更是可以帮助我们进行灵活开发.但是前面章节的内容,属于让我们达到了 "会用&q ...

  6. Spring Security系列教程18--会话管理之防御固定会话攻击

    前言 在前面几个章节中,一一哥 带各位学习了如何实现基于数据库进行认证授权,如何给登录界面添加图形验证码,如何进行自动登录和注销登录,那么Spring Security的功能难道只有这些吗?肯定不是的 ...

  7. Spring Security系列教程21--会话管理之实现集群会话

    前言 现在我们已经掌握了如何防御会话固定攻击,处理会话过期,对会话进行并发控制等,但是这些会话处理手段都是针对单机环境下的,在现在的大型项目中,很多时候都是采用分布式开发方案.一旦涉及到分布式方案,就 ...

  8. 爆破专栏丨Spring Security系列教程之实现CAS单点登录上篇-概述

    作者:千锋一一哥 前言 从本章节开始,一一哥 会给各位讲解一个很常见也很重要的知识点,就是单点登录!现在的大型分布式项目,基本都会考虑实现单点登录,而且现在网上也有很多单点登录的实现方案.开源项目,但 ...

  9. java培训爆破专栏之Spring Security系列教程之实现CAS单点登录上篇-概述

    作者:千锋一一哥 前言 从本章节开始,一一哥 会给各位讲解一个很常见也很重要的知识点,就是单点登录!现在的大型分布式项目,基本都会考虑实现单点登录,而且现在网上也有很多单点登录的实现方案.开源项目,但 ...

  10. Spring Security 示例教程

    Spring Security 示例教程 Spring Security提供了在Web应用程序中执行身份验证和授权的方法.我们可以在任何基于servlet的Web应用程序中使用spring secur ...

最新文章

  1. PAT刷题 (Java语言)
  2. 日历控件的android代码,Android日历控件PickTime代码实例
  3. Linux下源码安装CodeBlocks
  4. ”System.Configuration.ConfigurationSettings.AppSettings“ 已过时----解决方案
  5. 你能分清多进程与多线程吗?
  6. Linux驱动设计ioctl函数的cmd参数不能为2
  7. 蓝牙mesh网络基础
  8. clamav Java_ClamAV安装使用及API例子
  9. Response.Redirect奇怪现象
  10. JavaScript ECMAScript版本介绍
  11. 字节高工强推 “Android学习视频教程631部,文末有链接哦”
  12. forge是用java装吗_我的世界forge怎么安装 forge使用方法
  13. 幂级数收敛域和和函数定义域的问题
  14. Java 不懂英语可以用拼音声明_编程经验点滴----避免使用汉语拼音做变量名
  15. 有人在研究arroundme 吗,一个开源的php社会化网络程序
  16. HTML+CSS+JavaScript+Ajax+ECharts实现疫情实时监控大屏-2设计与实现
  17. error: Failed dependencies: mariadb-libs is obsoleted by MySQL-shared-compat-5.6.46-1.el7.x86_64
  18. 这类保险看起来很好,我却不推荐。
  19. 计算机毕业设计SSM房屋出租管理系统【附源码数据库】
  20. 微信小程序 视频列表滑动无限循环(仿抖音)

热门文章

  1. 典型IO模型----阻塞IO,非阻塞IO,信号驱动IO,异步IO
  2. IOS ipv6测试
  3. 范数和条件数(Norms and Condition Numbers)
  4. java计算两个时间为天数_java计算两个时间相差天数的方法汇总
  5. 使用极狐GitLab限制开发者使用CI/CD的权限,三种方案
  6. 城市打印店一般几点开门?
  7. Java 第三阶段增强分析需求,代码实现能力【满汉楼】
  8. 蒸汽凝结水颜色发红十种常见除铁处理技术优劣对比
  9. cents7.6安装rancher
  10. Neo4j 第二篇:图形数据库