Programação de Autorização de Cliente

O WebSphere eXtreme Scale suporta a autorização Java Authentication and Authorization Service (JAAS) que está pronta para uso e também suporta a autorização customizada usando a interface ObjectGridAuthorization.

O plug-in ObjectGridAuthorization é usado para autorizar acessos do ObjectGrid, do ObjectMap e do JavaMap aos Principals representados por um objeto Subject de uma maneira customizada. Uma implementação típica deste plug-in é recuperar os Principals do objeto Subject e, em seguida, verificar se as permissões especificadas foram concedidas aos Principals.

Uma permissão passada para o método checkPermission(Subject, Permission) pode ser uma das seguintes permissões:

Consulte a documentação da API do ObjectGridAuthorization para obter detalhes adicionais.

MapPermission

A classe pública com.ibm.websphere.objectgrid.security.MapPermission representa permissões para os recursos ObjectGrid, especificamente os métodos de interfaces theObjectMap ou JavaMap. O WebSphere eXtreme Scale define as seguintes cadeias de permissões para acesso aos métodos de ObjectMap e JavaMap:

Consulte a documentação da API da ServerMapPermission para obter mais detalhes.

É possível construir um objeto MapPermission transmitindo o nome completo do mapa do ObjectGrid (no formato [ObjectGrid_name].[ObjectMap_name]) e a cadeia de permissão ou valor inteiro. Uma cadeia de permissão pode ser uma cadeia delimitada por vírgulas das cadeias de permissão anteriores, tais como read, insert, ou podem ser todas. Um valor de número inteiro de permissão pode ser qualquer constante de número inteiro mencionada anteriormente ou um valor matemático de diversas constantes de permissão de número inteiro, tal como MapPermission.READ|MapPermission.WRITE.

A autorização ocorre quando um método ObjectMap ou JavaMap é chamado. O tempo de execução verifica diferentes permissões para métodos diferentes. Se as permissões requeridas não forem concedidas ao cliente, isso resultará em um AccessControlException.

Tabela 1. Lista de Métodos e a MapPermission Necessária
Permissão ObjectMap/JavaMap
read Boolean containsKey(Object)
Boolean equals(Object)
Object get(Object)
Object get(Object, Serializable)
List getAll(List)
List getAll(List keyList, Serializable)
List getAllForUpdate(List)
List getAllForUpdate(List, Serializable)
Object getForUpdate(Object)
Object getForUpdate(Object, Serializable)
public Object getNextKey(long)
write Object put(Object key, Object value)
void put(Object, Object, Serializable)
void putAll(Map)
void putAll(Map, Serializable)
void update(Object, Object)
void update(Object, Object, Serializable)
insert public void insert (Object, Object)
void insert(Object, Object, Serializable)
remove Object remove (Object)
void removeAll(Collection)
void clear()
invalidate public void invalidate (Object, Boolean)
void invalidateAll(Collection, Boolean)
void invalidateUsingKeyword(Serializable)
int setTimeToLive(int)

A autorização é baseada exclusivamente em qual método é utilizado, ao invés do que o método realmente faz. Por exemplo, um método put pode inserir ou atualizar um registro, dependendo de existir ou não o registro. Entretanto, os casos de inserir ou atualizar não estão discriminados.

Um tipo de operação pode ser obtido por combinações de outros tipos. Por exemplo, uma atualização pode ser obtida por uma remoção e, em seguida, por uma inserção. Considere essas combinações quando projetar suas políticas de autorização.

ObjectGridPermission

Uma com.ibm.websphere.objectgrid.security.ObjectGridPermission representa permissões para o ObjectGrid:
  • Query: permissão para criar uma consulta de objeto ou consulta de entidade. A constante de número inteiro é definida como ObjectGridPermission.QUERY.
  • Dynamic map: permissão para criar um mapa dinâmico baseado no modelo de mapa. A constante de número inteiro é definida como ObjectGridPermission.DYNAMIC_MAP.
Consulte a documentação da API do ObjectGridAuthorization para obter mais detalhes.

A tabela a seguir resume os métodos e ObjectGridPermission necessários:

Tabela 2. Lista de Métodos e a ObjectGridPermission Necessária
Ação da permissão Métodos
consulta com.ibm.websphere.objectgrid.Session.createObjectQuery(String)
consulta com.ibm.websphere.objectgrid.em.EntityManager.createQuery(String)
dynamicmap com.ibm.websphere.objectgrid.Session.getMap(String)

