📜  Sling 身份验证处理程序示例 - Java (1)

📅  最后修改于: 2023-12-03 15:05:13.640000             🧑  作者: Mango

Sling 身份验证处理程序示例 - Java

本示例演示了如何使用Sling身份验证处理程序对用户进行身份验证和授权,并保护Sling内的资源。

环境需求

本示例的运行需要以下环境:

基本概念

在Sling中,身份验证处理程序是负责处理Sling身份验证的组件。它们允许您使用不同的身份验证机制进行身份验证,并在Sling中提供保护和授权。Sling身份验证处理程序有两种类型:

  • 认证处理程序:用于验证用户的身份
  • 授权处理程序:用于授权用户访问资源
示例说明

本示例将演示如何创建一个基本的Sling身份验证处理程序。该处理程序将对用户进行身份验证,并保护一个受保护的Sling资源。

步骤1:创建一个Sling身份验证处理程序

首先,我们需要创建一个新的Sling身份验证处理程序。要创建Sling身份验证处理程序,请按照以下步骤操作:

  1. 创建一个新的Maven项目
  2. 在项目的pom.xml文件中添加以下依赖项:
<dependency>
    <groupId>org.apache.sling</groupId>
    <artifactId>org.apache.sling.auth.core</artifactId>
    <version>1.5.6</version>
</dependency>
  1. 创建一个Java类,该类将实现Sling身份验证处理程序。该类应该扩展AbstractAuthenticationHandler,并实现AuthenticationHandler接口。
package com.example.slingauth;

import org.apache.sling.auth.core.AbstractAuthenticationHandler;
import org.apache.sling.auth.core.AuthenticationHandler;
import org.apache.sling.auth.core.spi.AuthenticationInfo;
import org.apache.sling.auth.core.spi.AuthenticationInfo.AuthenticationBuilder;
import org.osgi.service.component.annotations.Component;

import javax.jcr.Credentials;
import javax.jcr.SimpleCredentials;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component(
    property = {
        "service.description=Sling Authentication Handler sample",
        "service.vendor=The Apache Software Foundation",
        AuthenticationHandler.PATH_PROPERTY + "=/content",
        AuthenticationHandler.TYPE_PROPERTY + "=test-auth",
    },
    service = AuthenticationHandler.class
)
public class TestAuthenticationHandler extends AbstractAuthenticationHandler {

    private static final String USERNAME = "admin";
    private static final String PASSWORD = "admin";

    @Override
    public AuthenticationInfo extractCredentials(HttpServletRequest request, HttpServletResponse response) {
        String authorization = request.getHeader("Authorization");
        if (authorization == null) {
            return null;
        }
        Credentials credentials = extractCredentials(authorization);
        if (credentials == null) {
            response.setHeader("WWW-Authenticate", "Basic realm=\"Sling Authentication\"");
            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
            return AuthenticationInfo.FAIL_AUTH;
        }
        AuthenticationBuilder builder = new AuthenticationBuilder();
        builder.principal(USERNAME);
        builder.credentials(new SimpleCredentials(USERNAME, PASSWORD.toCharArray()));
        builder.attribute("my-attribute", "my-attribute-value");
        return builder.build();
    }

    @Override
    public boolean requestCredentials(HttpServletRequest request, HttpServletResponse response) {
        response.setHeader("WWW-Authenticate", "Basic realm=\"Sling Authentication\"");
        response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
        return true;
    }

    @Override
    protected void authenticationFailed(HttpServletRequest request, HttpServletResponse response, AuthenticationInfo authInfo) {
        response.setHeader("WWW-Authenticate", "Basic realm=\"Sling Authentication\"");
        response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
    }
}

这个处理程序简单地从HTTP头中提取凭据,然后将其与预定义的用户名和密码进行比较。如果成功,则创建一个新的AuthenticationInfo实例并将其返回。AuthenticationInfo包含有关身份验证成功后的用户的信息,例如用户名、凭据和用户属性。

注意:此示例中使用的用户名和密码是硬编码的。在实际应用中,应将这些值存储在安全位置中,例如使用基于数据库或LDAP的用户存储。

步骤2:在Sling中注册身份验证处理程序

现在,我们已经创建了一个Sling身份验证处理程序,接下来需要将其注册到Sling中。

要注册身份验证处理程序,请按照以下步骤操作:

  1. 在项目的pom.xml文件中添加以下插件:
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.felix</groupId>
            <artifactId>maven-scr-plugin</artifactId>
            <version>1.20.0</version>
            <executions>
                <execution>
                    <id>generate-scr-scrdescriptor</id>
                    <goals>
                        <goal>scr</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

