弹簧安全的支柱:复杂情况下的预授权组件。
#安全 #java #spring #体系结构

怀旧回顾了计算机科学的丰富历史之后,是时候跳入更具技术性的话题了。

在Java生态系统内的广泛应用程序安全领域中,Spring Security通过提供可保护基于春季的应用程序的强大和适应性解决方案来为自己雕刻一个名称。尽管批评了冗长和偶尔对官方支持不足的看法,但该框架的可定制性却被庆祝。它为广泛的共同安全问题提供了现成的解决方案,以及处理更复杂的工具,有时甚至是看似不可行的利基场景。

在系统安全领域中,某些主题更加细微和专业,需要更微妙的理解和方法。定认证就是一个这样的主题 - 一种独特的身份验证方案,尽管很少见,但在某些应用程序上下文中可能至关重要。在每日场景中,它似乎令人生畏或不经常遇到,但请放心,Spring Security具有解决方案。

在本文中,我们的目标是通过将其分解为基本组件,并展示如何有效利用Spring Security的组件来处理这个具有挑战性的话题。

预身份验证的景观

在典型的应用程序中,在内部处理身份验证,通常涉及例如用户表单或OAuth代币。但是,在某些设置和配置中,应用程序可以依靠外部系统进行身份验证。

这些外部系统验证用户的身份,然后将身份验证详细信息(通常是用户标识符)传递给应用程序。这种传入的用户标识符经常以请求标头或cookie的形式支持,表明该用户已经在外部组件或系统上进行了认证。

听起来像这种情况一样罕见,在更具样式的情况下,它在架构中非常普遍,在架构中,中央安全组件并受到保护,对用户进行身份验证,然后将请求转发到应用程序,通常在基于微服务的设计或公司环境中。

Spring Security为这些预验证的方案提供了强有力的支持,从而为开发人员和工程师提供了将此工作流程无缝集成到其应用程序的安全体系结构中的工具。在下一段中,我们将深入研究Spring Security如何处理预验证,强调其多功能性及其在满足一般和特定安全需求时的功能。

创建您的定认证课程

为了管理预授权,我们应该向抽象proceationedProcessingFilter 提醒。尽管名称有些令人生畏,但此类旨在处理外部组件已经进行预验证的请求。这里的重要任务是通过我们的实现扩展AbstractPreatuteCatiCatedProcessingFilter来创建自定义过滤器。

这是一个例子:

import javax.servlet.http.HttpServletRequest;
import org.springframework.security.web.authentication.preauth.AbstractPreAuthenticatedProcessingFilter;

public class HeaderPreAuthenticatedProcessingFilter extends AbstractPreAuthenticatedProcessingFilter {

    @Override
    protected Object getPreAuthenticatedPrincipal(HttpServletRequest request) {
        return request.getHeader("PreAuthenticatedHeader");
    }

    @Override
    protected Object getPreAuthenticatedCredentials(HttpServletRequest request) {
        return "Not handled here";
    }
}

在此自定义过滤器中,对于直接情况,我们从HTTP请求标头中提取预先认可的原理。在更复杂的情况下,我们可能需要调用另一个服务以进行其他检查,执行一些安全控件,遵守我们的安全协议等等。可能性是无数的。

getPreatuthenticatiCatedCredentials()方法不使用,因为身份验证是外部进行的。

实施身份验证的动作

接下来,我们需要提供一个身份验证实现,过滤器将用于检索主体信息。

揭露了这一点后,我们准备创建一个以前创建的验证验证方案的authenticationManager的实现,我们是从请求中获取原理的:

import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import javax.servlet.http.HttpServletRequest;

public class HeaderAuthenticator implements AuthenticationManager {

    @Override
    public Authentication authenticate(HttpServletRequest request) {
        String principal = request.getHeader("PreAuthenticatedHeader");
        if (principal != null) {
            return new UsernamePasswordAuthenticationToken(principal, null);
        }
        throw new AuthenticationServiceException("PreAuthenticatedHeader not found in the request");
    }
}

在此实施中,Authenticate()方法从请求的 prapationalenticatedheader 标题中获取校长,并使用username passpasswordauthentication class返回身份验证对象,此类用于在身份验证中保留用户在身份验证期间的信息。过程。

在 对象尚未完全验证。我们仅将委托人设置为参数(已经过认证的主题),并将凭据留为null,因为实际身份验证是外部完成的。

这个演示很小。在完整的实施中,您通常会添加其他检查,例如确保标头不空,也许是其他特定于应用程序的验证。如果身份验证出于任何原因失败,您通常会抛出身份验证异常,或致电其他外部处理程序执行其他计算,等等...