Sobre a Estrutura de Conexão Única

A estrutura do Build Forge® SSO fornece o recurso de integrar com muitas soluções SSO no mercado. A estrutura SSO é baseada em interceptor, o que significa que ela intercepta um pedido HTTP e fornece métodos para manipulá-lo. Você pode gravar interceptores customizados para receber e validar artefatos de segurança no pedido HTTP. Especialmente, o interceptor pode definir tokens na resposta HTTP e, em seguida, procurar esses tokens em um pedido sucessivo.

As duas soluções SSO são fornecidas com o Build Forge®:

Métodos de Estrutura SSO

Um interceptor SSO é uma classe Java que implementa uma interface usada pela estrutura do Build Forge® SSO:
com.buildforge.services.server.sso.ISSOInterceptor
Ele está localizado no componente da camada de serviços:
<bfinstall>/Apache/tomcat/webapps/jas/WEB-INF/eclipse/plugins/com.ibm.jas-1.0.jar

A interface fornece os seguintes métodos.

initInterceptor
Chamado quando o interceptor é carregado. Um mapa de propriedades de configuração é transmitido ao método initInterceptor(). As propriedades de configuração são criadas no console do Build Forge em Administração > Segurança > SSO.
isTargetInterceptor
Revisa os atributos no pedido de entrada para determinar se esse interceptor precisa agir com base neles. Se precisar, o interceptor será responsável por autenticar o pedido com o método authenticateRequest(). Caso contrário, esse interceptor será ignorado. A seleção do interceptor presume que diversos interceptores estejam configurados e em execução. Eles são endereçados na ordem.
authenticateRequest
Autentica o pedido usando os dados do pedido. Usa um atributo de resposta para enviar dados novamente ao cliente.
logoutRequest
Limpa qualquer informação de segurança relacionada ao usuário depois que o pedido é tratado.

Configurações e Ordem de Interceptores

As configurações de interceptores são definidas em Administração > Segurança > SSO. As configurações a seguir são enviadas com o Build Forge®:

Após implementar uma classe de interceptor e posicioná-la no servidor de aplicativos do Build Forge® Apache Tomcat, configure uma nova configuração SSO aqui. A classe é uma propriedade da configuração SSO.

A ordem dessa lista determina a ordem na qual os interceptores são consultados para tratar as solicitações. É possível configurar vários interceptores para tratar pedidos. Durante um login, cada interceptor é consultado na ordem. O interceptor que trata o pedido é o primeiro interceptor ativo cujos atributos são apropriados para os atributos do pedido. Somente um interceptor trata o pedido. É sempre o primeiro que responde verdadeiro para isTargetInterceptor.

Nota: Para fornecer um fallback em caso de erro, deixe o interceptor Form SSO ativo. Coloque interceptores customizados na lista antes dele.

Incluindo um Interceptor de SSO Customizado

Para criar um interceptor customizado no Build Forge®, conclua as etapas a seguir:

  1. Crie uma classe Java customizada.

    A classe deve implementar a interface ISSOInterceptor.

  2. Implemente a classe customizada no arquivo WAR do componente da camada de serviços.
    1. Crie um arquivo JAR contendo a classe do interceptor de SSO customizado compilado.
    2. Mescle o arquivo JAR no arquivo JAR da camada de serviços do Build Forge® no local a seguir:<bfinstall>/server/tomcat/work/Catalina/localhost/jas/eclipse/plugins/com.ibm.jas-xxx.jar.
    3. Reinicie o Build Forge®.
  3. Defina um ambiente. Este ambiente pode ser passado para o método initInterceptor() como um objeto de propriedades.
    1. No Console de Gerenciamento, vá para Ambientes.
    2. Clique em Incluir Ambiente.
    3. Defina todas as propriedades necessárias pelo interceptor de SSO para inicializar.
  4. Inclua o interceptor SSO em Build Forge®:
    1. No Console de Gerenciamento, acesse Administração > Segurança > SSO.
    2. Clique em Incluir Configuração SSO e insira as propriedades:
      • Nome - digite um nome para a configuração SSO.
      • Ativo - configurado como Sim. Todas as configurações ativas são acessadas durante um pedido de autenticação. Elas são acessadas na ordem em que aparecem neste painel.
      • Classe Java - digite o nome do pacote completo da classe. Uma determinada classe pode ser designada a apenas um interceptor de SSO.
      • Ambiente - se tiver definido um ambiente para usar com este interceptor SSO, selecione-o.
    3. Clique em Salvar.
    Seu interceptor de SSO agora aparece na lista.
  5. Ordene as configurações de SSO clicando no ícone à esquerda de seu Interceptor SSO e selecione Mover para Cima.

    Durante uma solicitação, configurações SSO ativas são acessadas na ordem em que aparecem neste painel. Como ele está ativo por padrão e sempre retorna true quando acessado, sua configuração deve ser colocada antes da configuração do Form SSO. A configuração SPNEGO SSO é inativa por padrão.

Exemplo de Implementação authenticateRequest

O exemplo a seguir é tomado do interceptor SSO WebSphere, que é usado para integrar a segurança do WebSphere Application Server com o Build Forge®.

