Springboot +spring security,认证方式---实现HTTP摘要认证

news2024/11/28 15:55:46

一.简介

这篇文章来学习下security的认证方式其中的HTTP摘要认证

二.Spring Security的认证方式

2.1什么是认证

认证:
就是用来判断系统中是否存在某用户,并判断该用户的身份是否合法的过程,解决的其实是用户登录的问题。认证的存在,是为了保护系统中的隐私数据与资源,只有合法的用户才可以访问系统中的资源。

2.2认证的方式

在Spring Security中,常见的认证方式可以分为HTTP层面和表单层面,常见的认证方式如下:

  1. HTTP基本认证;
  2. Form表单认证
  3. HTTP摘要认证;

这篇文章先讲HTTP摘要认证

三. HTTP摘要认证

3.1Form表单认证简介

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

3.2HTTP摘要认证模型

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

3.3HTTP摘要认证核心参数

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

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

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

四. 创建SpringSecurity项目

参考之前的文章,这边不做叙述。

五.代码实现

5.1创建SecurityConfig配置类

创建SecurityConfig类,继承自WebSecurityConfigurerAdapter父类,该类的作用如下:

  1. 验证所有请求;
  2. 允许用户使用表达登录进行身份验证;
  3. 允许用户使用Http基本认证。

代码如下:

@EnableWebSecurity(debug = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
 
    @Autowired
    private DigestAuthenticationEntryPoint digestAuthenticationEntryPoint;
 
    @Autowired
    private MyUserDetailsService userDetailsService;
 
    //配置认证入口端点,主要是设置认证参数信息
    @Bean
    public DigestAuthenticationEntryPoint digestAuthenticationEntryPoint(){
        DigestAuthenticationEntryPoint point=new DigestAuthenticationEntryPoint();
        point.setKey("Security Demos");
        point.setRealmName("demaxiya");
        point.setNonceValiditySeconds(500);
        return point;
    }
 
    public DigestAuthenticationFilter digestAuthenticationFilter(){
        DigestAuthenticationFilter filter=new DigestAuthenticationFilter();
        filter.setAuthenticationEntryPoint(digestAuthenticationEntryPoint);
        filter.setUserDetailsService(userDetailsService);
        return filter;
    }
 
    @Override
    protected 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());
    }
 
}

5.2创建web接口

IndexController 类的代码如下:

@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";
    }
}

5.3yml配置文件

创建一个application.yml配置文件,配置如下:

spring:
  security:
    user:
      name: demaxiya
      password: 123

5.4MyUserDetailService 类

MyUserDetailService类的代码如下:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
import java.util.Objects;
@Service
public class MyUserDetailService implements UserDetailsService {
    @Autowired
    private UserMapper userMapper;
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = userMapper.loadUserByUserName(username);
        if (Objects.isNull(user)) {
            throw new UsernameNotFoundException("user is null");
        }
        user.setRoles(userMapper.getRolesByUid(user.getId()));
        return user;
    }
}

六.功能验证

6.1启动项目

接着来访问一下需要认证的接口,比如/admin/hello接口,这时候会发现浏览器弹出了一个用户名密码的认证窗口。然后我们在浏览器中可以看到HTTP摘要认证信息,realm是我们自定义的“demaxiya”,qop是默认的“auth”方式。截图如下:
在这里插入图片描述
由此可见,此时摘要认证的方式已经生效。

七.HTTP摘要认证弊端

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/590321.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaScript高级三、深入面向对象

