WebSphere eXtreme Scale fornece vários terminais de segurança para permitir que você integre mecanismos customizados. No modelo de programação local, a principal função de segurança é a autorização e não possui suporte à autenticação. É necessário autenticar fora do WebSphere Application Server. Entretanto, são fornecidos plug-ins para obter e validar objetos Subject.
No modelo de programação local, o eXtreme Scale não fornece nenhum mecanismo de autenticação, mas conta com o ambiente, servidores de aplicativos ou aplicativos, para autenticação. Quando o eXtreme Scale é usado no WebSphere Application Server ou WebSphere Extended Deployment, os aplicativos podem usar o mecanismo de autenticação de segurança do WebSphere Application Server. Quando o eXtreme Scale está sendo executado em um ambiente J2SE (Java 2 Platform, Standard Edition, o aplicativo tem que gerenciar as autenticações com autenticação JAAS (Java Authentication and Authorization Service) ou outros mecanismos de autenticação. Para obter informações adicionais sobre como utilizar a autenticação JAAS, consulte o Guia de Referência do JAAS. O contrato entre um aplicativo e uma instância do ObjectGrid é o objeto javax.security.auth.Subject. Quando o cliente é autenticado pelo servidor de aplicativos ou pelo aplicativo, o aplicativo pode recuperar o objeto javax.security.auth.Subject autenticado e utilizar este objeto Subject para obter uma sessão da instância do ObjectGrid, chamando o método ObjectGrid.getSession(Subject). Este objeto Subject é utilizado para autorizar o acesso aos dados do mapa. Este contrato é chamado de mecanismo de transmissão de subject. O exemplo a seguir ilustra a API ObjectGrid.getSession(Subject).
/**
* This API allows the cache to use a specific subject rather than the one
* configured on the ObjectGrid to get a session.
* @param subject
* @return An instance of Session
* @throws ObjectGridException
* @throws TransactionCallbackException
* @throws InvalidSubjectException the subject passed in is not valid based
* on the SubjectValidation mechanism.
*/
public Session getSession(Subject subject)
throws ObjectGridException, TransactionCallbackException, InvalidSubjectException;
O método ObjectGrid.getSession() na interface ObjectGrid também pode ser utilizando para obter um objeto Session:
/**
* This method returns a Session object that can be used by a single thread at a time.
* You cannot share this Session object between threads without placing a
* critical section around it. While the core framework allows the object to move
* between threads, the TransactionCallback and Loader might prevent this usage,
* especially in J2EE environments. When security is enabled, this method uses the
* SubjectSource to get a Subject object.
*
* If the initialize method has not been invoked prior to the first
* getSession invocation, then an implicit initialization occurs. This
* initialization ensures that all of the configuration is complete before
* any runtime usage is required.
*
* @see #initialize()
* @return An instance of Session
* @throws ObjectGridException
* @throws TransactionCallbackException
* @throws IllegalStateException if this method is called after the
* destroy() method is called.
*/
public Session getSession()
throws ObjectGridException, TransactionCallbackException;
Conforme especifica a documentação da API, quando a segurança é ativada, este método utiliza
o plug-in SubjectSource para obter um objeto Subject. O plug-in SubjectSource é um dos plug-ins de segurança no eXtreme Scale para suportar a propagação de objetos Subject. Consulte Plug-ins Relacionados à Segurança para obter informações adicionais. O método getSession(Subject) pode ser chamado na instância do ObjectGrid local apenas. Se você chamar o
método getSession(Subject) em um lado do cliente em uma configuração distribuída
do eXtreme Scale, o resultado será um IllegalStateException.O WebSphere eXtreme Scale oferece dois plug-ins de segurança que estão relacionados ao mecanismo de transmissão de assunto: os plug-ins SubjectSource e SubjectValidation.
Plug-in SubjectSource
O plug-in SubjectSource, representado pela interface com.ibm.websphere.objectgrid.security.plugins.SubjectSource, é um plug-in usado para obter um objeto Subject de um ambiente de execução do eXtreme Scale. Este ambiente pode ser um aplicativo usando o ObjectGrid ou um servidor de aplicativos que hospeda o aplicativo. Considere o plug-in SubjectSource uma alternativa para o mecanismo de transmissão de subject. Utilizando o mecanismo de transmissão de subject, o aplicativo recupera o objeto Subject e utiliza-o para obter o objeto de sessão do ObjectGrid. Com o plug-in SubjectSource, o tempo de execução do eXtreme Scale recupera o objeto Subject e o utiliza para obter o objeto de sessão. O mecanismo de transmissão de subject fornece o controle de objetos Subject para aplicativos, enquanto o mecanismo do plug-in SubjectSource libera aplicativos de recuperar o objeto Subject. É possível utilizar o plug-in SubjectSource para obter um objeto Subject que representa um cliente do eXtreme Scale que é utilizado para autorização. Quando o método ObjectGrid.getSession é chamado, o Subject getSubject emite uma ObjectGridSecurityException se a segurança estiver ativada. O WebSphere eXtreme Scale oferece uma implementação padrão deste plug-in: com.ibm.websphere.objectgrid.security.plugins.builtins.WSSubjectSourceImpl. Esta implementação pode ser usada para recuperar um assunto do responsável pela chamada ou um assunto RunAs do encadeamento quando um aplicativo está em execução no WebSphere Application Server. É possível configurar esta classe no arquivo XML descritor do ObjectGrid como a classe de implementação SubjectSource ao usar o eXtreme Scale no WebSphere Application Server. O trecho de código a seguir mostra o fluxo principal do método WSSubjectSourceImpl.getSubject.
Subject s = null;
try {
if (finalType == RUN_AS_SUBJECT) {
// obter o subject RunAs
s = com.ibm.websphere.security.auth.WSSubject.getRunAsSubject();
}
else if (finalType == CALLER_SUBJECT) {
// obter o callersubject
s = com.ibm.websphere.security.auth.WSSubject.getCallerSubject();
}
}
catch (WSSecurityException wse) {
throw new ObjectGridSecurityException(wse);
}
return s;
Para obter outros detalhes, consulte a documentação da API para o plug-in SubjectSource e a implementação do WSSubjectSourceImpl.Plug-in SubjectValidation
O plug-in SubjectValidation, que é representado pela interface com.ibm.websphere.objectgrid.security.plugins.SubjectValidation, é outro plug-in de segurança. O plug-in SubjectValidation pode ser utilizado para validar que um javax.security.auth.Subject, quer transmitido para o ObjectGrid quer recuperado pelo plug-in SubjectSource, é um Subject válido desde que não violado.
O método SubjectValidation.validateSubject(Subject) na interface SubjectValidation obtém um objeto Subject e retorna um objeto Subject. Tudo está definido nas suas implementações: se o objeto Subject é ou não válido e qual objeto Subject será retornado. Se o objeto Subject não for válido, o resultado será um InvalidSubjectException.
É possível utilizar esse plug-in se não confiar no objeto Subject transmitido para esse método. Isso dificilmente ocorrerá, desde que você confie nos desenvolvedores que redigiram o código do aplicativo para recuperar o objeto Subject.
Uma implementação deste plug-in precisa de suporte do criador do objeto Subject, porque apenas o criador sabe se o objeto Subject foi violado. No entanto, alguns criadores de subjects podem não saber se o Subject foi violado. Neste caso, este plug-in não é útil.
O WebSphere eXtreme Scale oferece uma implementação padrão de SubjectValidation: com.ibm.websphere.objectgrid.security.plugins.builtins.WSSubjectValidationImpl. É possível usar esta implementação para validar o assunto autenticado pelo WebSphere Application Server. Você pode configurar esta classe com a classe de implementação SubjectValidation ao usar o eXtreme Scale no WebSphere Application Server. A implementação do WSSubjectValidationImpl levará em consideração um objeto Subject válido apenas se o token da credencial associado a tal Subject não estiver violado. Você pode alterar outras partes do objeto Subject. A implementação WSSubjectValidationImpl solicita ao WebSphere Application Server o Subject original correspondendo ao token de credencial e retorna o Subject original como o objeto Subject validado. Portanto, as alterações feitas no conteúdo do Subject diferentes do token de credencial não têm nenhum efeito. O trecho de código a seguir mostra o fluxo básico do WSSubjectValidationImpl.validateSubject(Subject).
// Create a LoginContext with scheme WSLogin and
// pass a Callback handler.
LoginContext lc = new LoginContext("WSLogin",
new WSCredTokenCallbackHandlerImpl(subject));
// When this method is called, the callback handler methods
// will be called to log the user in.
lc.login();
// Get the subject from the LoginContext
return lc.getSubject();
O trecho de código anterior cria um objeto de manipulador de retorno de chamada do token de credencial, WSCredTokenCallbackHandlerImpl, com o objeto Subject a ser validado. Em seguida, um objeto LoginContext é criado com o esquema de login WSLogin. Quando o método lc.login é chamado, a segurança WebSphere Application Server recupera o token de credencial do objeto Subject e, em seguida, retorna o Subject correspondente como o objeto Subject validado.Para obter outros detalhes, consulte as APIs Java da implementação SubjectValidation e WSSubjectValidationImpl.
Configuração do Plug-in
Você pode configurar os plug-ins SubjectValidation e SubjectSource de dois modos:
<objectGrids>
<objectGrid name="secureClusterObjectGrid" securityEnabled="true"
authorizationMechanism="AUTHORIZATION_MECHANISM_JAAS">
<bean id="SubjectSource"
className="com.ibm.websphere.objectgrid.security.plugins.builtins.
WSSubjectSourceImpl" />
<bean id="SubjectValidation"
className="com.ibm.websphere.objectgrid.security.plugins.builtins.
WSSubjectValidationImpl" />
<bean id="TransactionCallback"
className="com.ibm.websphere.samples.objectgrid.
HeapTransactionCallback" />
...
</objectGrids>
**
* Set the SubjectValidation plug-in for this ObjectGrid instance. A
* SubjectValidation plug-in can be used to validate the Subject object
* passed in as a valid Subject. Refer to {@link SubjectValidation}
* for more details.
* @param subjectValidation the SubjectValidation plug-in
*/
void setSubjectValidation(SubjectValidation subjectValidation);
/**
* Set the SubjectSource plug-in. A SubjectSource plug-in can be used
* to get a Subject object from the environment to represent the
* ObjectGrid client.
*
* @param source the SubjectSource plug-in
*/
void setSubjectSource(SubjectSource source);
Você pode escrever seu próprio código de autenticação JAAS (Java Authentication and Authorization Service) para manipular a autenticação. É necessário gravar seus próprios módulos de login e, em seguida, configurá-los para seu módulo de autenticação.
O módulo de login recebe informações sobre um usuário e autentica o usuário. Estas informações podem ser tudo o que pode identificar o usuário. Por exemplo, as informações podem ser um ID de usuário e senha, certificado do cliente, e assim por diante. Depois de receber tais informações, o módulo de login verifica se elas representam um Subject válido e cria o objeto Subject. No momento, várias implementações de módulos de login estão disponíveis para o público.
FileLogin
{
com.acme.auth.FileLoginModule required
};
O esquema de autenticação é FileLogin e o módulo de login é com.acme.auth.FileLoginModule. O token requerido indica que o módulo FileLoginModule deve validar tal login ou todo o esquema falhará.
A configuração do arquivo de configuração do módulo de login JAAS pode ser feita de um dos seguintes modos:
login.config.url.1=file:${java.home}/lib/security/file.login
Se o seu código estiver em execução no WebSphere Application Server, configure o login do JAAS no console administrativo e armazene esta configuração de login na configuração do servidor de aplicativos. Consulte a configuração de login para Java Authentication and Authorization Service para obter detalhes.