Developing with programmatic APIs for EJB applications
Use this topic to programmatically secure your Enterprise JavaBeans (EJB) applications.
About this task
- IsCallerInRole(String rolename): Returns true if the bean caller is granted the security role that is specified by role name. If the caller is not granted the specified role, or if the caller is not authenticated, it returns false. If the specified role is granted Everyone access, it always returns true.
- getCallerPrincipal: Returns the java.security. Principal object that contains the bean caller name. If the caller is not authenticated, it returns a principal that contains an unauthorized name.
You can enable a login module to indicate which principal class is returned by these calls.
When the isCallerInRole method
is used, declare a security-role-ref element in the
deployment descriptor with a role-name that is subelement containing
the role name that is passed to this method. Because actual roles
are created during the assembly stage of the application, you can
use a logical role as the role name and provide enough hints to the
assembler in the description of the security-role-ref element to link
that role to an actual role. During assembly, the assembler creates
a role-link subelement to link the role-name to the actual role. Creation
of a security-role-ref element is possible if an assembly tool such
as Rational® Application Developer is used.
You also can create the security-role-ref element during the assembly
stage using an assembly tool.
Procedure
- Add the required security methods in the EJB module code.
- Create a
security-role-refelement with a role-name field for all the role names that are used in the isCallerInRole method.If asecurity-role-refelement is not created during development, make sure that it is created during the assembly stage.
Results
Example
Using Java EE security model capabilities to specify security policies declaratively is useful when an EJB application wants to access external resources and wants to control the access to these external resources using its own authorization table (external-resource to user mapping). In this case, use the getCallerPrincipal method to get the caller identity and then the application can consult its own authorization table to perform authorization. The caller identification also can help retrieve the corresponding user information from an external source, such as database or from another enterprise bean. You can use the isCallerInRole method in a similar way.
security-role-ref element:<security-role-ref>
<description>Provide hints to assembler for linking this role-name to
actual role here<\description>
<role-name>Mgr<\role-name>
</security-role-ref><security-role-ref>
<description>Hints provided by developer to map role-name to role-link</description>
<role-name>Mgr</role-name>
<role-link>Manager</role-link>
</security-role-ref>public class aSessionBean implements SessionBean {
.....
// SessionContext extends EJBContext. If it is entity bean use EntityContext
javax.ejb.SessionContext context;
// The following method will be called by the EJB container
// automatically
public void setSessionContext(javax.ejb.SessionContext ctx) {
context = ctx; // save the session bean's context
}
....
private void aBusinessMethod() {
....
// to get bean's caller using getCallerPrincipal()
java.security.Principal principal = context.getCallerPrincipal();
String callerId= principal.getName();
// to check if bean's caller is granted Mgr role
boolean isMgr = context.isCallerInRole("Mgr");
// use the preceding information in any way as needed by the
//application
....
}
....
}security-role-ref element
in the deployment
descriptor. @javax.annotation.security.DeclareRoles("Mgr")
@Stateless // annotation is used to indicate a session bean
public class aSessionBean implements MyBusinessInterface { //you don't have to extend sessionbean interface
.....
// SessionContext extends EJBContext. In EJB 3.0 use Resource annotation to inject context
@Resource
javax.ejb.SessionContext context; }
....
private void aBusinessMethod() {
....
// to get bean's caller using getCallerPrincipal()
java.security.Principal principal = context.getCallerPrincipal();
String callerId= principal.getName();
// to check if bean's caller is granted Mgr role
boolean isMgr = context.isCallerInRole("Mgr");
// use the preceding information in any way as needed by the
//application
....
}
....
}What to do next
security-role-ref elements.
See the information about securing web applications by using an assembly
tool.