我的编程空间,编程开发者的网络收藏夹
学习永远不晚

SpringSecurity常见面试题汇总(超详细回答)

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

SpringSecurity常见面试题汇总(超详细回答)

1.什么是Spring Security?核心功能?

Spring Security是一个基于Spring框架的安全框架,提供了完整的安全解决方案,包括认证、授权、攻击防护等功能。

其核心功能包括:

  1. 认证:提供了多种认证方式,如表单认证、HTTP Basic认证、OAuth2认证等,可以与多种身份验证机制集成。

  1. 授权:提供了多种授权方式,如角色授权、基于表达式的授权等,可以对应用程序中的不同资源进行授权。

  1. 攻击防护:提供了多种防护机制,如跨站点请求伪造(CSRF)防护、注入攻击防护等。

  1. 会话管理:提供了会话管理机制,如令牌管理、并发控制等。

  1. 监视与管理:提供了监视与管理机制,如访问日志记录、审计等。

Spring Security通过配置安全规则和过滤器链来实现以上功能,可以轻松地为Spring应用程序提供安全性和保护机制。

2.Spring Security的原理?

Spring Security是一个基于Spring框架的安全性认证和授权框架,它提供了全面的安全性解决方案,可以保护Web应用程序中的所有关键部分。

Spring Security的核心原理是拦截器(Filter)。Spring Security会在Web应用程序的过滤器链中添加一组自定义的过滤器,这些过滤器可以实现身份验证和授权功能。当用户请求资源时,Spring Security会拦截请求,并使用配置的身份验证机制来验证用户身份。如果身份验证成功,Spring Security会授权用户访问所请求的资源。

Spring Security的具体工作原理如下:

1.用户请求Web应用程序的受保护资源。

2.Spring Security拦截请求,并尝试获取用户的身份验证信息。

3.如果用户没有经过身份验证,Spring Security将向用户显示一个登录页面,并要求用户提供有效的凭据(用户名和密码)。

4.一旦用户提供了有效的凭据,Spring Security将验证这些凭据,并创建一个已认证的安全上下文(SecurityContext)对象。

5.安全上下文对象包含已认证的用户信息,包括用户名、角色和授权信息。

6.在接下来的请求中,Spring Security将使用已经认证的安全上下文对象来判断用户是否有权访问受保护的资源。

7.如果用户有权访问资源,Spring Security将允许用户访问资源,否则将返回一个错误信息。

3.有哪些控制请求访问权限的方法?

在Spring Security中,可以使用以下方法来控制请求访问权限:

  1. permitAll():允许所有用户访问该请求,不需要进行任何身份验证。

  1. denyAll():拒绝所有用户访问该请求。

  1. anonymous():允许匿名用户访问该请求。

  1. authenticated():要求用户进行身份验证,但是不要求用户具有任何特定的角色。

  1. hasRole(String role):要求用户具有特定的角色才能访问该请求。

  1. hasAnyRole(String... roles):要求用户具有多个角色中的至少一个角色才能访问该请求。

  1. hasAuthority(String authority):要求用户具有特定的权限才能访问该请求。

  1. hasAnyAuthority(String... authorities):要求用户具有多个权限中的至少一个权限才能访问该请求。

可以将这些方法应用于Spring Security的配置类或者在Spring Security注解中使用。

4.hasRole 和 hasAuthority 有区别吗?

在Spring Security中,hasRole和hasAuthority都可以用来控制用户的访问权限,但它们有一些细微的差别。

hasRole方法是基于角色进行访问控制的。它检查用户是否有指定的角色,并且这些角色以"ROLE_"前缀作为前缀(例如"ROLE_ADMIN")。

hasAuthority方法是基于权限进行访问控制的。它检查用户是否有指定的权限,并且这些权限没有前缀。

因此,使用hasRole方法需要在用户的角色名称前添加"ROLE_"前缀,而使用hasAuthority方法不需要这样做。

例如,假设用户有一个角色为"ADMIN"和一个权限为"VIEW_REPORTS",可以使用以下方式控制用户对页面的访问权限:

.antMatchers("/admin/**").hasRole("ADMIN").antMatchers("/reports/**").hasAuthority("VIEW_REPORTS")

在这个例子中,只有具有"ROLE_ADMIN"角色的用户才能访问/admin/路径下的页面,而具有"VIEW_REPORTS"权限的用户才能访问/reports/路径下的页面。

5.如何对密码进行加密?

在 Spring Security 中对密码进行加密通常使用的是密码编码器(PasswordEncoder)。PasswordEncoder 的作用是将明文密码加密成密文密码,以便于存储和校验。Spring Security 提供了多种常见的密码编码器,例如 BCryptPasswordEncoder、SCryptPasswordEncoder、StandardPasswordEncoder 等。

