Spring Security面试题

网络上的任何东西,如Web应用程序,都暴露在互联网的开放世界中,它们容易受到安全威胁。只有授权人员才能访问网页、文件和其他保密资源。通常有几个安全层,例如防火墙,代理服务器,JVM安全性等,但是,如果要控制访问,则还应应用应用程序级安全性。因此,Spring Security是Spring Framework的一部分,它提供了一种将安全层应用于Java应用程序的方法。

什么是 Spring Security?

 Spring Security本质上只是一堆 servlet 过滤器,它们使 Java 应用程序能够包含身份验证和授权功能。它是功能最强大且高度可定制的访问控制框架(安全框架)之一,可为基于 Java EE(企业版)的企业应用程序提供身份验证、授权和其他安全功能。Spring 安全的真正力量在于它能够扩展以满足自定义需求。它的主要职责是对访问任何资源的传入请求进行身份验证和授权,包括 rest API 端点、MVC(模型-视图-控制器)URL、静态资源等。

Spring Security面试题

面试题1. Spring Security的基本功能是什么?

Spring Security的一些基本功能包括:

  • 支持灵活、全面的身份验证和授权。
  • 检测和预防攻击,包括会话固定、点击劫持、跨站点请求伪造等。
  • 与 Servlet API 集成。
  • 提供与Spring Web MVC(模型-视图-控制器)的可选集成。
  • Java 认证和授权服务 (JAAS) 用于认证目的。
  • 允许单点登录,以便用户只需一个帐户(用户名和密码)即可访问多个应用程序。

面试题2. 什么是 Spring Security认证和授权?

  • 认证: 这是指使用访问某些受限资源时提供的凭据验证用户身份的过程。对用户进行身份验证涉及两个步骤,即识别和验证。例如,使用用户名和密码登录网站。这就像回答问题你是谁?
  • 授权: 它是确定用户执行操作或查看数据的权限的能力,假设他们已成功登录。这可确保用户只能访问他们有权访问的资源部分。它可以被认为是对用户可以做/读这个的问题的回答?

面试题3. 基本身份验证是什么意思?

RESTful Web 服务可以通过多种方式进行身份验证,但最基本的一种是基本身份验证。对于基本身份验证,我们使用 HTTP [授权] 标头发送用户名和密码,以使我们能够访问资源。用户名和密码在基本身份验证中使用 base64 编码(非加密)进行编码。编码不安全,因为它可以很容易地解码。

语法: 

Value = username:password  
Encoded Value = base64(Value)  
Authorization Value = Basic <Encoded Value>  
//Example: Authorization: Basic VGVzdFVzZXI6dGVzdDEyMw==  
//Decode it'll give back the original username:password UserName:user123 

面试题4. 摘要式身份验证是什么意思?

可以通过多种方式对 RESTful Web 服务进行身份验证,但高级身份验证方法包括摘要式身份验证。它将哈希函数应用于用户名、密码、HTTP 方法和 URI,以便以加密形式发送凭据。它通过使用不容易解码的哈希技术生成更复杂的加密结果。

语法: 

Hash1=MD5(username:realm:password)  
Hash2=MD5(method:digestURI)  
response=MD5(Hash1:nonce:nonceCount:cnonce:qop:Hash2)  
//Example, this got generated by running this example  
Authorization: Digest username="TestAdmin", realm="admin-digest-realm", nonce="MTYwMDEwMTUyMDM4OToxM2M1Y2I4MGFjMjk4OGI1ODQzZjc3NDUzOGFlMjZjYw==", uri="/admin/hello?name=User", response="2f080edbec53be2bdf3853d477e4a543", qop=auth, nc=00000002, cnonce="11ecd9bf947dbcf4" 

面试题5. Spring Security中的会话管理是什么意思?