这个插件用于生成OSGi Service组件描述符(SCR描述符),以实现Sling身份验证处理程序的OSGi注册。

  1. 在TestAuthenticationHandler类中,使用@Component注解将处理程序标记为OSGi Service组件,并为其指定所需的属性:
@Component(
    property = {
        "service.description=Sling Authentication Handler sample",
        "service.vendor=The Apache Software Foundation",
        AuthenticationHandler.PATH_PROPERTY + "=/content",
        AuthenticationHandler.TYPE_PROPERTY + "=test-auth",
    },
    service = AuthenticationHandler.class
)

在这个示例中,我们使用“/content”作为受保护路径,并使用“test-auth”作为处理程序的类型。您可以根据需要更改这些值。

  1. 在项目的pom.xml文件中,添加Sling框架依赖项,以及TestAuthenticationHandler的Maven构件:
<dependencies>
    <dependency>
        <groupId>org.apache.sling</groupId>
        <artifactId>org.apache.sling.api</artifactId>
        <version>2.25.0</version>
    </dependency>
    <dependency>
        <groupId>com.example</groupId>
        <artifactId>slingauth</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
</dependencies>
  1. 在Sling的配置文件中,添加处理程序的OSGi配置。

为了使OSGi能够找到并加载TestAuthenticationHandler,我们需要将其作为OSGi配置添加到Sling框架中。要添加处理程序的OSGi配置,请按照以下步骤操作:

  • 在Sling中,打开任何文本编辑器,如vim或nano,创建一个名为“test-auth.cfg”的新文件,并将以下内容添加到该文件中:
# Test Authentication Handler configuration
/authentication.handler.test-auth.paths=/content
/authentication.handler.test-auth.type=test-auth
  • 将该文件保存到Sling的“/apps/test-auth/config”目录下(如果该目录不存在,请手动创建该目录)。

注意:该配置文件的名称和目录结构都是由TestAuthenticationHandler类中使用的@Component注释中的属性定义的。

步骤3:测试身份验证处理程序

现在,我们已经将Sling身份验证处理程序注册到Sling框架中。接下来,我们可以测试该处理程序并验证其是否正常工作。

  1. 启动Sling服务器

要测试身份验证处理程序,我们需要运行Sling服务器。要启动Sling服务器,请运行以下命令:

mvn clean install -PautoInstallPackage

这个命令将编译并打包代码,并将其安装到指定的Sling实例中。如果一切顺利,您应该能够在控制台中看到类似以下的输出:

...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] SlingAuth .......................................... SUCCESS [  0.339 s]
[INFO] SlingAuth - Bundling the bundle .................... SUCCESS [  6.035 s]
[INFO] SlingAuth - Feature ................................ SUCCESS [  0.154 s]
[INFO] SlingAuth - Package the content package ............ SUCCESS [  0.331 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  7.063 s
[INFO] Finished at: 2021-10-20T03:56:33Z
[INFO] ------------------------------------------------------------------------

这表明您已成功安装并启动了Sling服务器。

  1. 测试身份验证处理程序

为了测试身份验证处理程序,请按照以下步骤操作:

  • 打开任何Web浏览器,如Chrome或Firefox
  • 访问“http://localhost:8080/content/test.html”。您将看到一个身份验证提示,要求您提供用户名和密码。
  • 输入“admin”和“admin”,然后单击“登录”。
  • 如果您成功验证了身份,则应该被重定向到“/content/test.html”页面。
  1. 验证身份验证是否生效

要验证是否已成功保护Sling资源,请按照以下步骤操作:

  • 在浏览器中,输入“http://localhost:8080/content/protected/test.html”。
  • 您将看到一个身份验证提示,要求您提供用户名和密码。
  • 输入“admin”和“admin”,然后单击“登录”。
  • 如果您验证成功,您将被重定向到“/content/protected/test.html”页面。

如果您没有正确提供凭据,则将显示一个错误消息,并阻止您访问该页面。

总结

此示例演示了如何创建和注册Sling身份验证处理程序,以保护具有身份验证要求的Sling资源。此处理程序可允许您使用不同的身份验证机制进行身份验证,并在Sling中提供保护和授权。如果您正在构建一个需要身份验证的Web应用程序,则可以使用此处理程序作为一个简单而有效的身份验证解决方案。