零、文章目录 JavaScript高级三、深入面向对象 1、编程思想 (1)面向过程介绍 面向过程:分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候再一个一个的依次调用就可以了。 (2&…

Android 架构模式

1.三个基本架构 ①MVC(Model-View-Controller) Model:代表数据模型,管理数据状态。 View:视图,即呈现给用户的UI,包括布局文件及Activity。 Controller:控制者,负责处…

KubeVirt技术介绍及实验部署

虚拟化简介 在云计算发展中,有两类虚拟化平台: openstack(iaas):关注于资源的利用,虚拟机的计算,网络和存储Kubernetes(pass):关注容器的编排调度&#xff…

设计模式之~代码模式

描述: 代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问。 结构图: 优点: 代理模式能将代理对象与真实被调用的目标对象分离 一定程度上降低了系统的耦合度,扩展性好 可以起到保护目标对象…

发明专利公开 -- 一种基于 JSON 文件 + Http Header 的支持多项目、多分支、多人协同的 Api Mock/代理 工具

现阶段主流的前后端分离的开发模式下:前后端采用并行开发方式,在前端开发过程中通常需要依附于共同约定的接口格式及数据。 该过程是一个并行过程,因此 Api Mock 模拟接口的返回变成了必要。同时,联调过程中,修改后端…

目标检测笔记(九):详细介绍并实现-如何可视化深度学习中每层特征层的网络训练情况

文章目录 为什么要解析特征层如何可视化特征层可视化结果如何 ❤️ 🧡 💛 💚 💙 💜 🖤 🤍 🤎 💔 ❣️ 💕 💞 💓 💗 &#…

随笔-学会和解

上周六,媳妇儿去加班,回到家已经是晚上8点多了。当天的雨淅沥沥地下了一天,气温很低。 看着她情绪不是很高,也没说啥,赶紧安排吃饭。 我:咋的啦,项目不顺利? 她:还行吧…

【深度学习】【人脸检测模型】SCRFD模型的训练与部署实战

文章目录 Linux安装环境pythoninsightface环境 训练数据集准备todo 训练 Linux安装环境 python 我的cuda版本11.6: $ nvcc --version nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2022 NVIDIA Corporation Built on Tue_Mar__8_18:18:20_PST_2022…

gitlab占用内存太大了如何解决?

大家好,我是雄雄,欢迎关注微信公众号雄雄的小课堂 现在是:2023年5月30日16:58:15 最近在家里自己搞了个服务器,因为这台机器都不用了,从朋友那拿过来,就当服务器用了,看了下,比云服…

python基本操作2(速通版)

关于字符串的基本操作,以实例为主。 目录 一、字符串基本操作 1.基本字符串定义 2.字符串遍历 3字符串切片 二、字符串的常用方法 1.find函数 2.replace函数 3.count函数 4.分割和连接类的函数 5.字符串判断函数 6.去除字符串的 三、元组 1.元组的基本操…

离散数学-集合论

数学基础-离散数学-集合论 集合论是现代各科数学的基础,它起源于十六世纪末期的数集的研究。直到1876-1883年,康托尔发表了一系列有关集合论的文章,奠定了集合论的基础。1904-1908年,策墨罗(Zermelo)提出了集合论的公理系统&…

计算机组成原理-总线-总线的概念、事务和定时

目录 一、总线基本概念 总线特性 二、总线的分类 数据传输格式 2.2按总线的功能 2.2.1片内总线 2.2.2系统总线 2.2.3通信总线 2.3 按时序控制方式 三、系统总线的结构 3.1单总线结构 3.2双总线结构 3.3三总线结构 四、总线的性能指标 五、总线的4个阶段 六、总线的事…

5年测试经验,从月薪9k变1w5,进阶自动化测试真就这么香?

在这个吃技术的IT行业来说,我之前每天做的是最基础的工作,但是随着时间的消磨,我产生了对自我和岗位价值和意义的困惑。 一是感觉自己在浪费时间,另一个就是做了快2年的测试,感觉每天过得浑浑噩噩,薪资也从…

Java --- 云尚办公之微信公众号整合

目录 一、整合微信公众号 1.1、公众号菜单管理 1.2、微信授权登录 1.3、消息推送 一、整合微信公众号 1.1、公众号菜单管理 数据库表: CREATE TABLE wechat_menu (id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT 编号,parent_id BIGINT(20) DEFAULT NULL CO…

day42|动态规划4-背包问题分割等和子集

0-1背包和完全背包搞清楚即可。 0-1背包问题-一维 背包有最大重量的限制,物品有重量有价值,那么在最大背包的限制下,能够得到的最大价值是多少? 暴力解法 每个物品都有放和不放两种状态,那么遍历所有的组合就可以…

谷歌浏览器 | Chrome DevTools系统学习篇- Elements面板(上)

大家好,文接上上回谷歌浏览器 | Chrome DevTools系统学习篇-概述,和上文谷歌浏览器 | Chrome DevTools系统学习篇-Device Mode。所谓“工欲善其事,必先利其器”,我们进一步来熟悉谷歌开发者工具。今天分享的是Elements元素&#x…

我在亚马逊云平台的学习成长之路

前言 今年是亚马逊云科技成立的第16个年头,也是云计算行业诞生的16周年。作为云计算时代的“领头羊”,亚马逊2006年推出了名为Amazon Web Services(AWS)的新产品。AWS背后的想法是提供一个平台,同亚马逊内部使用的平台一样,将其作…

Three.js--》实现3d地月模型展示

目录 项目搭建 初始化three.js基础代码 创建月球模型 添加地球模型 添加模型标签 今天简单实现一个three.js的小Demo,加强自己对three知识的掌握与学习,只有在项目中才能灵活将所学知识运用起来,话不多说直接开始。 项目搭建 本案例还…

230530-论文整理-课题组2

对这些研究有点兴趣颇微。 文章目录 Rethinking Dense Retrieval’s Few-Shot AbilityDecoder-Only or Encoder-Decoder? Interpreting Language Model as a Regularized Encoder-DecoderPLOME: Pre-training with Misspelled Knowledge for Chinese Spelling CorrectionRead…

北邮22信通:复习补充:双向链表的实现

北邮22信通一枚~ 跟随课程进度每周更新数据结构与算法的代码和文章 持续关注作者 解锁更多邮苑信通专属代码~ 获取更多文章 请访问专栏: 北邮22信通_青山如墨雨如画的博客-CSDN博客 **说明** 最近复习看到书后有双向链表的题目,编出来供大家…