Spring Security系列教程06--实现HTTP摘要认证

简介: 前言在前面的2个章节中,一一哥 带大家认识了Spring Security中的第基本认证与表单认证 2种认证方式,其中表单认证是Spring Security默认的认证方式,也是开发时最常用的认证方式。有的小伙伴会问,不是还有第3种认证方式吗?对的,还有第三种摘要认证方式!在本文中,我们来学习了解一下HTTP摘要认证。但是对于摘要认证,我们仅做了解即可,因为这种认证方式仅比基本认证稍微安全一点,开发时用的也不是很多。抱着艺多不压身的心态,我们多了解一点反正也没坏处。

前言

在前面的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项目》

@RestControllerpublicclassIndexController {
@GetMapping("/admin/hello")
publicStringhelloAdmin() {
return"hello, admin";
    }
@GetMapping("/user/hello")
publicStringhelloUser() {
return"hello, user";
    }
@GetMapping("/visitor/hello")
publicStringhelloVisitor() {
return"hello, visitor";
    }
}

2. 创建SecurityConfig配置类

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

@EnableWebSecurity(debug=true)
publicclassSecurityConfigextendsWebSecurityConfigurerAdapter {
@AutowiredprivateDigestAuthenticationEntryPointdigestAuthenticationEntryPoint;
@AutowiredprivateMyUserDetailsServiceuserDetailsService;
//配置认证入口端点,主要是设置认证参数信息@BeanpublicDigestAuthenticationEntryPointdigestAuthenticationEntryPoint(){
DigestAuthenticationEntryPointpoint=newDigestAuthenticationEntryPoint();
point.setKey("Security Demos");
point.setRealmName("yyg");
point.setNonceValiditySeconds(500);
returnpoint;
    }
publicDigestAuthenticationFilterdigestAuthenticationFilter(){
DigestAuthenticationFilterfilter=newDigestAuthenticationFilter();
filter.setAuthenticationEntryPoint(digestAuthenticationEntryPoint);
filter.setUserDetailsService(userDetailsService);
returnfilter;
    }
@Overrideprotectedvoidconfigure(HttpSecurityhttp) throwsException {
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种认证方式里,我们应该重点掌握表单认证的实现。

相关文章
|
4月前
|
安全 Java 数据库
安全无忧!在 Spring Boot 3.3 中轻松实现 TOTP 双因素认证
【10月更文挑战第8天】在现代应用程序开发中,安全性是一个不可忽视的重要环节。随着技术的发展,双因素认证(2FA)已经成为增强应用安全性的重要手段之一。本文将详细介绍如何在 Spring Boot 3.3 中实现基于时间的一次性密码(TOTP)双因素认证,让你的应用安全无忧。
263 5
|
6月前
|
SQL Java 测试技术
在Spring boot中 使用JWT和过滤器实现登录认证
在Spring boot中 使用JWT和过滤器实现登录认证
332 0
|
4月前
|
算法 数据库 数据安全/隐私保护
摘要认证,使用HttpClient实现HTTP digest authentication
这篇文章提供了使用HttpClient实现HTTP摘要认证(digest authentication)的详细步骤和示例代码。
335 2
|
2月前
|
安全 Java 数据安全/隐私保护
基于内存认证的 Spring Security
通过本文的介绍,希望您能够深入理解基于内存认证的Spring Security配置与使用方法,并能够在实际开发中灵活应用这一技术,提升应用的安全性和用户体验。
70 9
|
3月前
|
JSON 安全 算法
Spring Boot 应用如何实现 JWT 认证?
Spring Boot 应用如何实现 JWT 认证?
108 8
|
4月前
|
负载均衡 Java 开发者
Spring Cloud 远程调用:为何选择 HTTP 而非 RPC?
【10月更文挑战第1天】在微服务架构中,远程服务调用是一个核心环节。面对HTTP和RPC(Remote Procedure Call,远程过程调用)这两种通信协议,Spring Cloud 选择了HTTP作为其主要通信手段。本文将深入探讨Spring Cloud选择HTTP而非RPC的原因,以及这一选择在实际工作中的优势。
169 0
|
6月前
|
Java Spring
【Azure Spring Cloud】Spring Cloud Azure 4.0 调用Key Vault遇见认证错误 AADSTS90002: Tenant not found.
【Azure Spring Cloud】Spring Cloud Azure 4.0 调用Key Vault遇见认证错误 AADSTS90002: Tenant not found.
|
6月前
|
消息中间件 安全 Java
Spring Boot 基于 SCRAM 认证集成 Kafka 的详解
【8月更文挑战第4天】本文详解Spring Boot结合SCRAM认证集成Kafka的过程。SCRAM为Kafka提供安全身份验证。首先确认Kafka服务已启用SCRAM,并准备认证凭据。接着,在`pom.xml`添加`spring-kafka`依赖,并在`application.properties`中配置Kafka属性,包括SASL_SSL协议与SCRAM-SHA-256机制。创建生产者与消费者类以实现消息的发送与接收功能。最后,通过实际消息传递测试集成效果与认证机制的有效性。
231 4
|
6月前
|
Java Spring 安全
Spring 框架邂逅 OAuth2:解锁现代应用安全认证的秘密武器,你准备好迎接变革了吗?
【8月更文挑战第31天】现代化应用的安全性至关重要,OAuth2 作为实现认证和授权的标准协议之一,被广泛采用。Spring 框架通过 Spring Security 提供了强大的 OAuth2 支持,简化了集成过程。本文将通过问答形式详细介绍如何在 Spring 应用中集成 OAuth2,包括 OAuth2 的基本概念、集成步骤及资源服务器保护方法。首先,需要在项目中添加 `spring-security-oauth2-client` 和 `spring-security-oauth2-resource-server` 依赖。
77 0
|
7月前
|
Java Spring
spring restTemplate 进行http请求的工具类封装
spring restTemplate 进行http请求的工具类封装
293 3