就安全性而言,会话管理涉及根据多个用户的请求保护和管理多个用户的会话。它有助于用户和服务/应用程序之间的安全交互,并涉及与特定用户关联的一系列请求和响应。会话管理是 Spring 安全性最关键的方面之一,因为如果会话管理不当,数据的安全性将受到影响。为了控制HTTP会话,Spring 安全性使用以下选项:

  • 会话管理筛选器。
  • 会话身份验证策略

有了这两个,spring-security可以管理以下安全会话选项:

  • 会话超时(在网站结束会话之前,用户可以在网站上保持非活动状态的时间量。
  • 并发会话(经过身份验证的用户一次可以打开的会话数)。
  • 会话固定(允许攻击者劫持有效用户会话的攻击)。

面试题6. 在 Spring Security中解释安全上下文和安全上下文持有者。

Spring Security 有两个基本类:SecurityContext 和 SecurityContextHolder。

  • 安全上下文:在此,将存储有关当前经过身份验证的用户(也称为主体)的信息/数据。因此,为了获取用户名或有关用户的任何其他信息,您必须首先获取安全上下文。
  • SecurityContextHolder: 通过对 SecurityContextHolder 的静态调用检索当前经过身份验证的主体最简单。作为帮助程序类,它提供对安全上下文的访问。默认情况下,它使用 ThreadLocal 对象来存储 SecurityContext,因此 SecurityContext 始终可供同一执行线程中的方法访问,即使 SecurityContext 未传递也是如此。

面试题7. 解释Spring Security OAuth2.

一个简单的授权框架 OAuth 2.0 允许客户端应用程序通过授权服务器访问受保护的资源。使用它,客户端应用程序(第三方)可以代表资源所有者或代表自己获得对 HTTP 服务的有限访问权限。

在 OAuth2 中,有四个角色可用,如下所示:

  • 资源所有者/用户: 资源的所有者,即拥有该资源权利的个人。
  • 客户: 应用程序请求访问令牌(表示用户对客户端访问其数据/资源的权限),然后在收到访问令牌后访问受保护的资源服务器。
  • 授权服务器: 成功对资源所有者进行身份验证并获取授权后,服务器会向客户端颁发访问令牌。
  • 资源服务器: 它提供对请求资源的访问。最初,它验证访问令牌,然后提供授权。

面试题8. OAuth2授权代码授权类型是什么意思?

OAuth 2.0 中的术语“授权类型”是指应用程序获取访问令牌的方式。授权代码流是 OAuth 2.0 定义的几种授权类型之一。Web 应用程序和本机应用程序都使用此授权在用户授权应用程序后获取访问令牌。与大多数其他授权类型相反,它要求应用程序首先启动浏览器以开始流程/流。该过程涉及以下步骤:

  • 应用程序打开一个浏览器,将用户定向到 OAuth 服务器。
  • 看到授权提示后,用户将批准应用程序的请求。
  • 批准后,用户将重定向回应用程序,并在查询字符串中使用授权代码。
  • 访问令牌的应用程序交换授权代码。

面试题9. 什么是方法Security,为什么需要它?

简单地说,Spring 方法安全性允许我们在方法级别添加或支持授权。除了身份验证之外,Spring 安全性还会检查登录用户的授权。登录后,用户的 ROLE 用于确定哪个用户有权访问资源。在WebSecurityConfig中创建新用户时,我们也可以指定他的ROLE。应用于方法的安全措施可防止未经授权的用户,并且仅允许真实的用户。方法级安全性的目的不是方便具有访问权限的用户,而是防止未经授权的用户执行超出其特权和角色的活动。方法级安全性是使用 AOP(面向方面的编程)实现的。

面试题10. Spring Security中的哈希是什么意思?

数据库在存储密码时经常会遇到安全问题。纯文本密码不能存储在您的数据库中,因为这样任何有权访问数据库的人都会知道每个用户的密码。此问题的解决方案是将加密密码存储在数据库中。这称为密码哈希。

作为一般安全概念的一部分,哈希涉及根据所使用的哈希算法对字符串进行编码。MD4,MD5,SHA(安全哈希算法)如SHA256 SHA128等,是一些可以应用的哈希算法。哈希方法应将密码作为输入并返回哈希字符串,该字符串应存储在数据库中,而不是纯文本中。

面试题11. 解释加盐及其用法。

Spring Security从版本 3.1 开始自动应用加盐。加盐是在密码散列之前将随机数据与密码相结合的过程。Salt 在不增加用户要求的情况下,通过增加其唯一性和复杂性来改进哈希,从而减少密码攻击。然后,散列密码与盐一起存储在数据库中。通过使用加盐,您的应用程序将受到保护,免受字典攻击。使用Salt,您可以在密码中添加一个额外的字符串,以使黑客更难破解它。

面试题12. 什么是密码编码器?

密码编码由Spring Security使用PasswordEncoder接口提供。此接口定义两种方法:

  • encode():它将纯密码转换为编码形式。
  • matches(): 它将数据库中的编码密码与使用与编码密码相同的加盐和哈希算法进行编码的纯密码(由用户输入)进行比较。

面试题13. 解释 Spring Security中的抽象安全拦截器?

在Spring Security中,AbstractSecurityInterceptor处理传入请求的初始授权。AbstractSecurityInterceptor 有两个具体的实现:

  • 过滤器安全拦截器:它将授权所有经过身份验证的用户请求。
  • 方法安全拦截器:这对于实现方法级安全性至关重要。它允许我们在方法级别保护我们的程序。

面试题14. Security问题是否是一个贯穿各领域的问题?

Spring安全确实是一个贯穿各领域的问题。Spring Security也在内部使用Spring AOP(面向方面编程)。横切关注点是适用于整个应用程序并影响所有应用程序的问题。下面是与企业应用程序相关的一些跨领域问题。

  • 日志记录和跟踪
  • 事务管理
  • 安全
  • 缓存
  • 错误处理
  • 性能监控
  • 自定义业务规则

面试题15. 什么是 SpEL(Spring 表达式语言)?

Spring Framework 3.0 引入了 Expression Language/SpEL。在 Spring 表达式语言 (SpEL) 中,可以在运行时查询和操作对象图。您可以将其与XML和基于注释的Spring配置一起使用。JSP EL、OGNL、MVEL 和 JBoss EL 是一些可用的表达式语言,但 SpEL 提供了额外的功能,包括字符串模板功能和方法调用。

例: 

import org.springframework.expression.Expression;    
import org.springframework.expression.ExpressionParser;    
import org.springframework.expression.spel.standard.SpelExpressionParser;      
public class WelcomeTest   
{    
    public static void main(String[] args)   
    {    
        ExpressionParser parser = new SpelExpressionParser();    
        Expression exp = parser.parseExpression("'WELCOMEtoSPEL'");    
        String message = (String) exp.getValue();    
        System.out.println(message);    
        //OR    
       //System.out.println(parser.parseExpression("'Hello SPEL'").getValue());    
   }    
}    

输出: 

WELCOMEtoSPEL 

面试题16. SpEL 的Security注释。

允许使用 SpEL 的一些安全注释包括:

  • @PreAuthorize
  • @PreFilter
  • @PostAuthorize
  • @PostFilter

它们提供基于表达式的访问控制。在 Spring Security 中,@PreAuthorize 是允许您使用 SpEL 的最强大的注释之一。但是旧的@Secured注释不能使用它,例如你不能写@Secured(“hasRole('ROLEADMIN')”),但你可以写@PreAuthorize(“hasRole('ROLEADMIN')”)。

面试题17. 解释什么是 Spring Security中的身份验证管理器。

一个名为AuthenticationManager的Spring Security组件告诉“身份验证将如何发生”。由于此问题的“如何”部分取决于我们用于应用程序的身份验证提供程序,因此 AuthenticationManager 包含对所有 AuthenticationProvider 的引用。AuthenticationManager 是用于身份验证的策略接口,它只有一种方法:

public interface AuthenticationManager  { 
    Authentication authenticate(Authentication authentication) 
    throws AuthenticationException; 
} 

AuthenticationManagers 可以在其 authenticate() 方法中执行以下三个操作之一:

  • 如果它可以验证输入是否表示有效的主体,它将返回身份验证(通常经过身份验证=true)。
  • 如果认为输入表示无效的主体,它将引发身份验证异常。
  • 如果无法决定,它将返回 null。

面试题18. 解释什么是 Spring Security中的提供程序管理器。

AuthenticationManager 的默认实现是 ProviderManager。它不处理身份验证请求本身,而是将身份验证过程委托给已配置的身份验证提供程序列表。依次查询每个身份验证提供程序,以查看它是否可以处理身份验证请求。

面试题19. 什么是JWT?

JWT(JSON Web Tokens)是服务器在 Web 应用程序中进行用户身份验证后生成的令牌,然后发送到客户端(通常是浏览器)。因此,这些令牌在每个 HTTP 请求时发送,允许服务器验证或验证用户的身份。此方法用于授权客户端和服务器之间的事务或请求。使用 JWT 并不打算隐藏数据,而是确保其真实性。JWT 经过签名和编码,而不是加密。加密算法用于对 JWT 进行数字签名,以确保它们在颁发后无法更改。令牌中包含的信息由服务器的私钥签名,以确保完整性。

  • 登录凭据由用户发送。成功后,JWT 令牌(由私钥/密钥签名)由服务器发送回客户端。
  • 客户端采用 JWT 并将其插入授权标头中,以便为用户发出数据请求。
  • 从客户端收到令牌后,服务器只需将客户端发送的签名与其私钥/密钥生成的签名进行比较。签名匹配后,令牌将有效。

JSON Web 令牌由三个部分组成,由点 (.) 分隔。前两个(标头和有效负载)包含 Base64-URL 编码的 JSON,而第三个是加密签名。

例如:

eyJhbGciOfefeiI1NiJ9.eyJuYW1lIjdgdfeENvZGVyIn0.5dlp7GmziL2dfecegse4mtaqv0_xX4oFUuTDh14KuF

看看每个部分:

eyJhbGciOfefeiI1NiJ9   #header
eyJuYW1lIjdgdfeENvZGVyIn0   #payload
5dlp7GmziL2dfecegse4mtaqv0_xX4oFUuTDh14KuF   #signature

面试题20. 什么是Spring Security过滤器链?

Spring 安全性使用过滤器链执行其大部分安全功能。Spring 安全性是通过 Web 应用程序中的 servlet 过滤器驱动的。servlet 过滤器在请求到达受保护资源(例如,Spring 控制器)之前拦截请求。因此,对受保护资源的每个请求都将通过 Spring 安全过滤器链进行处理,以完成身份验证和授权目的。

面试题21. 解释Security过滤器链的工作原理。

以下是筛选器在 Web 应用程序中的工作方式:

  • 第 1 步:客户端首先发送资源(MVC 控制器)的请求。应用程序容器创建用于处理传入请求的筛选器链。
  • 第 2 步:每个 HttpServletRequest 都通过过滤器链,具体取决于请求 URI。(我们可以配置过滤器链是应用于所有请求还是应用于特定请求 URI)。
  • 第 3 步:对于大多数 Web 应用程序,筛选器执行以下功能:
    • 在 HttpServletRequest/HttpServletResponse 到达 Spring MVC 控制器之前对其进行修改或更改。
    • 可以停止对请求的处理并向客户端发送响应,例如 Servlet 不允许向特定 URI 发送请求。

面试题22. Spring Security的预定义过滤器。

Spring 安全性中的过滤器链非常复杂和灵活。他们使用UserDetailsService和AuthenticationManager等服务来完成他们的任务。考虑他们的订单也很重要,因为您可能需要在授权之前验证它们的真实性。下面按出现的顺序列出了 Spring 过滤器链中的一些重要安全过滤器:

  • SecurityContextPersistenceFilter:在 HTTP 请求之间存储 SecurityContext 内容。它还会在请求完成时清除 SecurityContextHolder。
  • ConcurrentSessionFilter: 它负责处理并发会话。其目的是刷新请求会话的上次修改时间,并确保会话未过期。
  • UsernamePasswordAuthenticationFilter:它是最受欢迎的身份验证筛选器,也是最常自定义的筛选器。
  • ExceptionTranslationFilte: 此筛选器位于安全筛选器堆栈中的筛选器安全拦截器上方。尽管它不执行实际的安全实施,但它会处理安全拦截器引发的异常,并返回有效且合适的 HTTP 响应。
  • FilterSecurityInterceptor: 它负责保护 HTTP 资源 (Web URI),并在访问被拒绝时引发或引发身份验证和授权异常。

面试题23. Spring Security中的委托人是什么意思?

主体实际上是当前正在使用该应用程序的登录用户。有关主体(当前经过身份验证的用户)的信息/数据存储在应用程序的安全上下文中。作为帮助程序类,SecurityContextHolder 提供对安全上下文的访问。默认情况下,它使用 ThreadLocal 对象来存储 SecurityContext,因此同一执行线程中的方法始终可以访问 SecurityContext,即使 SecurityContext 未显式传递也是如此。

面试题24. 你能解释一下什么是Spring Security中的委派过滤器代理吗?

必须在 web.xml 文件中声明 servlet 过滤器,以便在将请求传递给实际的 Servlet 类之前可以调用它。DelegatingFilterProxy 是一个嵌入在 spring 上下文中的 servlet 过滤器。它充当Web.xml(Web应用程序)和应用程序上下文(Spring IoC容器)之间的桥梁。DemissionatingFilterProxy 是一个代理,它将传入请求委托给 Spring Web 框架提供的一组过滤器(这些过滤器不作为 Spring Bean 进行管理)。它提供了对 Spring 上下文的生命周期机制和依赖注入的完全访问。

每当请求到达 Web 应用程序时,代理都会确保将请求委托给 Spring 安全性,如果一切顺利,它将确保将请求定向到 Web 应用程序中的正确资源。以下示例演示如何在 web.xml 中配置委派代理筛选器:

 <?xml version="1.0" encoding="UTF-8"?> 
<web-app> 
    <filter> 
        <filter-name>springSecurityFilterChain</filter-name>

         <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 

    </filter> 
  
    <filter-mapping> 
        <filter-name>springSecurityFilterChain</filter-name> 
        <url-pattern>/*</url-pattern> 
    </filter-mapping> 
</web-app> 

面试题25. 你能解释一下什么是Spring Security中的过滤器链代理吗?

FilterChainProxy 是另一个 servlet 过滤器,旨在根据传入请求的路径调用相应的过滤器。它包含有关构成安全筛选器链的安全筛选器的信息。它不直接执行,但由 DelegatingFilterProxy 启动。

面试题26. 什么是intercept-url模式,为什么我们需要它?

<intercept-url> 用于在 Spring 安全性应用程序中配置授权或访问控制。它用于限制对特定 URL 的访问。大多数使用Spring Security的Web应用程序通常只有几个拦截URL,因为它们的安全需求要少得多。

例: 使用拦截 URL 的基本 Spring Security

<http realm="Example" use-expressions="false">  
   <intercept-url pattern="/index.jsp" access="IS_AUTHENTICATED_ANONYMOUSLY"/>     
   <intercept-url pattern="/login.jsp*" access="IS_AUTHENTICATED_ANONYMOUSLY"/>  
   <intercept-url pattern="/admin/*" access="ROLE_ADMIN"/>  
   <intercept-url pattern="/trade/*" access="ROLE_TRADER"/>     
   <intercept-url pattern="/**" access="ROLE_USER,ROLE_ADMIN,ROLE_TRADER"/>     
<http-basic/>  

在这种情况下,无需身份验证即可访问索引.jsp和 admin.jsp。URL 中具有管理员的任何内容都需要ROLE_ADMIN访问权限,而 URL 中具有交易的任何内容都需要ROLE_TRADER访问权限。

面试题27. 顺序在拦截 URL模式中重要吗?如果是,那么我们应该按什么顺序写?

是的,当我们有多个拦截 URL 模式时,排序至关重要。多个拦截 URL 应从更具体到不太具体。由于拦截 URL 模式按照它们在 Spring 安全配置文件中出现的顺序进行处理,因此 URL 必须与正确的模式匹配。

面试题28. 说明 Spring 拦截 url 配置中ROLE_USER和ROLE_ANONYMOUS之间的区别。

  • ROLE_USER:除非在用户通过身份验证后立即将其分配给用户,否则它没有相关性。您负责为每个经过身份验证的用户加载角色(权限)。
  • ROLE_ANONYMOUS:当配置使用 Spring 安全性的“匿名身份验证”过滤器时,ROLE_ANONYMOUS是分配给匿名(未经身份验证)用户的默认角色。默认情况下,ROLE_ANONYMOUS处于启用状态。但是,如果您改用表达式 isAnonymous() 会更好,它具有相同的含义。

面试题29. 说明 Spring 安全性中@PreAuthorize和@Secured之间的区别。

Spring Framework 提供了多种安全选项。此框架提供了许多有用的工具或方法来保护应用程序。为了提供方法级安全性,@Secured和@PreAuthorize是最常用的注释。与@Secured相比,@PreAuthorize是相当新的,但很快就会广为人知。@Secured和@PreAuthorize之间没有太多区别;它们几乎相同。然而,@PreAuthorize比@Secured强大得多。

@PreAuthorize@Secured
我们可以在使用@PreAuthorize时访问SecurityExpressionRoot的方法和属性。在使用 @Secured 时,我们无法访问 SecurityExpressionRoot 的方法和属性。
它可以与Spring EL一起使用。它不能与Spring EL一起使用。

它支持与 AND 运算符结合使用的多个角色。

例如:

@PreAuthorize("hasRole('ROLE_role1') and hasRole('ROLE_role2')") 

它不支持与 AND 运算符结合使用的多个角色。如果定义了多个角色,则将使用 OR 运算符组合/处理它们。

例如:

@Secured({"ROLE_role1", "ROLE_role2"})          // is treated as an OR 

将以下行添加到 spring-security.xml 和 spring boot,以在代码中启用@PreAuthorize和@PostAuthorize注释:

XML: 
<global-method-security pre-post-annotations="enabled"/> 
Spring boot: 
@EnableGlobalMethodSecurity(prePostEnabled = true)

将以下行添加到 spring-security.xml 和 spring boot 以在代码中启用@Secured注释。

XML: 
<global-method-security secured-annotations="enabled" /> 
Spring boot: 
@EnableGlobalMethodSecurity(securedEnabled=true) 

面试题30. 说明@Secured和@RolesAllowed之间的区别。

@RolesAllowed:它是一个Java标准注解(JSR250)(即,不仅仅是Spring安全性)。由于此批注仅支持基于角色的安全性,因此它比@PreAuthorize批注更受限制。要在代码中启用@RolwesAllowed注释,请将以下行添加到 spring-security.xml 和 spring boot。

XML: <global-method-security jsr250-annotations="enabled"/> 
Spring boot: @EnableGlobalMethodSecurity(jsr250Enabled = true) 

@Secured:它是 Spring 特定的注释。它不仅仅是基于角色的安全性。它保护由 bean(其生命周期由 Spring IoC 管理的对象)实现的方法。但是,不支持使用 Spring 表达式语言 (SpEL) 来定义安全约束。要在代码中启用@Secured注释,请将以下行添加到 spring-security.xml 和 spring boot。

XML: global-method-security secured-annotations="enabled"/> 
Spring boot: @EnableGlobalMethodSecurity(securedEnabled=true) 

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值