📅  最后修改于: 2023-12-03 15:05:13.640000             🧑  作者: Mango
本示例演示了如何使用Sling身份验证处理程序对用户进行身份验证和授权,并保护Sling内的资源。
本示例的运行需要以下环境:
在Sling中,身份验证处理程序是负责处理Sling身份验证的组件。它们允许您使用不同的身份验证机制进行身份验证,并在Sling中提供保护和授权。Sling身份验证处理程序有两种类型:
本示例将演示如何创建一个基本的Sling身份验证处理程序。该处理程序将对用户进行身份验证,并保护一个受保护的Sling资源。
首先,我们需要创建一个新的Sling身份验证处理程序。要创建Sling身份验证处理程序,请按照以下步骤操作:
<dependency>
<groupId>org.apache.sling</groupId>
<artifactId>org.apache.sling.auth.core</artifactId>
<version>1.5.6</version>
</dependency>
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的用户存储。
现在,我们已经创建了一个Sling身份验证处理程序,接下来需要将其注册到Sling中。
要注册身份验证处理程序,请按照以下步骤操作:
<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注册。
@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”作为处理程序的类型。您可以根据需要更改这些值。
<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>
为了使OSGi能够找到并加载TestAuthenticationHandler,我们需要将其作为OSGi配置添加到Sling框架中。要添加处理程序的OSGi配置,请按照以下步骤操作:
# Test Authentication Handler configuration
/authentication.handler.test-auth.paths=/content
/authentication.handler.test-auth.type=test-auth
注意:该配置文件的名称和目录结构都是由TestAuthenticationHandler类中使用的@Component注释中的属性定义的。
现在,我们已经将Sling身份验证处理程序注册到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服务器。
为了测试身份验证处理程序,请按照以下步骤操作:
要验证是否已成功保护Sling资源,请按照以下步骤操作:
如果您没有正确提供凭据,则将显示一个错误消息,并阻止您访问该页面。
此示例演示了如何创建和注册Sling身份验证处理程序,以保护具有身份验证要求的Sling资源。此处理程序可允许您使用不同的身份验证机制进行身份验证,并在Sling中提供保护和授权。如果您正在构建一个需要身份验证的Web应用程序,则可以使用此处理程序作为一个简单而有效的身份验证解决方案。