当前位置: 首页 > news >正文

spring security面经-字节飞书生产力工具后端一面

1 登录流程怎么做的;spring security 做了什么;如何配置 userpassword 校验?用的是什么设计模式?数据量大不大?

登录流程在使用Spring Security时大致如下:

  1. 用户提交凭证:用户通过登录页面或API提交用户名和密码。

  2. 认证过滤器:Spring Security 提供的认证过滤器(如UsernamePasswordAuthenticationFilter)捕获登录请求并提取凭证。

  3. 认证管理器:凭证被传递给认证管理器(AuthenticationManager),它负责进行实际的认证逻辑。

  4. 用户细节服务:认证管理器使用配置的用户细节服务(UserDetailsService)来获取用户信息,并进行凭证校验。

  5. 认证成功或失败:如果认证成功,用户被授予相应的权限并进行后续处理;如果失败,则抛出异常。

Spring Security在此过程中实现了几个重要的安全特性,如:

  • 细节隐藏:隐藏用户存储细节。
  • 密码加密:通常使用加密算法(如BCrypt)来安全地存储和校验密码。
  • 会话管理:管理用户会话和认证状态。
  • 权限控制:控制对资源的访问权限。

为了配置用户名和密码的校验,通常需要:

  • 配置UserDetailsService以提供用户信息。
  • 配置密码加密器,如BCryptPasswordEncoder
  • WebSecurityConfigurerAdapter中配置相应的认证管理器和其他安全设置。

Spring Security使用多种设计模式,其中包括:

  • 装饰者模式:用于扩展或自定义过滤器链。
  • 策略模式:在不同的认证和授权策略之间切换。
  • 工厂模式:创建安全配置和组件。

关于数据量的问题,这通常取决于应用程序的规模和用户基数。Spring Security本身不存储用户数据,它处理的是认证和授权逻辑。用户数据的规模将取决于用户存储的方式和规模。在处理大规模用户数据时,需要考虑数据库的性能和优化。

2 细节问题

2.1 Spring Security 提供的认证过滤器(如UsernamePasswordAuthenticationFilter)捕获登录请求并提取凭证。如何提取凭证

2.2 认证管理器如何认证,这个管理器是可以独立部署的吗

2.3 用户细节服务:认证管理器使用配置的用户细节服务(UserDetailsService)来获取用户信息,并进行凭证校验。这个用来查询数据库嘛?

  1. 提取凭证的过程:在UsernamePasswordAuthenticationFilter中,当一个登录请求到达时,该过滤器会从HTTP请求中提取用户名和密码。这通常是通过读取表单提交的数据或者API请求中的JSON数据来实现的。具体的提取方法取决于请求的格式和配置。

  2. 认证管理器的认证过程AuthenticationManager接收一个Authentication对象(通常是UsernamePasswordAuthenticationToken),其中包含了用户的凭证。它调用配置好的AuthenticationProvider来进行实际的认证过程。每个AuthenticationProvider会检查提供的凭证并返回一个已填充的Authentication对象,如果凭证有效。AuthenticationManager并不是设计为独立部署的服务;它是Spring Security框架的一部分,运行在应用程序的上下文中。

  3. 用户细节服务的作用UserDetailsService接口的主要作用是从数据源(通常是数据库)中检索用户信息。它根据用户名加载用户的详细信息(如密码、角色、是否被锁定等),这些信息随后用于与用户提供的凭证进行比较,以验证用户的身份。在数据库中存储用户信息是一种常见的做法,但UserDetailsService也可以被实现以从其他来源获取用户数据。

3 权限控制:控制对资源的访问权限。如何实现

在Spring Security中,权限控制是通过一系列的拦截器和表达式来实现的,它们决定了用户是否有权访问特定的资源。具体实现通常涉及以下几个方面:

  1. 配置安全拦截:在Spring Security配置中(例如通过继承WebSecurityConfigurerAdapter),你可以定义哪些URL路径应该受保护,以及所需的权限。这通常是使用.antMatchers()方法和相关的权限表达式来完成的。

  2. 方法安全:通过使用注解如@PreAuthorize@PostAuthorize@Secured等,可以在具体的服务或控制器方法上进行细粒度的权限控制。这些注解允许你定义访问特定方法所需的权限。

  3. 角色和权限:通常在用户的身份认证过程中会加载用户的角色和权限。这些角色和权限随后用于评估安全表达式。

  4. 自定义表达式:Spring Security还允许定义自定义的安全表达式,提供更灵活的权限控制。

  5. 访问决策管理器:Spring Security使用访问决策管理器(如AffirmativeBasedConsensusBased)来评估安全表达式,并做出是否允许访问的决策。

通过这些机制,Spring Security能够提供强大而灵活的方式来控制对应用程序资源的访问。

4 Authentication对象和评估安全表达式

