Page is not cached and user is authorized
- Dispatcher determines that the content is not cached or requires updating.
- Dispatcher forwards the original request to the render.
- The render calls the AEM authorizer servlet (this servlet is not the Dispatcher AuthChcker servlet) to perform a security check. When the user is authorized, the render includes the rendered page in the body of the response message.
- Dispatcher forwards the response to the browser. Dispatcher adds the body of the render’s response message to the cache.
User is not authorized
- Dispatcher checks the cache.
- Dispatcher sends a request message to the render that includes all header lines from the browser’s request.
- The render calls the Auth Checker servlet to perform a security check, which fails, and the render forwards the original request to Dispatcher.
- Dispatcher forwards the original request to the render.
- The render calls the AEM authorizer servlet (this servlet is not the Dispatcher AuthChcker servlet) to perform a security check. When the user is authorized, the render includes the rendered page in the body of the response message.
- Dispatcher forwards the response to the browser. Dispatcher adds the body of the render’s response message to the cache.
Implementing permission-sensitive caching
To implement permission-sensitive caching, perform the following tasks:
- Develop a servlet that performs authentication and authorization
- Configure the Dispatcher
Header always set Cache-Control private
.For AEM as a Cloud Service, see the Caching page for more details on how to set private caching headers.
Create the Auth Checker servlet
Create and deploy a servlet that performs the authentication and authorization of the user who requests the web content. The servlet can use any authentication. It can also use any authorization method. For example, it can use the AEM user account and repository ACLs. Or, it can use an LDAP lookup service. You deploy the servlet to the AEM instance that Dispatcher uses as the render.
The servlet must be accessible to all users. Therefore, your servlet should extend the org.apache.sling.api.servlets.SlingSafeMethodsServlet
class, which provides read-only access to the system.
The servlet receives only HEAD requests from the render, so you only must implement the doHead
method.
The render includes the URI of the requested resource as a parameter of the HTTP request. For example, an authorization servlet is accessed via /bin/permissioncheck
. To perform a security check on the /content/geometrixx-outdoors/en.html page, the render includes the following URL in the HTTP request:
/bin/permissioncheck?uri=/content/geometrixx-outdoors/en.html
The servlet response message must contain the following HTTP status codes:
- 200: Authentication and authorization passed.
The following example servlet obtains the URL of the requested resource from the HTTP request. The code uses the Felix SCR Property
annotation to set the value of the sling.servlet.paths
property to /bin/permissioncheck. In the doHead
method, the servlet obtains the session object and uses the checkPermission
method to determine the appropriate response code.