以 BCryptPasswordEncoder 为例,使用步骤如下:

1.在 pom.xml 文件中添加 BCryptPasswordEncoder 的依赖:

    org.springframework.security    spring-security-crypto    5.6.1

2.在 Spring 配置文件中注入 BCryptPasswordEncoder:

@Configurationpublic class SecurityConfig extends WebSecurityConfigurerAdapter {        @Bean    public PasswordEncoder passwordEncoder() {        return new BCryptPasswordEncoder();    }        // ...}

3.在使用密码的地方调用 passwordEncoder.encode() 方法对密码进行加密,例如注册时对密码进行加密:

@Servicepublic class UserServiceImpl implements UserService {    @Autowired    private PasswordEncoder passwordEncoder;    @Override    public User register(User user) {        String encodedPassword = passwordEncoder.encode(user.getPassword());        user.setPassword(encodedPassword);        // ...        return user;    }    // ...}

以上就是使用 BCryptPasswordEncoder 对密码进行加密的步骤。使用其他密码编码器的步骤类似,只需将 BCryptPasswordEncoder 替换为相应的密码编码器即可。

6.Spring Security基于用户名和密码的认证模式流程?

请求的用户名密码可以通过表单登录,基础认证,数字认证三种方式从HttpServletRequest中获得,用于认证的数据源策略有内存,数据库,ldap,自定义等。

拦截未授权的请求,重定向到登录页面的过程:

  1. 当用户访问需要授权的资源时,Spring Security会检查用户是否已经认证(即是否已登录),如果没有登录则会重定向到登录页面。

  1. 重定向到登录页面时,用户需要输入用户名和密码进行认证。

表单登录的过程:

  1. 用户在登录页面输入用户名和密码,提交表单。

  1. Spring Security的UsernamePasswordAuthenticationFilter拦截表单提交的请求,并将用户名和密码封装成一个Authentication对象。

  1. AuthenticationManager接收到Authentication对象后,会根据用户名和密码查询用户信息,并将用户信息封装成一个UserDetails对象。

  1. 如果查询到用户信息,则将UserDetails对象封装成一个已认证的Authentication对象并返回,如果查询不到用户信息,则抛出相应的异常。

  1. 认证成功后,用户会被重定向到之前访问的资源。如果之前访问的资源需要特定的角色或权限才能访问,则还需要进行授权的过程。

Spring Security的认证流程大致可以分为两个过程,首先是用户登录认证的过程,然后是用户访问受保护资源时的授权过程。在认证过程中,用户需要提供用户名和密码,Spring Security通过UsernamePasswordAuthenticationFilter将用户名和密码封装成Authentication对象,并交由AuthenticationManager进行认证。如果认证成功,则认证结果会存储在SecurityContextHolder中。在授权过程中,Spring Security会检查用户是否有访问受保护资源的权限,如果没有则会重定向到登录页面进行认证。

拦截未授权的请求,重定向到登录页面

表单登录的过程,进行账号密码认证

来源地址:https://blog.csdn.net/qq_33129875/article/details/129286417

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

SpringSecurity常见面试题汇总(超详细回答)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

vue3升级常见问题详细汇总

随着vue3 的发布和越来越多项目的使用,之前使用 vue2 的项目也不能拉下,vue2 升级 vue3 迫在眉睫,下面这篇文章主要给大家介绍了关于vue3升级常见问题的相关资料,需要的朋友可以参考下
2023-03-07

JavaScript异步编程常见面试题汇总

本文将带大家学习异步编程这一块内容,鉴于异步编程是js中至关重要的内容,所以我们将学习异步编程涉及到的重点和难点,同时这一块内容也是面试常考范围,希望对大家有所帮助
2023-02-08

2019年JAVA最常见面试题汇总(收藏)

java基础以及多个“比较”1.Collections.sort排序内部原理在Java 6中Arrays.sort()和Collections.sort()使用的是MergeSort,而在Java 7中,内部实现换成了TimSort,其对对象间比较的实现要求更
2019年JAVA最常见面试题汇总(收藏)
2020-11-20

常见的前端开发:Javascript 面试题及回答策略

不管你是面试官还是求职者,里面的思路都能让你获益匪浅。单体应用和微服务架构之间有哪些主要区别,从灵活性和可扩展性的角度来看,哪个是更好选择?解析:这个问题用来评估基础编码知识。答案可以有多种,所以应该注意倾听具体的问题,并尽量全面回答,来展
2023-06-03

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录