ServerMapPermission

Uma ServerMapPermission representa permissões para um ObjectMap hospedado em um servidor. O nome da permissão é o nome completo do nome do mapa do ObjectGrid. Executar as seguintes ações:

Consulte a documentação da API da ServerMapPermission para obter mais detalhes. Os métodos detalhados, que requerem ServerMapPermission diferente, estão relacionados na seguinte tabela:
Tabela 3. Permissões para um ObjectMap Hospedado por Servidor
Ação da permissão Métodos
replicate com.ibm.websphere.objectgrid.ClientReplicableMap.enableClientReplication(Mode, int[], ReplicationMapListener)
dynamicIndex com.ibm.websphere.objectgrid.BackingMap.createDynamicIndex(String, Boolean, String, DynamicIndexCallback)
dynamicIndex com.ibm.websphere.objectgrid.BackingMap.removeDynamicIndex(String)

AgentPermission

Uma AgentPermission representa as permissões para os agentes datagrid. O nome da permissão é o nome completo do mapa ObjectGrid, e a ação é uma cadeia limitada por vírgulas de nomes de classe de implementação do agente ou de nomes do pacote.

Consulte a documentação da API AgentPermission para obter informações adicionais.

Os métodos a seguir na classe com.ibm.websphere.objectgrid.datagrid.AgentManager exigem AgentPermission.
com.ibm.websphere.objectgrid.datagrid.AgentManager#callMapAgent(MapGridAgent, Collection)
com.ibm.websphere.objectgrid.datagrid.AgentManager#callMapAgent(MapGridAgent)
com.ibm.websphere.objectgrid.datagrid.AgentManager#callReduceAgent(ReduceGridAgent, Collection)
com.ibm.websphere.objectgrid.datagrid.AgentManager#callReduceAgent(ReduceGridAgent, Collection)

Mecanismos de Autorização

O WebSphere eXtreme Scale suporta dois tipos de mecanismos de autorização: Autorização JAAS (Java Authentication and Authorization Service) e autorização customizada. Esses mecanismos aplicam-se a todas as autorizações. A autorização JAAS muda as políticas de segurança Java com controles de acesso centrados no usuário. As permissões podem ser concedidas com base não apenas em qual código está a execução, mas também em quem a está executando. Autorização JAAS é parte do SDK Versão 5 e posterior.

Além disso, o WebSphere eXtreme Scale também suporta a autorização customizada com o seguinte plug-in:

É possível implementar seu próprio mecanismo de autorização, se não desejar utilizar a autorização JAAS. Usando um mecanismo de autorização customizado é possível usar o banco de dados de políticas, servidor de políticas ou Tivoli Access Manager para gerenciar as autorizações.

É possível configurar o mecanismo de autorização de duas maneiras:

Autorização JAAS

Um objeto javax.security.auth.Subject representa um usuário autenticado. Um Subject consiste em um conjunto de principals e cada Principal representa uma identidade para esse usuário. Por exemplo, um Subject pode ter um nome principal, por exemplo, Joe Smith, e um grupo principal, por exemplo, gerente.

Utilizando a política de autorização JAAS, as permissões podem ser concedidas a Principals específicos. O WebSphere eXtreme Scale associa o Subject ao contexto de controle de acesso atual. Para cada chamada para o método ObjectMap ou Javamap, o tempo de execução do Java automaticamente determina se a política concede a permissão necessária somente a um Principal específico e se for, a operação será permitida somente se o Subject associado ao contexto do controle de acesso contiver o Principal designado.

É necessário estar familiarizado com a sintaxe de política do arquivo de políticas. Para obter uma descrição detalhada da autorização do JAAS, consulte o Guia de Referência do JAAS.

O WebSphere eXtreme Scale possui uma base de código especial que é usada para verificação da autorização JAAS para as chamadas de método ObjectMap e JavaMap. Esta base de código especial é http://www.ibm.com/com/ibm/ws/objectgrid/security/PrivilegedAction. Utilize esta base de código ao conceder as permissões ObjectMap ou JavaMap a proprietários. Este código especial foi criado porque o arquivo JAR (Java Archive) para eXtreme Scale é concedido com todas as permissões.