4.1 每个AuthenticationProvider会检查提供的凭证并返回一个已填充的Authentication对象,这个Authentication对象包含了哪些信息,会用来干什么

  1. Authentication对象包含的信息Authentication对象是Spring Security中的核心接口之一,用于表示用户的认证信息。它通常包含以下信息:

    • Principal:表示用户的身份,通常是UserDetails对象,包含用户名、密码、权限等信息。
    • Credentials:通常是用户的密码。
    • Authorities:用户拥有的权限,通常表示为一组GrantedAuthority对象。
    • Details:附加信息,如用户的IP地址或请求的详情。
    • Authenticated:一个布尔值,表示用户是否已经被认证。

    Authentication对象在整个安全框架中被用来表示当前用户的安全上下文,用于访问控制和权限检查。

4.2 自定义表达式:Spring Security还允许定义自定义的安全表达式,提供更灵活的权限控制。举个例子

  1. 自定义安全表达式示例:在Spring Security中,你可以定义自己的安全表达式来进行更复杂的权限检查。例如,假设你有一个方法,只有当用户拥有某个权限并且满足某个业务条件时才能访问:

    @PreAuthorize("hasAuthority('ROLE_ADMIN') and @mySecurityService.checkCondition(principal)")
    public void myMethod() {// 业务逻辑
    }
    

    在这个例子中,@PreAuthorize注解使用了一个自定义的表达式,其中@mySecurityService.checkCondition(principal)调用了一个自定义的安全服务(mySecurityService)的方法,以检查当前用户(principal)是否满足特定条件。这样,你就可以将业务逻辑与安全逻辑相结合,实现更灵活的权限控制。

4.2 这里的Authentication会被用来和安全表达式进行匹配对吗?

是的,Authentication对象会被用来与安全表达式进行匹配。在Spring Security中,安全表达式(如在@PreAuthorize, @Secured, @RolesAllowed等注解中使用的表达式)通常依赖于Authentication对象中的信息来决定是否授权访问特定资源或执行特定操作。这些表达式会检查Authentication对象中的principal(用户身份)、authorities(授权信息)、credentials(凭证),以及其他细节,来判断用户是否满足给定的安全要求。

相关文章:

  • Google Bard vs. ChatGPT 4.0:文献检索、文献推荐功能对比
  • Linux AMH服务器管理面板本地安装与远程访问
  • 30 剑指offer-动态规划求正则表达式匹配
  • 第九天:信息打点-CDN绕过篇amp;漏洞回链amp;接口探针amp;全网扫描amp;反向邮件
  • 数据结构和算法专题---2、算法思想
  • 把 Windows 11 装进移动硬盘:Windows 11 To Go
  • UDP协议实现群聊
  • C++ 多态性(Polymorphism)和 虚函数(Virtual Functions)
  • Kubernetes里的DNS;API资源对象ingress;Kubernetes调度;节点选择器NodeSelector;节点亲和性NodeAffinity
  • 五:爬虫-数据解析之xpath解析
  • 【C++】简单工厂模式
  • C++STL的string(超详解)
  • 大量 SVG 图标在 React 中的极速集成与应用
  • MySQL概述-安装与启动
  • P1317 低洼地题解
  • CSS实用技巧
  • JAVA_NIO系列——Channel和Buffer详解
  • Map集合、散列表、红黑树介绍
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • vue-cli3搭建项目
  • 机器学习学习笔记一
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 区块链分支循环
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 深入浏览器事件循环的本质
  • 时间复杂度与空间复杂度分析
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • 第二十章:异步和文件I/O.(二十三)
  • 说说我为什么看好Spring Cloud Alibaba
  • ​MySQL主从复制一致性检测
  • ​低代码平台的核心价值与优势
  • ## 1.3.Git命令
  • (2024,LoRA,全量微调,低秩,强正则化,缓解遗忘,多样性)LoRA 学习更少,遗忘更少
  • (pycharm)安装python库函数Matplotlib步骤
  • (二刷)代码随想录第16天|104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (三十五)大数据实战——Superset可视化平台搭建
  • (四)进入MySQL 【事务】
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .NET 快速重构概要1
  • .NET/C# 编译期能确定的字符串会在字符串暂存池中不会被 GC 垃圾回收掉
  • .NET程序集编辑器/调试器 dnSpy 使用介绍
  • .net快速开发框架源码分享
  • .Net组件程序设计之线程、并发管理(一)
  • /使用匿名内部类来复写Handler当中的handlerMessage()方法
  • @angular/cli项目构建--Dynamic.Form
  • @DataRedisTest测试redis从未如此丝滑
  • @KafkaListener注解详解(一)| 常用参数详解
  • @ModelAttribute使用详解
  • @property @synthesize @dynamic 及相关属性作用探究
  • [2024最新教程]地表最强AGI:Claude 3注册账号/登录账号/访问方法,小白教程包教包会
  • [AHK V2]鼠标悬停展开窗口,鼠标离开折叠窗口