import java.security.*;
import java.util.*;
import javax.security.auth.*;
import javax.security.auth.login.*;

public class EjemploJAAS2 {

	private static final String TEXTO_GENERICO = "texto generico que puede ver todo el mundo";
	private static final String TEXTO_PARTICULAR = "solo lo puede ver user logeado";

	/**
	 *  Devolver un String distinto según el subject
	 */
	public static String getSecretText() {

		AccessControlContext contexto = AccessController.getContext();
		Subject sujeto = Subject.getSubject(contexto);

		if (sujeto == null) {
            System.out.println("Sujeto vacio");
			return TEXTO_GENERICO;
		}
                
        // Obtener todos los principales: instancias de ImplPrincipal.
        // Devolver el texto secreto si el usuario es "user"
		Set principales = sujeto.getPrincipals();
		Iterator iterador = principales.iterator();
		while (iterador.hasNext()) {
			ImplPrincipal principal = (ImplPrincipal)iterador.next();
			if (principal.getName().equals("user")) {
				return TEXTO_PARTICULAR;
			}
		}
		return TEXTO_GENERICO;
	}

	/**
	 *	Intentar hacer un login y después ejecutar AccionEjemplo.
	 */
	public static void main(String[] args) {
		if (args.length != 2) {
			System.err.println
			("Uso: java EjemploJAAS2 usuario password");
			System.exit(1);
		}

		LoginContext loginContext = null;

		String usuario = args[0];
		char[] password = args[1].toCharArray();

		try {
			loginContext = new LoginContext(
				"JaasModule", new UserPasswordCallbackHandler
				(usuario, password));
			loginContext.login();
			System.out.println("\nLogin OK");
		} catch (LoginException le) {
			System.out.println("\nLogin error");
		}

        // Como el login tiene éxito entonces vemos el sujeto actual.
		Subject sujeto = loginContext.getSubject();

		// Perform the example action as the authenticated subject.
        // y realizamos la accion secreta
		sujeto.doAs(sujeto, new AccionSecreta());
	}
}


class AccionSecreta  implements PrivilegedAction {

	public AccionSecreta() {
	}

	public Object run() {
		System.out.println("Texto secreto: " + EjemploJAAS2.getSecretText());
		return null;
	}
}
