Package com.jetdrone.vertx.yoke.middleware

Source Code of com.jetdrone.vertx.yoke.middleware.Pac4j

package com.jetdrone.vertx.yoke.middleware;

import com.jetdrone.vertx.yoke.Middleware;
import org.jetbrains.annotations.NotNull;
import org.pac4j.core.client.BaseClient;
import org.pac4j.core.client.RedirectAction;
import org.pac4j.core.context.HttpConstants;
import org.pac4j.core.context.WebContext;
import org.pac4j.core.credentials.Credentials;
import org.pac4j.core.exception.RequiresHttpAction;
import org.pac4j.core.profile.CommonProfile;
import org.pac4j.vertx.VertxWebContext;
import org.vertx.java.core.Handler;
import org.vertx.java.core.json.JsonObject;

public class Pac4j implements Middleware {

    private final BaseClient<? extends Credentials, ? extends CommonProfile> client;
    private final Boolean isAjax;

    private static String errorPage401 = "authentication required";
    private static String errorPage403 = "forbidden";

    public Pac4j(BaseClient client, boolean isAjax) {
        this.client = client;
        this.isAjax = isAjax;
    }

    public Pac4j(BaseClient<? extends Credentials, ? extends CommonProfile> client) {
        this(client, false);
    }

    @Override
    public void handle(@NotNull YokeRequest request, @NotNull Handler<Object> next) {
        // load
        JsonObject session = request.get("session");

        if (session != null) {
            next.handle(null);
        } else {
            session = request.createSession();

            WebContext webContext = new VertxWebContext(request);
            // requested url to save
            final String requestedUrlToSave = webContext.getFullRequestURL();

            // this gets saved in the end of the request
            session.putString("pac4jRequestedUrl", requestedUrlToSave);

            try {
                RedirectAction action = client.getRedirectAction(webContext, true, isAjax);
                switch (action.getType()) {
                    case REDIRECT:
                        request.response().redirect(HttpConstants.TEMP_REDIRECT, action.getLocation());
                        break;
                    case SUCCESS:
                        request.response().setContentType("text/html", "utf-8");
                        request.response().end(action.getContent());
                        break;
                    default:
                        next.handle("Invalid redirect action type");
                }
            } catch (final RequiresHttpAction e) {
                // requires some specific HTTP action
                final int code = e.getCode();

                if (code == HttpConstants.UNAUTHORIZED) {
                    request.response().setStatusCode(HttpConstants.UNAUTHORIZED);
                    request.response().end(errorPage401);
                } else if (code == HttpConstants.FORBIDDEN) {
                    request.response().setStatusCode(HttpConstants.FORBIDDEN);
                    request.response().end(errorPage403);
                } else {
                    next.handle("Unsupported HTTP action : " + code);
                }
            }
        }
    }
}
TOP

Related Classes of com.jetdrone.vertx.yoke.middleware.Pac4j

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.