千家信息网

RestTemplate怎么通过HTTP Basic Auth认证

发表于:2024-09-27 作者:千家信息网编辑
千家信息网最后更新 2024年09月27日,这篇"RestTemplate怎么通过HTTP Basic Auth认证"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能
千家信息网最后更新 2024年09月27日RestTemplate怎么通过HTTP Basic Auth认证

这篇"RestTemplate怎么通过HTTP Basic Auth认证"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"RestTemplate怎么通过HTTP Basic Auth认证"文章吧。

一、HttpBasic认证原理说明

首先,HttpBasic模式要求传输的用户名密码使用Base64模式进行加密。如果用户名是 "admin" ,密码是" admin",则将字符串"admin:admin"使用Base64编码算法加密。加密结果可能是:YWtaW46YWRtaW4=。

然后,在Http请求中使用authorization作为一个HTTP请求头Header name,"Basic YWtaW46YWRtaW4="作为Header的值,发送给服务端。(注意这里使用Basic+空格+加密串)

服务器在收到这样的请求时,到达BasicAuthenticationFilter过滤器,将提取"authorization"的Header值,并使用用于验证用户身份的相同算法Base64进行解码。

解码结果与登录验证的用户名密码匹配,匹配成功则可以继续过滤器后续的访问。

二、HTTP Basic Auth服务端实现

如果你想自己搭建一个服务端,那么如何为Spring Boot 服务添加Basic Auth认证?请参考我的另外一篇文章:《Spring Security系列之Http Basic Auth登录认证模式》 。

当然我们也可以不用自己去搭建服务端,给大家介绍一个提供免费在线的RESTful接口服务的网站:httpbin.com。这个网站为我们提供了Basic Auth认证测试服务接口。如果我们只是为了学习RestTemplate,直接用这个网站提供的服务就可以了。

浏览器访问地址:http://www.httpbin.org/#/Auth/get_basic_auth__user___passwd_

这个接口服务是通过OpenAPI(swagger)实现的,所以可以进行在线的访问测试。所以可以先通过页面操作测试一下,再开始下面学习使用RestTemplate访问服务端接口。

三、请求头方式携带认证信息

在HTTP请求头中携带Basic Auth认证的用户名和密码,具体实现参考下文代码注释:

@SpringBootTestclass BasicAuthTests {   @Resource   private RestTemplate restTemplate;   @Test   void testBasicAuth() {      //该url上携带用户名密码是httpbin网站测试接口的要求,     //真实的业务是不需要在url上体现basic auth用户名密码的      String url = "http://www.httpbin.org/basic-auth/admin/adminpwd";      //在请求头信息中携带Basic认证信息(这里才是实际Basic认证传递用户名密码的方式)      HttpHeaders headers = new HttpHeaders();      headers.set("authorization",                  "Basic " +                  Base64.getEncoder()                         .encodeToString("admin:adminpwd".getBytes()));     //发送请求      HttpEntity ans = restTemplate                  .exchange(url,                        HttpMethod.GET,   //GET请求                        new HttpEntity<>(null, headers),   //加入headers                        String.class);  //body响应数据接收类型      System.out.println(ans);   }}

测试用例执行成功,说明RestTemplate 正确的携带了Basic 认证信息,得到正常的响应结果:200。

四、拦截器方式携带认证信息

第三小节中的代码虽然实现了功能,但是不够好。因为每一次发送HTTP请求,我们都需要去组装HttpHeaders 信息,这样不好,造成大量的代码冗余。那么有没有一种方式可以实现可以一次性的为所有RestTemplate请求API添加Http Basic认证信息呢?答案就是:在RestTemplate Bean初始化的时候加入拦截器,以拦截器的方式统一添加Basic认证信息。

下面的代码结合注释去看,如果看不懂,需要去参考:

精讲RestTemplate第2篇-多种底层HTTP客户端类库的切换

@Configurationpublic class ContextConfig {    @Bean("OKHttp3")    public RestTemplate OKHttp3RestTemplate(){        RestTemplate restTemplate = new RestTemplate(getClientHttpRequestFactory());        //添加拦截器        restTemplate.getInterceptors().add(getCustomInterceptor());        return restTemplate;    }   //实现一个拦截器:使用拦截器为每一个HTTP请求添加Basic Auth认证用户名密码信息    private ClientHttpRequestInterceptor getCustomInterceptor(){        ClientHttpRequestInterceptor interceptor = (httpRequest, bytes, execution) -> {            httpRequest.getHeaders().set("authorization",                    "Basic " +                            Base64.getEncoder()                                    .encodeToString("admin:adminpwd".getBytes()));            return execution.execute(httpRequest, bytes);        };        return interceptor;    }    //这段代码是《第3节-底层HTTP客户端实现切换》的内容    private ClientHttpRequestFactory getClientHttpRequestFactory() {        int timeout = 100000;        OkHttp3ClientHttpRequestFactory clientHttpRequestFactory                = new OkHttp3ClientHttpRequestFactory();        clientHttpRequestFactory.setConnectTimeout(timeout);        return clientHttpRequestFactory;    }}

在RestTemplate Bean初始化的时候加入拦截器之后,第三小节中的代码就可以省略HttpHeaders Basic Auth请求头携带信息的组装过程。发送请求,结果和第三小节中的效果是一样的。

五、进一步简化

上面的方式使用了拦截器,但仍然是我们自己来封装HTTP headers请求头信息。进一步的简化方法就是,Spring RestTemplate 已经为我们提供了封装好的Basic Auth拦截器,我们直接使用就可以了,不需要我们自己去实现拦截器。

下面的方法是在RestTemplate Bean实例化的时候使用RestTemplateBuilder,自带basicAuthentication。所以到这里拦截器也不需要了(实际底层代码实现仍然是拦截器,只是api层面不需要指定拦截器了)。

发送请求,结果和第三小节中的效果是一样的。

以上就是关于"RestTemplate怎么通过HTTP Basic Auth认证"这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注行业资讯频道。

认证 拦截器 信息 服务 用户 密码 用户名 代码 内容 方式 结果 测试 小节 接口 网站 加密 就是 底层 时候 模式 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 国外服务器需要备案吗 用友报表取不出数据库 奉贤区数据金融网络技术服务优势 广州十大网络技术学院 网络技术侦查专业 专网网络安全设备采购项目 咏雪翻译软件开发 网购采用网络技术 钟寒网络安全保卫学院 北京中清龙网络技术 我国哪些网络技术是世界前沿的 今日头条的软件开发怎么样 天马时空网络技术有限公司客服 软件合同纠纷与软件开发纠纷 数据库口令信息远程传输加密 maven项目改数据库数据 c语言CAI软件开发程序 在指定的数据库中选择新建视图 配置的dns服务器不存在 深圳市掌柜网络技术有限公司电话 伊犁网络技术发展 双数据库技术 八宝景天互联网科技有限公司 厦门六中网络安全 网络安全知识学习手抄报 公安部网络安全总队机构设置 数据库口令信息远程传输加密 品质软件开发服务厂家现货 网络安全风险管理要求 软件开发中心职工待遇
0