O modelo da política para conceder a permissão MapPermission é:

grant codeBase "http://www.ibm.com/com/ibm/ws/objectgrid/security/PrivilegedAction" 
   <Principal field(s)>{
    permission com.ibm.websphere.objectgrid.security.MapPermission 
               "[ObjectGrid_name].[ObjectMap_name]", "action";
    ....
    permission com.ibm.websphere.objectgrid.security.MapPermission 
               "[ObjectGrid_name].[ObjectMap_name]", "action";
  };
Um campo de Principal é semelhante ao seguinte exemplo:
principal
Principal_class "principal_name"

Nesta política, somente as permissões de inserção e leitura são concedidas a esses quatro mapas para um determinado principal. O outro arquivo de políticas, fullAccessAuth.policy, concede todas as permissões para estes mapas a um principal. Antes de executar o aplicativo, altere o principal_name e a classe do proprietário para os valores apropriados. O valor de principal_name depende do registro do usuário. Por exemplo, se o S.O. local for usado como registro do usuário, o nome da máquina será MACH1, o ID do usuário será user1 e o principal_name será MACH1/user1.

A política de autorização JAAS pode ser colocada diretamente no arquivo de políticas Java, ou pode ser colocada em um arquivo de autorização JAAS separado e, em seguida, configurado usando

Autorização de ObjectGrid Customizada

O plug-in ObjectGridAuthorization é usado para autorizar acessos ObjectGrid, ObjectMap e JavaMap para Principals representados por um objeto Subject de modo customizado. Uma implementação típica desse plug-in é recuperar os Principals do objeto Subject, e então verificar se as permissões especificadas estão concedidas ou não aos Principals.

Uma permissão passada para o método checkPermission(Subject, Permission) poderia ser uma das seguintes:

Consulte a documentação da API do ObjectGridAuthorization para obter mais detalhes.

O plug-in ObjectGridAuthorization pode ser configurado da seguinte forma:

Implementação de ObjectGridAuthorization

O método Boolean checkPermission(Subject subject, Permission permission) da interface ObjectGridAuthorization é chamado pelo tempo de execução do WebSphere eXtreme Scale para verificar se o objeto subject transmitido possui a permissão de passagem. A implementação da interface ObjectGridAuthorization retorna true se o objeto possui a permissão e false se não possui.

Uma implementação típica deste plug-in é recuperar os proprietários do objeto Subject e verificar se as permissões especificadas serão concedidas aos proprietários consultando políticas específicas. Estas políticas são definidas por usuários. Por exemplo, as políticas podem ser definidas em um banco de dados, um arquivo simples ou em um servidor de políticas Tivoli Access Manager.

Por exemplo, podemos usar o servidor de políticas Tivoli Access Manager para gerenciar a política de autorização e usar sua API para autorizar o acesso. Para saber como usar as APIs do Tivoli Access Manager Authorization, consulte o IBM® Tivoli Access Manager Authorization Java Classes Developer Reference para obter detalhes adicionais.

Esta implementação da amostra faz as seguintes suposições:

O fragmento de código a seguir demonstra como implementar o método checkPermission:

/**
* @see com.ibm.websphere.objectgrid.security.plugins.
* MapAuthorization#checkPermission
* (javax.security.auth.Subject, com.ibm.websphere.objectgrid.security.
* MapPermission)
*/
public boolean checkPermission(final Subject subject, 
	Permission p) {
  
  // For non-MapPermission, we always authorize.
  if (!(p instanceof MapPermission)){
    return true;
  }

  MapPermission permission = (MapPermission) p;

  String[] str = permission.getParsedNames();
  
  StringBuffer pdPermissionStr = new StringBuffer(5); 
  for (int i=0; i<str.length; i++) {
    pdPermissionStr.append(str[i].substring(0,1));
  }
  
  PDPermission pdPerm = new PDPermission(permission.getName(), 
		pdPermissionStr.toString());
  
  Set principals = subject.getPrincipals();
  
  Iterator iter= principals.iterator(); 
  while(iter.hasNext()) {
    try {
      PDPrincipal principal = (PDPrincipal) iter.next();
      if (principal.implies(pdPerm)) {
        return true;
      }
    }
    catch (ClassCastException cce) {
      // Handle exception
    }
  }
  return false;
}