All security attributes are carried in Credentials
object and Credentials
is used by LoginModules during authentication process. Accessing user supplied attributes from LoginModule
s is done by CallbackHandlers. To provide access to Credentials object, Hazelcast uses its own specialized CallbackHandler
. During initialization of LoginModules
Hazelcast will pass this special CallbackHandler
into LoginModule.initialize()
method.
LoginModule implementations should create an instance of com.hazelcast.security.CredentialsCallback
and call handle(Callback[] callbacks)
method of CallbackHandler
during login process.
CredentialsCallback.getCredentials()
will return the supplied Credentials
object.
public class CustomLoginModule implements LoginModule {
CallbackHandler callbackHandler;
Subject subject;
public void initialize( Subject subject, CallbackHandler callbackHandler,
Map<String, ?> sharedState, Map<String, ?> options ) {
this.subject = subject;
this.callbackHandler = callbackHandler;
}
public final boolean login() throws LoginException {
CredentialsCallback callback = new CredentialsCallback();
try {
callbackHandler.handle( new Callback[] { callback } );
credentials = cb.getCredentials();
} catch ( Exception e ) {
throw new LoginException( e.getMessage() );
}
...
}
...
}
To use default Hazelcast permission policy, an instance of com.hazelcast.security.ClusterPrincipal
that holding Credentials
object must be created and added to Subject.principals onLoginModule.commit()
as shown below.
public class MyCustomLoginModule implements LoginModule {
...
public boolean commit() throws LoginException {
...
Principal principal = new ClusterPrincipal( credentials );
subject.getPrincipals().add( principal );
return true;
}
...
}
Hazelcast also has an abstract implementation of LoginModule
that does callback and cleanup operations and holds resulting Credentials
instance. LoginModule
s extending ClusterLoginModule
can access Credentials
, Subject
, LoginModule
instances and options and sharedState
maps. Extending ClusterLoginModule
is recommended instead of implementing all required stuff.
package com.hazelcast.security;
...
public abstract class ClusterLoginModule implements LoginModule {
protected abstract boolean onLogin() throws LoginException;
protected abstract boolean onCommit() throws LoginException;
protected abstract boolean onAbort() throws LoginException;
protected abstract boolean onLogout() throws LoginException;
}
RELATED INFORMATION
Please refer to JAAS Reference Guide for further information.