O interceptor usa o reflexo para encontrar a classe WSSubject do WebSphere. A classe tem um método getCallerPrincipal para retornar o proprietário usado para efetuar login no AuthServlet. O AuthServlet precisa ser protegido antes de o WebSphere Application Server poder autenticá-lo.

Outros métodos estão disponíveis que podem retornar ainda mais informações. Estão disponíveis métodos semelhantes para funcionar com qualquer servidor de aplicativo.

public Result authenticateRequest 
      (Request requestAttributes, Response responseAttributes) 
       throws SSOException {

  Result result = null;

try {
  Class<?> cl = 
    Class.forName(“com.ibm.websphere.security.auth.WSSubject”);
      Method theMethod = cl.getMethod("getCallerPrincipal", 
        (Class[])null);
    String principal = (String)theMethod.invoke((Object[])null, 
          (Object[])null);

if (principal != null 
      && principal.length() > 0 
      && !principal.equals("UNAUTHENTICATED")) {
  result = new Result(Result.UseridOnlyOID, domain, principal);
	responseAttributes.setStatus(HttpServletResponse.SC_OK);	
} catch (Exception e) {
		throw new SSOException(e);
}

return result;
}

Durante a implementação de authenticateRequest, você deve definir um status de resposta antes de retornar:

Há valores de status adicionais que podem ser usados. Consulte o JavaDoc para obter HttpServletResponse.

Recuperação de um Erro de Login

Se o interceptor customizado não funcionar corretamente quando testado, muito provavelmente o problema será de autenticação. Uma página de erro é exibida com as informações a seguir:

Erro no BuildForge

     Acesso negado ao console do Build Forge

     "Erro ao autenticar:
     com.buildforge.services.common.api.APIException - API:
     Erro de Autenticação."

     Clique aqui para tentar o mesmo tipo de login novamente
     ou clique aqui para forçar um login por formulário (ID do usuário/senha).

Você tem duas opções de recuperação:

Listagem de Origem de Método

Os seguintes comentários e listagens de origem fornecem mais informações sobre os métodos na interface ISSOInterceptor.

initInterceptor
	/**
	 * This method is called when the interceptor is loaded.  A map of the 
     configuration properties is passed into the init method.  You can create 
     the configuration properties from a BuildForge Environment and associate 
     it with the SSO configuration.
	 *
	 * @param initializationProps used to configure the implementation
	 * @return true if successful, false if an error should be reported.
	 * @throws SSOException if the initialization fails
	 **/
	public boolean initInterceptor (Properties initializationProps) throws SSOException; 
isTargetInterceptor

	/**
	 * This methods will review the attributes in the requestAttributes Map 
     to determine if there is something that this interceptor should 
     act on.  If the interceptor return is "true", then the interceptor will 
     be responsible for authenticating the request and the authenticateRequest 
     method is invoked. If the interceptor return is "false", then this 
     interceptor is skipped and the next isTargetInterceptor in the list will 
     be called. Ordering of the interceptors during the configuration will 
     return which interceptor has the first shot at authenticating a request.
	 *
	 * @param requestAttributes attributes found in the inbound request	 
   * @return true if this interceptor will authenticate the request, 
             false if it will not.
	 * @throws SSOException
	 *
	 **/
	public boolean isTargetInterceptor(Request requestAttributes) throws SSOException;
	authenticateRequest

  /**
	 * This method is called on an interceptor that returns true for the 
     isTargetInterceptor method. The Request will contain data used 
     to perform the authentication.  The Response is for the interceptor 
     to send information back to the client.  The Result returned will contain 
     the following information if the status code is 200:
	 * 
	 * OID: an object identifier of the SecurityContext that can process token 
     information stored in this map when going to an Agent.
	 * Domain: a valid BF domain name or <default> if not known 
     (the username must be valid in the configured realm).
	 * Username:  a valid BF username.   This will be used to lookup BFUser attributes 
     that are used in checking authorization policy.
	 * @see com.buildforge.services.common.security.context.Result
	 * 
	 * @param requestAttributes attributes found in the inbound request
	 * @param responseAttributes sent back in the outbound response
	 * @return com.buildforge.services.common.security.context.Result - result 
          information that tells BF how to handle the authentication request.
	 * @throws com.buildforge.services.server.sso.SSOException
	 **/
	public Result authenticateRequest(
			Request requestAttributes, 
			Response responseAttributes)
		throws SSOException;
	logoutRequest

  /**
	 * This method is called to logout a request. The first interceptor that 
     returns true for the isTargetInterceptor method will perform the logout.   
     The main point is to clean up any user-related security information that 
     should not be kept.  The interceptor can inspect the request and response 
     objects to determine what needs to be removed.
	 * 
	 * @param requestAttributes attributes found in the inbound request
	 * @param responseAttributes sent back in the outbound response
	 * @return boolean - true if request redirect to exit page, 
                       false if redirect to login page.
	 * @throws com.buildforge.services.server.sso.SSOException
	 **/
	public boolean logoutRequest(
			Request requestAttributes, 
			Response responseAttributes)
		throws SSOException;

Feedback