JmxPermissionPrincipal.java

package com.ziesemer.utils.jmx.server.authorization;

import java.security.AccessController;
import java.util.Set;

import javax.management.remote.JMXPrincipal;
import javax.security.auth.Subject;

/**
 * <p>Extension to {@link JMXPrincipal} that includes a {@link JmxPermissions}
 * 		collection of {@link JmxPermission}s.
 * 	This allows permissions to be granted during authentication,
 * 		aiding performance by not having to perform additional authentication calculations per-request.</p>
 * <p>Designed for use with {@link JmxPermissionAuthorizer}.</p>
 * @author Mark A. Ziesemer
 * 	<a href="http://www.ziesemer.com.">&lt;www.ziesemer.com&gt;</a>
 */
public class JmxPermissionPrincipal extends JMXPrincipal{
	
	private static final long serialVersionUID = 1L;
	
	protected final JmxPermissions permissions = new JmxPermissions();

	public JmxPermissionPrincipal(final String name){
		super(name);
	}
	
	public JmxPermissions getPermissions(){
		return permissions;
	}
	
	/**
	 * <p>Convenience method to obtain the current {@link JmxPermissionPrincipal}
	 * 		(if it exists) using {@link javax.security.auth.Subject#getSubject(java.security.AccessControlContext)}
	 * 		with {@link java.security.AccessController#getContext()}.
	 * 	May return <code>null</code>.</p>
	 */
	public static JmxPermissionPrincipal getCurrent(){
		final Subject subject = Subject.getSubject(AccessController.getContext());
		if(subject != null){
			final Set<JmxPermissionPrincipal> principals = subject.getPrincipals(JmxPermissionPrincipal.class);
			if(principals != null && !principals.isEmpty()){
				return principals.iterator().next();
			}
		}
		return null;
	}
	
}