Developing Security Providers for WebLogic Server
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
Authorization is the process whereby the interactions between users and WebLogic resources are controlled, based on user identity or other information. In other words, authorization answers the question, "What can you access?" In WebLogic Server, an Authorization provider is used to limit the interactions between users and WebLogic resources to ensure integrity, confidentiality, and availability.
The following sections describe Authorization provider concepts and functionality, and provide step-by-step instructions for developing a custom Authorization provider:
Before you develop an Authorization provider, you need to understand the following concepts:
Like LoginModules for Authentication providers, an Access Decision is the component of an Authorization provider that actually answers the "is access allowed?" question. Specifically, an Access Decision is asked whether a subject has permission to perform a given operation on a WebLogic resource, with specific parameters in an application. Given this information, the Access Decision responds with a result of PERMIT
, DENY
, or ABSTAIN
.
Note: For more information about Access Decisions, see Implement the AccessDecision SSPI.
The Java Authorization Contract for Containers (JACC) is part of J2EE 1.4. JACC extends the Java 2 permission-based security model to EJBs and Servlets. JACC is defined by JSR-115.
JACC provides an alternate authorization mechanism for the EJB and Servlet containers in a WebLogic Server domain. When JACC is configured, the WebLogic Security framework access decisions, adjudication, and role mapping functions are not used for EJB and Servlet authorization decisions.
Note: You cannot use the JACC framework in conjunction with the WebLogic Security framework. The JACC classes used by WebLogic Server do not include an implementation of a Policy object for rendering decisions but instead rely on the java.security.Policy
object.
WebLogic Server implements a JACC provider which, although fully compliant with JSR-115, is not as optimized as the WebLogic Authentication provider. The Java JACC classes are used for rendering access decisions. Because JSR-115 does not define how to address role mapping, WebLogic JACC classes are used for role-to-principal mapping. See http://java.sun.com/j2ee/javaacc/ for information on developing a JACC provider.
Figure 6-1 illustrates how Authorization providers (and the associated Adjudication and Role Mapping providers) interact with the WebLogic Security Framework during the authorization process, and an explanation follows.
Figure 6-1 Authorization Providers and the Authorization Process
Generally, authorization is performed in the following manner:
Note: The resource container could be the container that handles any one of the WebLogic Resources described in Security Providers and WebLogic Resources.
ContextHandler
object that may be used by the configured Role Mapping providers and the configured Authorization providers' Access Decisions to obtain information associated with the context of the request.Note: For more information about ContextHandlers, see ContextHandlers and WebLogic Resources. For more information about Access Decisions, see Access Decisions. For more information about Role Mapping providers, see Role Mapping Providers.
The resource container calls the WebLogic Security Framework, passing in the subject, the WebLogic resource, and optionally, the ContextHandler
object (to provide additional input for the decision).
ContextHandler
to request various pieces of information about the request. They construct a set of Callback
objects that represent the type of information being requested. This set of Callback
objects is then passed as an array to the ContextHandler
using the handle
method.The Role Mapping providers use the values contained in the Callback
objects, the subject, and the resource to compute a list of security roles to which the subject making the request is entitled, and pass the list of applicable security roles back to the WebLogic Security Framework.
The Authorization providers' Access Decisions also use the ContextHandler
to request various pieces of information about the request. They too construct a set of Callback
objects that represent the type of information being requested. This set of Callback
objects is then passed as an array to the ContextHandler
using the handle
method. (The process is the same as described for Role Mapping providers in Step 5.)
isAccessAllowed
method of each configured Authorization provider's Access Decision is called to determine if the subject is authorized to perform the requested access, based on the ContextHandler
, subject, WebLogic resource, and security roles. Each isAccessAllowed
method can return one of three values:PERMIT
—Indicates that the requested access is permitted.DENY
—Indicates that the requested access is explicitly denied.ABSTAIN
—Indicates that the Access Decision was unable to render an explicit decision.Note: For more information about the Adjudication provider, see Adjudication Providers.
TRUE
or FALSE
verdict, which is forwarded to the resource container through the WebLogic Security Framework.TRUE
, the resource container dispatches the request to the protected WebLogic resource.FALSE
, the resource container throws a security exception that indicates that the requestor was not authorized to perform the requested access on the protected WebLogic resource.
The default (that is, active) security realm for WebLogic Server includes a WebLogic Authorization provider. The WebLogic Authorization provider supplies the default enforcement of authorization for this version of WebLogic Server. The WebLogic Authorization provider returns an access decision using a policy-based authorization engine to determine if a particular user is allowed access to a protected WebLogic resource. The WebLogic Authorization provider also supports the deployment and undeployment of security policies within the system. If you want to use an authorization mechanism that already exists within your organization, you could create a custom Authorization provider to tie into that system.
All Authorization, Role Mapping, and Credential Mapping providers for the security realm must support application versioning in order for an application to be deployed using versions. If you develop a custom security provider for Authorization, Role Mapping, or Credential Mapping and need to support versioned applications, you must implement the Versionable Application SSPI, as described in Versionable Application Providers.
If the WebLogic Authorization provider does not meet your needs, you can develop a custom Authorization provider by following these steps:
Before you start creating runtime classes, you should first:
When you understand this information and have made your design decisions, create the runtime classes for your custom Authorization provider by following these steps:
Note: At least one Authorization provider in a security realm must implement the DeployableAuthorizationProvider
SSPI, or else it will be impossible to deploy Web applications and EJBs.
For an example of how to create a runtime class for a custom Authorization provider, see Example: Creating the Runtime Class for the Sample Authorization Provider.
To implement the AuthorizationProvider
SSPI, provide implementations for the methods described in Understand the Purpose of the Provider SSPIs and the following method:
The getAccessDecision
method obtains the implementation of the AccessDecision
SSPI. For a single runtime class called MyAuthorizationProviderImpl
.java
, the implementation of the getAccessDecision
method would be:
If there are two runtime classes, then the implementation of the getAccessDecision
method could be:
This is because the runtime class that implements the AuthorizationProvider
SSPI is used as a factory to obtain classes that implement the AccessDecision
SSPI.
For more information about the AuthorizationProvider
SSPI and the getAccessDecision
method, see the WebLogic Server API Reference Javadoc.
To implement the DeployableAuthorizationProviderV2
SSPI, provide implementations for the methods described in Understand the Purpose of the Provider SSPIs, Implement the AuthorizationProvider SSPI, and the following methods:
public void deleteApplicationPolicies(ApplicationInfo application) throws ResourceRemovalException
The deleteApplicationPolicies
method deletes all policies for an application. The deleteApplicationPolicies
method is called only on the Administration Server.
public void deleteApplicationPolicies(DeployPolicyHandle handle, Resource resource) throws ResourceCreationException
The deployExcludedPolicy
method deploys a policy that always denies access. If a policy already exists, it is removed and replaced by this policy.
public void deployPolicy(DeployPolicyHandle handle, Resource resource, String[] roleNames) throws ResourceCreationException
The deployPolicy
method creates a security policy on behalf of a deployed Web application or EJB, based on the WebLogic resource to which the security policy should apply and the security role names that are in the security policy.
public void deployUncheckedPolicy(DeployPolicyHandle handle, Resource resource) throws ResourceCreationException
The deployUncheckedPolicy
method deploys a policy that always grants access. If a policy already exists, it is removed and replaced by this policy.
public void endDeployPolicies(DeployPolicyHandle handle) throws ResourceCreationException
The deployExcludedPolicy
method deploys a policy that always denies access. If a policy already exists, it is removed and replaced by this policy.
public deployPolicyHandle startDeployPolicies(ApplicationInfo application) throws DeployHandleCreationException
The startDeployPolicies
method marks the beginning of an application policy deployment and is called on all servers within a WebLogic Server domain where an application is targeted.
For more information about the DeployableAuthorizationProviderV2
SSPI and the deployPolicy
and undeployPolicy
methods, see the WebLogic Server API Reference Javadoc.
The ApplicationInfo interface passes data about an application deployment to a security provider. You can use this data to uniquely identity the application.
The Security Framework implements the ApplicationInfo interface for your convenience. You do not need to implement any methods for this interface.
The DeployableAuthorizationProviderV2 and DeployableRoleProviderV2 interfaces use ApplicationInfo. For example, consider an implementation of the DeployableAuthorizationProviderV2 methods. The Security Framework calls the DeployableAuthorizationProviderV2 startDeployPolicies
method and passes in the ApplicationInfo interface for this application. The ApplicationInfo data is determined based on the information supplied in the Administration Console when an application is deployed.
The startDeployPolicies
method returns DeployPolicyHandle
, which you can then use in the other DeployableAuthorizationProviderV2 methods.
You use the ApplicationInfo interface to get the application identifier, the component name, and the component type for this application. Component type can be APPLICATION
, CONTROL_RESOURCE
, EJB
, or WEBAPP
, as defined in the ApplicationInfo.ComponentType
class.
The following example shows one way to accomplish this task:
public DeployPolicyHandle startDeployPolicies(ApplicationInfo appInfo)
throws DeployHandleCreationException
// Obtain the application information...
String appId = appInfo.getApplicationIdentifier();
ComponentType compType = appInfo.getComponentType();
String compName = appInfo.getComponentName();
The Security Framework calls the DeployableAuthorizationProviderV2 deleteApplicationPolicies
method and passes in the ApplicationInfo interface for this application. The deleteApplicationPolicies
method deletes all policies for an application and is called (only on the Administration Server within a WebLogic Server domain) at the time an application is deleted.
When you implement the AccessDecision
SSPI, you must provide implementations for the following methods:
Resource resource, ContextHandler handler, Direction direction) throws InvalidPrincipalException
The isAccessAllowed
method utilizes information contained within the subject to determine if the requestor should be allowed to access a protected method. The isAccessAllowed
method may be called prior to or after a request, and returns values of PERMIT
, DENY
, or ABSTAIN
. If multiple Access Decisions are configured and return conflicting values, an Adjudication provider will be needed to determine a final result. For more information, see Adjudication Providers.
public boolean isProtectedResource(Subject subject, Resource resource) throws InvalidPrincipalException
The isProtectedResource
method is used to determine whether the specified WebLogic resource is protected, without incurring the cost of an actual access check. It is only a lightweight mechanism because it does not compute a set of security roles that may be granted to the caller's subject.
For more information about the AccessDecision
SSPI and the isAccessAllowed
and isProtectedResource
methods, see the WebLogic Server API Reference Javadoc.
An Authentication provider is the security provider responsible for populating a subject with users and groups, which are then extracted from the subject by other types of security providers, including Authorization providers. If the Authentication provider configured in your security realm is a Realm Adapter Authentication provider, the user and group information will be stored in the subject in a way that is slightly different from other Authentication providers. Therefore, this user and group information must also be extracted in a slightly different way.
Listing 6-1 provides code that can be used by custom Authorization providers to check whether a subject matches a user or group name when a Realm Adapter Authentication provider was used to populate the subject. This code belongs in both the isAccessAllowed
and isProtectedResource
methods.
Listing 6-1 Sample Code to Check if a Subject Matches a User or Group Name
/**
* Determines if the Subject matches a user/group name.
*
* @param principalWant A String containing the name of a principal in this role
* (that is, the role definition).
*
* @param subject A Subject that contains the Principals that identify the user
* who is trying to access the resource as well as the user's groups.
*
* @return A boolean. true if the current subject matches the name of the
* principal in the role, false otherwise.
*/
private boolean subjectMatches(String principalWant, Subject subject)
{
// first, see if it's a group name match
if (SubjectUtils.isUserInGroup(subject, principalWant)) {
return true;
}
// second, see if it's a user name match
if (principalWant.equals(SubjectUtils.getUsername(subject))) {
return true;
}
// didn't match
return false;
}
Listing 6-2 shows the SampleAuthorizationProviderImpl.java
class, which is the runtime class for the sample Authorization provider. This runtime class includes implementations for:
SecurityProvider
interface: initialize
, getDescription
and shutdown
(as described in Understand the Purpose of the Provider SSPIs).AuthorizationProvider
SSPI: the getAccessDecision
method (as described in Implement the AuthorizationProvider SSPI).DeployableAuthorizationProviderV2
SSPI: the deleteApplicationPolicies
, deployExcludedPolicy
, deployPolicy
, deployUncheckedPolicy
, endDeployPolicies
, starteployPolicies
, and undeployAllPolicies
methods (as described in Implement the DeployableAuthorizationProviderV2 SSPI).AccessDecision
SSPI: the isAccessAllowed
and isProtectedResource
methods (as described in Implement the AccessDecision SSPI).Note: The bold face code in Listing 6-2 highlights the class declaration and the method signatures.
Listing 6-2 SimpleSampleAuthorizationProviderImpl.java
package examples.security.providers.authorization.simple;
import java.security.Principal;
import java.util.Date;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import javax.security.auth.Subject;
import weblogic.management.security.ProviderMBean;
import weblogic.security.SubjectUtils;
import weblogic.security.WLSPrincipals;
import weblogic.security.service.ContextHandler;
import weblogic.security.spi.AccessDecision;
import weblogic.security.spi.ApplicationInfo;
import weblogic.security.spi.ApplicationInfo.ComponentType;
import weblogic.security.spi.DeployableAuthorizationProviderV2;
import weblogic.security.spi.DeployPolicyHandle;
import weblogic.security.spi.Direction;
import weblogic.security.spi.InvalidPrincipalException;
import weblogic.security.spi.Resource;
import weblogic.security.spi.Result;
import weblogic.security.spi.SecurityServices;
import weblogic.security.spi.VersionableApplicationProvider;
public final class SimpleSampleAuthorizationProviderImpl implements DeployableAuthorizationProviderV2, AccessDecision, VersionableApplicationProvider
{
private static String[] NO_ACCESS = new String[0];
private static String[] ALL_ACCESS = new String[] {WLSPrincipals.getEveryoneGroupname()};
private String description;
private SimpleSampleAuthorizerDatabase database;
public void initialize(ProviderMBean mbean, SecurityServices services)
{
System.out.println("SimpleSampleAuthorizationProviderImpl.initialize");
SimpleSampleAuthorizerMBean myMBean = (SimpleSampleAuthorizerMBean)mbean;
description = myMBean.getDescription() + "\n" + myMBean.getVersion();
database = new SimpleSampleAuthorizerDatabase(myMBean);
}
public String getDescription()
{
return description;
}
public void shutdown()
{
System.out.println("SampleAuthorizationProviderImpl.shutdown");
}
public AccessDecision getAccessDecision()
{
return this;
}
public Result isAccessAllowed(Subject subject, Map roles, Resource resource,
ContextHandler handler, Direction direction)
{
System.out.println("SimpleSampleAuthorizationProviderImpl.isAccessAllowed");
System.out.println("\tsubject\t= " + subject);
System.out.println("\troles\t= " + roles);
System.out.println("\tresource\t= " + resource);
System.out.println("\tdirection\t= " + direction);
Set principals = subject.getPrincipals();
for (Resource res = resource; res != null; res = res.getParentResource()) {
if (database.policyExists(res)) {
Result result = isAccessAllowed(res, subject, roles);
System.out.println("\tallowed\t= " + result);
return result;
}
}
Result result = Result.ABSTAIN;
System.out.println("\tallowed\t= " + result);
return result;
}
public boolean isProtectedResource(Subject subject, Resource resource) throws
InvalidPrincipalException
{
System.out.println("SimpleSampleAuthorizationProviderImpl.
isProtectedResource");
System.out.println("\tsubject\t= " + subject);
System.out.println("\tresource\t= " + resource);
for (Resource res = resource; res != null; res = res.getParentResource()) {
if (database.policyExists(res)) {
System.out.println("\tprotected\t= true");
return true;
}
}
System.out.println("\tprotected\t= false");
return false;
}
public DeployPolicyHandle startDeployPolicies(ApplicationInfo application)
{
String appId = application.getApplicationIdentifier();
String compName = application.getComponentName();
ComponentType compType = application.getComponentType();
DeployPolicyHandle handle = new SampleDeployPolicyHandle(appId,compName,compType);
database.removePoliciesForComponent(appId, compName, compType);
return handle;
public void deployPolicy(DeployPolicyHandle handle,
Resource resource, String[] roleNamesAllowed)
{
System.out.println("SimpleSampleAuthorizationProviderImpl.deployPolicy");
System.out.println("\thandle\t= " + ((SampleDeployPolicyHandle)handle).toString());
System.out.println("\tresource\t= " + resource);
for (int i = 0; roleNamesAllowed != null && i < roleNamesAllowed.length; i++) {
System.out.println("\troleNamesAllowed[" + i + "]\t= " + roleNamesAllowed[i]);
}
database.setPolicy(resource, roleNamesAllowed);
}
public void deployUncheckedPolicy(DeployPolicyHandle handle, Resource resource)
{
System.out.println("SimpleSampleAuthorizationProviderImpl.deployUncheckedPolicy");
System.out.println("\thandle\t= " + ((SampleDeployPolicyHandle)handle).toString());
System.out.println("\tresource\t= " + resource);
database.setPolicy(resource, ALL_ACCESS);
}
public void deployExcludedPolicy(DeployPolicyHandle handle, Resource resource)
{
System.out.println("SimpleSampleAuthorizationProviderImpl.deployExcludedPolicy");
System.out.println("\thandle\t= " + ((SampleDeployPolicyHandle)handle).toString());
System.out.println("\tresource\t= " + resource);
database.setPolicy(resource, NO_ACCESS);
}
public void endDeployPolicies(DeployPolicyHandle handle)
{
database.savePolicies();
}
public void undeployAllPolicies(DeployPolicyHandle handle)
{
System.out.println("SimpleSampleAuthorizationProviderImpl.undeployAllPolicies");
SampleDeployPolicyHandle myHandle = (SampleDeployPolicyHandle)handle;
System.out.println("\thandle\t= " + myHandle.toString());
// remove policies
database.removePoliciesForComponent(myHandle.getApplication(),
myHandle.getComponent(),
myHandle.getComponentType());
}
public void deleteApplicationPolicies(ApplicationInfo application)
{
System.out.println("SimpleSampleAuthorizationProviderImpl.deleteApplicationPolicies");
String appId = application.getApplicationIdentifier();
System.out.println("\tapplication identifier\t= " + appId);
// clear out policies for the application
database.removePoliciesForApplication(appId);
}
private boolean rolesOrSubjectContains(Map roles, Subject subject, String roleOrPrincipalWant)
{
// first, see if it's a role name match
if (roles.containsKey(roleOrPrincipalWant)) {
return true;
}
// second, see if it's a group name match
if (SubjectUtils.isUserInGroup(subject, roleOrPrincipalWant)) {
return true;
}
// third, see if it's a user name match
if (roleOrPrincipalWant.equals(SubjectUtils.getUsername(subject))) {
return true;
}
// didn't match
return false;
}
private Result isAccessAllowed(Resource resource, Subject subject, Map roles)
{
// loop over the principals and roles in our database who are allowed to access this resource
for (Enumeration e = database.getPolicy(resource); e.hasMoreElements();) {
String roleOrPrincipalAllowed = (String)e.nextElement();
if (rolesOrSubjectContains(roles, subject, roleOrPrincipalAllowed)) {
return Result.PERMIT;
}
}
// the resource was explicitly mentioned and didn't grant access
return Result.DENY;
}
public void createApplicationVersion(String appId, String sourceAppId)
{
System.out.println("SimpleSampleAuthorizationProviderImpl.createApplicationVersion");
System.out.println("\tapplication identifier\t= " + appId);
System.out.println("\tsource app identifier\t= " + ((sourceAppId != null) ? sourceAppId : "None"));
// create new policies when existing application is specified
if (sourceAppId != null) {
database.clonePoliciesForApplication(sourceAppId,appId);
}
}
public void deleteApplicationVersion(String appId)
{
System.out.println("SimpleSampleAuthorizationProviderImpl.deleteApplicationVersion");
System.out.println("\tapplication identifier\t= " + appId);
// clear out policies for the application
database.removePoliciesForApplication(appId);
}
public void deleteApplication(String appName)
{
System.out.println("SimpleSampleAuthorizationProviderImpl.deleteApplication");
System.out.println("\tapplication name\t= " + appName);
// clear out policies for the application
database.removePoliciesForApplication(appName);
}
class SampleDeployPolicyHandle implements DeployPolicyHandle
{
Date date;
String application;
String component;
ComponentType componentType;
SampleDeployPolicyHandle(String app, String comp, ComponentType type)
{
this.application = app;
this.component = comp;
this.componentType = type;
this.date = new Date();
}
public String getApplication() { return application; }
public String getComponent() { return component; }
public ComponentType getComponentType() { return componentType; }
public String toString()
{
String name = component;
if (componentType == ComponentType.APPLICATION)
name = application;
return componentType +" "+ name +" ["+ date.toString() +"]";
}
}
}
Before you start generating an MBean type for your custom security provider, you should first:
When you understand this information and have made your design decisions, create the MBean type for your custom Authorization provider by following these steps:
Notes: Several sample security providers (available under Code Samples: WebLogic Server on the dev2dev Web site) illustrate how to perform these steps.
All instructions provided in this section assume that you are working in a Windows environment.
To create an MBean Definition File (MDF), follow these steps:
Note: The MDF for the sample Authorization provider is called SimpleSampleAuthorizer.xml
.
<MBeanType>
and <MBeanAttribute>
elements in your MDF so that they are appropriate for your custom Authorization provider. Note: A complete reference of MDF element syntax is available in MBean Definition File (MDF) Element Syntax.
Once you create your MDF, you are ready to run it through the WebLogic MBeanMaker. The WebLogic MBeanMaker is currently a command-line utility that takes as its input an MDF, and outputs some intermediate Java files, including an MBean interface, an MBean implementation, and an associated MBean information file. Together, these intermediate files form the MBean type for your custom security provider.
The instructions for generating an MBean type differ based on the design of your custom Authorization provider. Follow the instructions that are appropriate to your situation:
If the MDF for your custom Authorization provider does not implement any optional SSPI MBeans and does not include any custom operations, follow these steps:
java -DMDF=
xmlfile -Dfiles=
filesdir -DcreateStubs=true weblogic.management.commo.WebLogicMBeanMaker
where the -DMDF
flag indicates that the WebLogic MBeanMaker should translate the MDF into code, xmlFile is the MDF (the XML MBean Description File) and filesdir is the location where the WebLogic MBeanMaker will place the intermediate files for the MBean type.
Whenever xmlfile is provided, a new set of output files is generated. If files already exist in the location specified by filesdir, you are informed that the existing files will be overwritten and are asked to confirm.
Each time you use the -DcreateStubs=true
flag, it overwrites any existing MBean implementation file.
Note: As of this version of WebLogic Server, you can also provide a directory that contains multiple MDF's by using the -DMDFDIR <MDF directory name>
option. In prior versions of WebLogic Server, the WebLogic MBeanMaker processed only one MDF at a time. Therefore, you had to repeat this process if you had multiple MDFs (in other words, multiple Authorization providers).
If the MDF for your custom Authorization provider does implement some optional SSPI MBeans or does include custom operations, consider the following:
java -DMDF=
xmlfile -Dfiles=
filesdir -DcreateStubs=true weblogic.management.commo.WebLogicMBeanMaker
where the -DMDF
flag indicates that the WebLogic MBeanMaker should translate the MDF into code, xmlFile is the MDF (the XML MBean Description File) and filesdir is the location where the WebLogic MBeanMaker will place the intermediate files for the MBean type.
Whenever xmlfile is provided, a new set of output files is generated. If files already exist in the location specified by filesdir, you are informed that the existing files will be overwritten and are asked to confirm.
Each time you use the -DcreateStubs=true
flag, it overwrites any existing MBean implementation file.
Note: As of this version of WebLogic Server, you can also provide a directory that contains multiple MDF's by using the -DMDFDIR <MDF directory name>
option. In prior versions of WebLogic Server, the WebLogic MBeanMaker processed only one MDF at a time. Therefore, you had to repeat this process if you had multiple MDFs (in other words, multiple Authorization providers).
The MBean implementation file generated by the WebLogic MBeanMaker is named MBeanNameImpl.java
. For example, for the MDF named SampleAuthorizer
, the MBean implementation file to be edited is named SampleAuthorizerImpl.java
.
java -DMDF=
xmlfile -Dfiles=
filesdir -DcreateStubs=true weblogic.management.commo.WebLogicMBeanMaker
where the -DMDF
flag indicates that the WebLogic MBeanMaker should translate the MDF into code, xmlFile is the MDF (the XML MBean Description File) and filesdir is the location where the WebLogic MBeanMaker will place the intermediate files for the MBean type.
Whenever xmlfile is provided, a new set of output files is generated. If files already exist in the location specified by filesdir, you are informed that the existing files will be overwritten and are asked to confirm.
Each time you use the -DcreateStubs=true
flag, it overwrites any existing MBean implementation file.
Note: As of this version of WebLogic Server, you can also provide a directory that contains multiple MDF's by using the -DMDFDIR <MDF directory name>
option. In prior versions of WebLogic Server, the WebLogic MBeanMaker processed only one MDF at a time. Therefore, you had to repeat this process if you had multiple MDFs (in other words, multiple Authorization providers).
The MBean implementation file generated by the WebLogic MBeanMaker is named MBeanNameImpl.java
. For example, for the MDF named SampleAuthorizer
, the MBean implementation file to be edited is named SampleAuthorizerImpl.java
.
Accomplishing this task may include, but is not limited to: copying the method implementations from your existing MBean implementation file into the newly-generated MBean implementation file (or, alternatively, adding the new methods from the newly-generated MBean implementation file to your existing MBean implementation file), and verifying that any changes to method signatures are reflected in the version of the MBean implementation file that you are going to use (for methods that exist in both MBean implementation files).
The MBean interface file is the client-side API to the MBean that your runtime class or your MBean implementation will use to obtain configuration data. It is typically used in the initialize method as described in Understand the Purpose of the Provider SSPIs.
Because the WebLogic MBeanMaker generates MBean types from the MDF you created, the generated MBean interface file will have the name of the MDF, plus the text "MBean" appended to it. For example, the result of running the SampleAuthorizer
MDF through the WebLogic MBeanMaker will yield an MBean interface file called SampleAuthorizerMBean.java
.
Once your have run your MDF through the WebLogic MBeanMaker to generate your intermediate files, and you have edited the MBean implementation file to supply implementations for the appropriate methods within it, you need to package the MBean files and the runtime classes for the custom Authorization provider into an MBean JAR File (MJF). The WebLogic MBeanMaker also automates this process.
To create an MJF for your custom Authorization provider, follow these steps:
java -DMJF=
jarfile -Dfiles=
filesdir weblogic.management.commo.WebLogicMBeanMaker
where the -DMJF
flag indicates that the WebLogic MBeanMaker should build a JAR file containing the new MBean types, jarfile is the name for the MJF and filesdir is the location where the WebLogic MBeanMaker looks for the files to JAR into the MJF.
Compilation occurs at this point, so errors are possible. If jarfile is provided, and no errors occur, an MJF is created with the specified name.
Notes: When you create a JAR file for a custom security provider, a set of XML binding classes and a schema are also generated. You can choose a namespace to associate with that schema. Doing so avoids the possiblity that your custom classes will conflict with those provided by BEA. The default for the namespace is vendor. You can change this default by passing the -targetNameSpace
argument to the WebLogicMBeanMaker or the associated WLMBeanMaker ant task.
If you want to update an existing MJF, simply delete the MJF and regenerate it. The WebLogic MBeanMaker also has a -DIncludeSource
option, which controls whether source files are included into the resulting MJF. Source files include both the generated source and the MDF itself. The default is false
. This option is ignored when -DMJF
is not used.
The resulting MJF can be installed into your WebLogic Server environment, or distributed to your customers for installation into their WebLogic Server environments.
To install an MBean type into the WebLogic Server environment, copy the MJF into the WL_HOME\server\lib\mbeantypes
directory, where WL_HOME is the top-level installation directory for WebLogic Server. This "deploys" your custom Authorization provider—that is, it makes the custom Authorization provider manageable from the WebLogic Server Administration Console.
Note: WL_HOME\server\lib\mbeantypes
is the default directory for installing MBean types. (Beginning with 9.0, security providers can be loaded from ...\domaindir\lib\mbeantypes
as well.) However, if you want WebLogic Server to look for MBean types in additional directories, use the -Dweblogic.alternateTypesDirectory=
<dir> command-line flag when starting your server, where <dir> is a comma-separated list of directory names. When you use this flag, WebLogic Server will always load MBean types from WL_HOME\server\lib\mbeantypes
first, then will look in the additional directories and load all valid archives present in those directories (regardless of their extension). For example, if -Dweblogic.alternateTypesDirectory = dirX,dirY
, WebLogic Server will first load MBean types from WL_HOME\server\lib\mbeantypes
, then any valid archives present in dirX
and dirY
. If you instruct WebLogic Server to look in additional directories for MBean types and are using the Java Security Manager, you must also update the weblogic.policy
file to grant appropriate permissions for the MBean type (and thus, the custom security provider). For more information, see Using the Java Security Manager to Protect WebLogic Resources in Programming WebLogic Security.
You can create instances of the MBean type by configuring your custom Authorization provider (see Configure the Custom Authorization Provider Using the Administration Console), and then use those MBean instances from a GUI, from other Java code, or from APIs. For example, you can use the WebLogic Server Administration Console to get and set attributes and invoke operations, or you can develop other Java objects that instantiate MBeans and automatically respond to information that the MBeans supply. We recommend that you back up these MBean instances.
Configuring a custom Authorization provider means that you are adding the custom Authorization provider to your security realm, where it can be accessed by applications requiring authorization services.
Configuring custom security providers is an administrative task, but it is a task that may also be performed by developers of custom security providers. This section contains information that is important for the person configuring your custom Authorization providers:
Note: The steps for configuring a custom Authorization provider using the WebLogic Server Administration Console are described under Configuring WebLogic Security Providers in Securing WebLogic Server.
Some application components, such as Enterprise JavaBeans (EJBs) and Web applications, store relevant deployment information in Java 2 Enterprise Edition (J2EE) and WebLogic Server deployment descriptors. For Web applications, the deployment descriptor files (called web.xml
and weblogic.xml
) contain information for implementing the J2EE security model, including declarations of security policies. Typically, you will want to include this information when first configuring your Authorization providers in the WebLogic Server Administration Console.
Because the J2EE platform standardizes Web application and EJB security in deployment descriptors, WebLogic Server integrates this standard mechanism with its Security Service to give you a choice of techniques for securing Web application and EJB resources. You can use deployment descriptors exclusively, the Administration Console exclusively, or you can combine the techniques for certain situations.
Depending on the technique you choose, you also need to apply a Security Model. WebLogic supports different security models for individual deployments, and a security model for realm-wide configurations that incorporate the technique you want to use.
When configured to use deployment descriptors, WebLogic Server reads security policy information from the web.xml
and weblogic.xml
deployment descriptor files (examples of web.xml
and weblogic.xml
files are shown in Listing 6-3 and Listing 6-4). This information is then copied into the security provider database for the Authorization provider.
Listing 6-3 Sample web.xml File
<web-app>
<welcome-file-list>
<welcome-file>welcome.jsp</welcome-file>
</welcome-file-list>
<security-constraint>
<web-resource-collection>
<web-resource-name>Success</web-resource-name>
<url-pattern>/welcome.jsp</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>developers</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>default</realm-name>
</login-config>
<security-role>
<role-name>developers</role-name>
</security-role>
</web-app>
Listing 6-4 Sample weblogic.xml File
<weblogic-web-app>
<security-role-assignment>
<role-name>developers</role-name>
<principal-name>myGroup</principal-name>
</security-role-assignment>
</weblogic-web-app>
If you implemented the DeployableAuthorizationProviderV2
SSPI as part of developing your custom Authorization provider and want to support deployable security policies, the person configuring the custom Authorization provider (that is, you or an administrator) must be sure that the Policy Deployment Enabled check box in the WebLogic Server Administration Console is checked. Otherwise, deployment for the Authorization provider is considered "turned off." Therefore, if multiple Authorization providers are configured, the Policy Deployment Enabled check box can be used to control which Authorization provider is used for security policy deployment.
While configuring a custom Authorization provider via the WebLogic Server Administration Console makes it accessible by applications requiring authorization services, you also need to supply administrators with a way to manage this security provider's associated security policies. The WebLogic Authorization provider, for example, supplies administrators with a Policy Editor page that allows them to add, modify, or remove security policies for various WebLogic resources.
Neither the Policy Editor page nor access to it is available to administrators when you develop a custom Authorization provider. Therefore, you must provide your own mechanism for security policy management. This mechanism must read and write security policy data (that is, expressions) to and from the custom Authorization provider's database.
You can accomplish this task in one of three ways:
You would typically select this option if you want to develop a tool that is entirely separate from the WebLogic Server Administration Console.
For this option, you do not need to write any console extensions for your custom Authorization provider, nor do you need to develop any management MBeans. However, your tool needs to:
You would typically select this option if you have a tool that is separate from the WebLogic Server Administration Console, but you want to launch that tool from the Administration Console.
For this option, your tool needs to:
![]() ![]() |
![]() |
![]() |