Package org.jboss.as.quickstarts.ejb_security_interceptors

Source Code of org.jboss.as.quickstarts.ejb_security_interceptors.RemoteClient

/*
* JBoss, Home of Professional Open Source
* Copyright 2013, Red Hat, Inc. and/or its affiliates, and individual
* contributors by the @authors tag. See the copyright.txt in the
* distribution for a full listing of individual contributors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jboss.as.quickstarts.ejb_security_interceptors;

import static org.jboss.as.quickstarts.ejb_security_interceptors.EJBUtil.lookupIntermediateEJB;
import static org.jboss.as.quickstarts.ejb_security_interceptors.EJBUtil.lookupSecuredEJB;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.ejb.EJBAccessException;
import javax.security.auth.Subject;
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.NameCallback;
import javax.security.auth.callback.PasswordCallback;
import javax.security.auth.callback.UnsupportedCallbackException;
import javax.security.auth.login.AppConfigurationEntry;
import javax.security.auth.login.Configuration;
import javax.security.auth.login.LoginContext;
import javax.security.auth.login.LoginException;

import org.jboss.security.ClientLoginModule;
import org.jboss.security.SimplePrincipal;

/**
* The remote client responsible for making a number of calls to the server to demonstrate the capabilities of the interceptors.
*
* @author <a href="mailto:darran.lofthouse@jboss.com">Darran Lofthouse</a>
*/
public class RemoteClient {

    /**
     * Perform the tests of this quick start using the SecurityContextAssociation API to set the desired Principal.
     */
    private static void performTestingSecurityContext(final String user, final SecuredEJBRemote secured,
        final IntermediateEJBRemote intermediate) {
        try {
            if (user != null) {
                SecurityActions.securityContextSetPrincpal(new SimplePrincipal(user));
            }

            System.out.println("-------------------------------------------------");
            System.out
                .println(String.format("* * About to perform test as %s * *\n\n", user == null ? "ConnectionUser" : user));

            makeCalls(secured, intermediate);
        } finally {
            SecurityActions.securityContextClear();
            System.out.println("* * Test Complete * * \n\n\n");
            System.out.println("-------------------------------------------------");
        }
    }

    /**
     * Perform the tests of this quick start using the ClientLoginModule and LoginContext API to set the desired Principal.
     */
    private static void performTestingClientLoginModule(final String user, final SecuredEJBRemote secured,
        final IntermediateEJBRemote intermediate) throws Exception {
        LoginContext loginContext = null;
        try {
            if (user != null) {
                loginContext = getCLMLoginContext(user, "");
                loginContext.login();
            }

            System.out.println("-------------------------------------------------");
            System.out
                .println(String.format("* * About to perform test as %s * *\n\n", user == null ? "ConnectionUser" : user));

            makeCalls(secured, intermediate);
        } finally {
            if (loginContext != null) {
                loginContext.logout();
            }
            System.out.println("* * Test Complete * * \n\n");
            System.out.println("-------------------------------------------------");
        }
    }

    public static LoginContext getCLMLoginContext(final String username, final String password) throws LoginException {
        final String configurationName = "Testing";

        CallbackHandler cbh = new CallbackHandler() {
            public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
                for (Callback current : callbacks) {
                    if (current instanceof NameCallback) {
                        ((NameCallback) current).setName(username);
                    } else if (current instanceof PasswordCallback) {
                        ((PasswordCallback) current).setPassword(password.toCharArray());
                    } else {
                        throw new UnsupportedCallbackException(current);
                    }
                }
            }
        };
        Configuration config = new Configuration() {

            @Override
            public AppConfigurationEntry[] getAppConfigurationEntry(String name) {
                if (configurationName.equals(name) == false) {
                    throw new IllegalArgumentException("Unexpected configuration name '" + name + "'");
                }
                Map<String, String> options = new HashMap<String, String>();
                options.put("multi-threaded", "true");
                options.put("restore-login-identity", "true");

                AppConfigurationEntry clmEntry = new AppConfigurationEntry(ClientLoginModule.class.getName(),
                    AppConfigurationEntry.LoginModuleControlFlag.REQUIRED, options);

                return new AppConfigurationEntry[] { clmEntry };
            }
        };

        return new LoginContext(configurationName, new Subject(), cbh, config);
    }

    private static void makeCalls(final SecuredEJBRemote secured, final IntermediateEJBRemote intermediate) {
        System.out.println("* Making Direct Calls to the SecuredEJB\n");
        System.out.println(String.format("* getSecurityInformation()=%s", secured.getSecurityInformation()));

        boolean roleMethodSuccess;
        try {
            secured.roleOneMethod();
            roleMethodSuccess = true;
        } catch (EJBAccessException e) {
            roleMethodSuccess = false;
        }
        System.out.println(String.format("* Can call roleOneMethod()=%b", roleMethodSuccess));

        try {
            secured.roleTwoMethod();
            roleMethodSuccess = true;
        } catch (EJBAccessException e) {
            roleMethodSuccess = false;
        }
        System.out.println(String.format("* Can call roleTwoMethod()=%b", roleMethodSuccess));

        System.out.println("\n* Calling the IntermediateEJB to repeat the test server to server \n");
        System.out.println(intermediate.makeTestCalls());
    }

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        System.out.println("\n\n\n* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n\n");

        SecuredEJBRemote secured = lookupSecuredEJB();
        IntermediateEJBRemote intermediate = lookupIntermediateEJB();

        System.out
            .println("This first round of tests is using the (PicketBox) SecurityContextAssociation API to set the desired Principal.\n\n");

        performTestingSecurityContext(null, secured, intermediate);
        performTestingSecurityContext("AppUserOne", secured, intermediate);
        performTestingSecurityContext("AppUserTwo", secured, intermediate);
        try {
            performTestingSecurityContext("AppUserThree", secured, intermediate);
            System.err.println("ERROR - We did not expect the switch to 'AppUserThree' to work.");
        } catch (Exception e) {
            System.out.println("Call as 'AppUserThree' correctly rejected.\n");
        }

        System.out
            .println("This second round of tests is using the (PicketBox) ClientLoginModule with LoginContext API to set the desired Principal.\n\n");

        performTestingClientLoginModule(null, secured, intermediate);
        performTestingClientLoginModule("AppUserOne", secured, intermediate);
        performTestingClientLoginModule("AppUserTwo", secured, intermediate);
        try {
            performTestingClientLoginModule("AppUserThree", secured, intermediate);
            System.err.println("ERROR - We did not expect the switch to 'AppUserThree' to work.");
        } catch (Exception e) {
            System.out.println("Call as 'AppUserThree' correctly rejected.\n");
        }

        System.out.println("\n\n* * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n\n\n");
    }

}
TOP

Related Classes of org.jboss.as.quickstarts.ejb_security_interceptors.RemoteClient

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.