欢迎光临散文网 会员登陆 & 注册

开课吧Web3.0应用工程师培养计划2022最新-大江茫茫去不还

2022-11-16 21:42 作者:山观那恭喜囧昂贵的  | 我要投稿


使用Spring Security REST服务的基本/摘要认证

开课吧Web3.0应用工程师培养计划2022最新

download:https://www.zxit666.com/5408/

本文讨论如何在REST API的同一个URI结构上设置基本身份验证和摘要式身份验证。在上一篇文章中,我们讨论了保护REST服务的另一种方法——基于表单的身份验证,因此基本身份验证和摘要式身份验证是自然的选择,也是更RESTful的身份验证方法。
的基本身份验证配置
基于表单的认证不适合RESTful服务的主要原因是Spring Security会使用会话——这当然是服务器上的状态,所以REST中的无状态约束几乎被忽略。
首先,我们设置基本身份验证——首先,我们从主要安全元素中删除旧的自定义入口点和过滤器

注意如何用一个配置行添加对基本身份验证的支持——它处理BasicAuthenticationFilter和BasicAuthenticationEntryPoint的创建和连接。

满足无状态约束——摆脱会话

RESTful架构风格的一个主要限制是客户端-服务器通信是完全无状态的,如原文所示:
5.1.3无状态:接下来,我们给客户端-服务器交互添加一个约束:通信本质上必须是无状态的,比如3.4.3节中的客户端无状态服务器(CSS)风格(图5-3),这样从客户端到服务器的每个请求都必须包含理解请求所需的所有信息,并且不能利用服务器上任何存储的上下文。因此,会话状态完全保留在客户端上。
server上的Session这个概念在Spring Security中由来已久,直到现在也没有被完全删除,尤其是使用namespace完成配置的时候。
然而,Spring Security用一个新的无状态选项增强了名称空间配置,这有效地保证了Spring不会创建或使用任何会话。这个新选项的作用是从安全过滤器链中删除所有与会话相关的过滤器,并确保每个请求都经过身份验证。

摘要式身份验证的配置

从前面的配置开始,设置摘要式身份验证所需的过滤器和入口点将被定义为bean。然后,摘要入口点将覆盖由幕后创建的入口点。最后,将使用安全名称空间的语义在安全过滤器链中引入一个定制的摘要过滤器,以直接在它之后定位基本身份验证过滤器。

" org . spring framework . security . web . authentic ation . www . digestauthenticationfilter " >

" org . spring framework . security . web . authentic ation . www . digestauthenticationentrypoint " >
复制代码
遗憾的是,安全命名空间不支持摘要式身份验证的自动配置,这与使用配置基本身份验证是一样的。因此,必须手动定义必要的bean并将其连接到安全配置。
在同一个RESTful服务中支持两种身份验证协议。
只有在Spring Security中才能轻松实现基本或摘要式身份验证;它支持相同的RESTful Web服务,并在相同的URI映射上引入了新的服务配置和测试复杂性。

匿名请求


通过安全链中的基本过滤器和摘要过滤器,Spring Security处理匿名请求(没有身份验证凭证(授权HTTP头)的请求)时,两个身份验证过滤器不会找到凭证,而是继续执行过滤链。然后,检查请求未被认证的方式,抛出AccessDeniedException并在ExceptionTranslationFilter中捕获它,这将启动摘要入口点并提示客户端提供凭据。
摘要过滤器的范围非常窄——如果它们不能识别请求中的身份验证凭证类型,它们将继续执行安全过滤器链。正因为如此,Spring Security可以灵活地配置,以便在同一个URI上支持多个身份验证协议。
当请求包含正确的身份验证凭据(基本或摘要)时,将正确使用此协议。但是,对于匿名请求,只会提示客户端提取摘要式身份验证凭据。这是因为摘要入口点被配置为Spring安全链的主要和单一入口点;因为这样的摘要认证可以被认为是默认的。

请求身份验证凭据

具有基本身份验证凭据的请求将由以“Basic”前缀开头的授权头来标识。当处理这样的请求时,凭证将在基本认证过滤器中被解码,并且请求将被授权。同样,具有摘要式身份验证凭据的请求将使用前缀“Digest”作为其授权头。

测试两个案例。

使用basic或Digest进行身份验证后,测试将通过创建新资源来使用REST服务:
@测试
public void givenuthenticatedbybasicauth _ wharesourceiscreated _ then 201 is received(){
//给定
//何时
响应响应=给定()
。auth()。抢先()。基本(管理员用户名、管理员密码)
。contentType( HttpConstants。MIME_JSON)。body( new Foo( randomAlphabetic( 6)))
。post(paths . getfoourl());

//然后
assertThat(response . getstatuscode(),is(201));
}
@测试
public void givenuthenticatedbydigestauth _ wharesourceiscreated _ then 201 is received(){
//给定
//何时
响应响应=给定()
。auth()。摘要(管理员用户名、管理员密码)
。contentType( HttpConstants。MIME_JSON)。body( new Foo( randomAlphabetic( 6)))
。post(paths . getfoourl());

//然后
assertThat(response . getstatuscode(),is(201));
}
复制代码
请注意,使用基本身份验证的测试会先发制人地将凭证添加到请求中,而不管服务器是否已经过身份验证。这是为了确保服务器不需要从客户端请求凭证,因为这样将使用摘要凭证,这是默认值。

案件结论


本文介绍了RESTful服务的基本认证和摘要认证的配置和实现,主要使用了Spring安全命名空间支持和框架中的一些新功能。

开课吧Web3.0应用工程师培养计划2022最新-大江茫茫去不还的评论 (共 条)

分享到微博请遵守国家法律