Impedir acesso não autorizado a dados

Objectives

After completing this lesson, you will be able to:
  • Criar campos de autorização e objetos de autorização.
  • Implementar controles de acesso CDS

Objetos de autorização e campos de autorização

Ao desenvolver um modelo de dados, você também deve pensar em como proteger os dados contra acesso não autorizado. Anteriormente, nesta jornada de aprendizagem, você aprendeu que os objetos de autorização formam a base para o controle de autorização específico do usuário, baseado em funções. Para proteger seus dados contra acesso de escrita não autorizado, as verificações de autorização são implementadas na codificação ABAP utilizando a palavra-chave AUTHORITY-CHECK. Para evitar acesso de leitura não autorizado, o uso de controles de acesso CDS deve ser a primeira escolha.

Um objeto de autorização agrupa até dez campos de autorização que estão relacionados e devem ser verificados em conjunto. Os campos de autorização são objetos de desenvolvimento separados. O mesmo campo de autorização pode ser referenciado por mais de um objeto de autorização.

Os campos de autorização são tipificados com elementos de dados. Os elementos de dados, ou os domínios que utilizam, fornecem normalmente a conexão entre os campos de autorização e os dados que protegem.

Se o seu modelo de dados necessita de seus próprios objetos de autorização ou se você usa objetos de autorização existentes, depende fortemente de quão independente seu modelo de dados é dos dados existentes.

Se seus dados estiverem conectados a modelos de dados existentes, vale sempre a pena procurar objetos de autorização existentes.

Dica

Inicie a pesquisa usando a lista de utilizações para os elementos de dados que você usa nas suas tabelas de banco de dados para ver se existem campos de autorização relacionados.

Normalmente, antes de criar um novo objeto de autorização, você cria primeiro um ou mais campos de autorização novos.

O nome do campo de autorização está limitado a 10 caracteres.

Considere que você deve indicar um elemento de dados existente desde o início. Neste exemplo, o campo de autorização Z00DEPMENT é criado utilizando o elemento de dados Z00_DEPARTMENT_ID.

No diálogo de atualização para o campo de autorização, recomenda-se que você indique uma Tabela de verificação. A tabela de verificação é uma tabela de banco de dados que contém os valores permitidos para o campo de autorização. Dependendo do seu modelo de dados, esta será uma tabela do customizing ou uma tabela com dados mestre. No exemplo, usamos a tabela de dados mestre para departamentos.

Para um campo de autorização recém-criado, um aviso no cabeçalho ou na visão de problemas informa que o campo de autorização ainda não foi usado. Links em O que vem a seguir? A seção serve como solução rápida para este aviso. Aqui, você pode adicionar o campo de autorização a um objeto de autorização existente ou criar um novo objeto de autorização para o mesmo.

Quando você cria um novo objeto de autorização, deve fornecer um nome e uma descrição como habitualmente. Este nome também está limitado a 10 caracteres.

Nota

A classe de objeto define grupos de objetos de autorização. Se você pode ou não atribuir uma classe de objeto, depende da plataforma na qual você desenvolve. No SAP BTP, ambiente ABAP, só existe atualmente uma classe de objeto (CPAE) para todos os objetos de autorização.

Qualquer novo objeto de autorização contém o campo de autorização ACTVT por padrão. Este campo é utilizado para distinguir entre várias operações de dados com valores padronizados.

Por padrão, o objeto de autorização considera as atividades Criar (valor "01"), Ler (valor "03", Atualizar (valor "02") e Eliminar (valor "06"). Você pode remover atividades de que não precisa e adicionar mais de um grande pool de atividades disponíveis. Posicione o cursor no campo de entrada e pressione Ctrl + espaço para exibir a lista de atividades disponíveis.

Nota

Em situações raras, você pode até mesmo remover completamente o campo de autorização ACVT. Isso só deve ser efetuado se a verificação de autorização for independente da operação executada.

Para adicionar mais campos de autorização, posicione o cursor no campo de entrada e pressione Ctrl + espaço para exibir a lista de campos de autorização disponíveis.

Dica

Não é necessário ativar campos de autorização nem objetos de autorização. É suficiente salvá-los.

Como criar um objeto de autorização

Assista ao vídeo para ver como criar um objeto de autorização.

Controle de acesso CDS do objeto do repositório

Anteriormente, nesta jornada de aprendizagem, você aprendeu que os controles de acesso CDS são utilizados para filtrar conjuntos de dados com base em autorizações. Vamos recapitular o princípio básico:

Um objeto do repositório do tipo Controle de acesso CDS define uma função CDS utilizando a palavra-chave DEFINE ROLE. Dentro da função, a palavra-chave GRANT SELECT ON relaciona a função CDS a uma entidade CDS - por exemplo, uma visão CDS e, após a palavra-chave WHERE, define uma ou mais condições de acesso. Sempre que o código ABAP acessa a entidade CDS, a interface do banco de dados filtra o resultado da seleção de acordo com essas condições de acesso.

Os controles de acesso CDS só têm efeito quando a entidade CDS é acessada diretamente a partir da codificação ABAP. Eles são ignorados se a entidade CDS for acessada indiretamente, por exemplo, mediante outra entidade CDS.

Vejamos este exemplo: o controle de acesso CDS R_EMPLOYEE contém a definição da função CDS R_Employee. Ele restringe o acesso à entidade da visão CDS, R_Employee, com uma condição de acesso baseada em autorizações do usuário (condição PFCG).

Condições de acesso

Os controles de acesso CDS suportam vários tipos de condições de acesso. As condições de acesso mais importantes são as seguintes:

Condições literais

Uma condição literal - também conhecida como condição simples - compara um elemento de uma entidade CDS com um valor fixo. As condições literais são a forma mais simples de condições de acesso. Eles não dependem do usuário atual. Como resultado disso, eles geralmente são combinados com outros tipos de condições de acesso.

Condições PFCG

Uma condição PFCG - também conhecida como um aspecto PFCG - associa elementos de uma entidade CDS a autorizações na definição do sistema de autorizações da SAP (que são baseadas em objetos de autorização). As condições PFCG são a condição de acesso mais comum para entidades CDS que leem diretamente de tabelas de banco de dados.

Condições de herança

Uma condição de herança aplica as condições de outra função CDS. As condições de herança são a condição de acesso habitual para visões CDS que leem de outras entidades CDS (Visão sobre visão).

Vejamos alguns exemplos de condições simples.

O primeiro exemplo é uma condição literal. Indica que o valor do elemento de visão DepartmentId tem que ser igual a 'ADMIN' ou, por outras palavras, que um acesso de leitura à entidade CDS relacionada só retorna conjuntos de dados que pertencem ao departamento ADMIN.

O segundo exemplo também é uma condição de acesso simples, mas não um literal. A condição de acesso liga o elemento de visão CreatedBy ao nome do usuário atual. Um acesso de leitura à entidade CDS relacionada só retorna conjuntos de dados que o próprio usuário atual criou.

O terceiro exemplo ilustra que você pode usar os operadores lógicos AND e OR para combinar diferentes condições de acesso. Aqui, as condições estão conectadas com OR, o que significa que os usuários podem ver todos os conjuntos de dados que eles mesmos criaram, independentemente do departamento ao qual pertencem. A partir dos conjuntos de dados criados por outros usuários, eles só podem ver aqueles que pertencem ao departamento ADMIN.

Dica

Quando você cria um controle de acesso CDS com base no modelo Definir função com condição simples, você obtém a estrutura básica para uma condição literal e uma condição de aspecto do usuário.

Exemplos: condições PFCG

As funções CDS com somente condições de acesso simples não são muito comuns. Se forem usadas de todo, as condições simples são combinadas com outras condições de acesso - por exemplo, condições PFCG. As condições PFCG ligam um ou mais elementos de visão às autorizações nos dados mestre do usuário atual.

Assista ao vídeo para ver um exemplo de uma função CDS com condições PFCG e condições de herança.

Criação de controle de acesso CDS

Para criar um novo controle de acesso CDS, proceda da seguinte forma:

  1. No Explorador de projetos, localize a definição de dados que contém a definição da entidade CDS para a qual você quer fornecer regras de acesso.
  2. Clique com o botão direito do mouse na definição de dados e selecione Novo controle de acesso.
  3. À medida que você cria o controle de acesso para uma entidade CDS específica, o campo de entrada Entidade protegida já contém o nome dessa entidade CDS. Insira um nome e uma descrição para o novo controle de acesso e selecione Seguinte.

    Nota

    É altamente recomendável que o controle de acesso e a entidade protegida tenham o mesmo nome.

  4. Dependendo do tipo necessário de condição de acesso, selecione um dos modelos que começam com Definir função. Em seguida, selecione Concluir.

Anotação AccessControl.checkAuthorization

Quando você cria uma entidade de visão CDS, pode usar a anotação de autorização @AccessControl.Authorization para controlar se um controle de acesso, pode, deve, deve ou não existir para esta visão.

Os valores possíveis são os seguintes:

#NOT_REQUIRED

Se uma função CDS proteger a visão, ela é avaliada no momento da execução. A verificação de sintaxe não verifica se uma função CDS existe ou não. Este é o valor padrão.

#CHECK

Como #NOT_REQUIRED, mas com uma advertência de verificação de sintaxe se nenhuma função CDS proteger a visão.

#OBRIGATÓRIO

Como #CHECK, mas além disso, o sistema cria um erro em tempo de execução se nenhuma função CDS proteger a visão.

#NOT_ALLOWED

Nenhum controle de acesso é realizado. Se uma função estiver atribuída a esta visão, ocorre um aviso de sintaxe e o controle de acesso é ignorado no momento da execução.

#PRIVILEGED_ONLY

A entidade CDS deve ser acessada usando o suplemento ABAP SQL WITH PRIVILEGED ACCESS. Para informações detalhadas, consulte a nota SAP: 2725274.

Como implementar um controle de acesso CDS

Assista ao vídeo para ver como implementar um controle de acesso CDS.

Criar um objeto de autorização e controles de acesso CDS

Você desenvolveu um modelo de dados com tabelas de banco de dados e entidades de visão CDS. Para proteger os dados contra acesso não autorizado, você define um campo de autorização e um objeto de autorização. Em seguida, você cria controles de acesso CDS para suas entidades de visão CDS.

Modelo:

  • n.a.

Solução:

  • /LRN/DPMNT (Campo de autorização)
  • /LRN/DPMNT (Objeto de autorização)
  • /LRN/R_DEPARTMENT_AUT (controle de acesso)
  • /LRN/R_EMPLOYEE_AUT (controle de acesso)
  • /LRN/C_DEPARTMENT_AUT (controle de acesso)
  • /LRN/C_EMPLOYEE_AUT (controle de acesso)

Pré-requisitos

Para este exercício, você precisa das entidades de visão CDS que criou em exercícios anteriores (os nomes sugeridos foram: Z##_R_Department, Z##_R_Employee, Z##_C_DepartmentQuery e Z##_C_EmployeeQuery, onde ## é o seu número de grupo). Se você não tiver concluído esses exercícios, crie cópias das quatro definições de dados do pacote /LRN/S4D430_EXERCISE, que terminam com _AUT.

Tarefa 1: Definir objeto de autorização

Defina um objeto de autorização para controlar o acesso aos dados do empregado e do departamento com base no departamento relacionado (nome sugerido: Z##DPMENT, onde ## é o número do seu grupo). Defina o objeto de autorização com dois campos de autorização: um novo campo de autorização (nome sugerido: Z##DPMNT) que é baseado em seu elemento de dados para o ID do departamento (o nome sugerido era: Z##_DEPARTMENT_ID) e o campo de autorização padrão ACTVT com as atividades permitidas padrão.

Nota

Se você não tiver criado um elemento de dados para o ID de departamento, utilize o elemento de dados /LRN/DEPARTMENT_ID.

Etapas

  1. Crie um campo de autorização com base no elemento de dados para o ID do departamento (nome sugerido: Z##DEPMENT).

    1. No Explorador de projetos, clique com o botão direito do mouse no pacote para abrir o menu de contexto e selecione Novo→Outro objeto do repositório ABAP.

    2. No campo de filtro, insira au e selecione Campo de autorização na lista de sugestões.

    3. Insira Z##DPMNT como Nome e Z##_DEPARTMENT_ID como Elemento de dados. Em seguida, selecione Seguinte.

    4. Confirme a ordem de transporte e selecione Concluir.

  2. Defina sua tabela de banco de dados para dados do departamento como tabela de verificação (o nome sugerido era: Z##DEPMENT) e grave o campo de autorização.

    Nota

    Se o seu campo de autorização se basear no elemento de dados /LRN/DEPARTMENT_ID, você deve utilizar a tabela de banco de dados /LRN/DEPMENT_REL.
    1. Posicione o cursor no campo Verificar tabela, insira Z## e pressione Ctrl + espaço para abrir as entradas possíveis.

    2. Nas entradas possíveis, selecione Z##DEPMENT.

    3. Pressione Ctrl + S para gravar o campo de autorização.

  3. Crie um novo objeto de autorização e atribua o campo de autorização ao mesmo.

    1. Na definição do campo de autorização, role para baixo até O que vem a seguir? e selecione Criar um novo objeto de autorização e atribua o campo de autorização ao mesmo.

    2. Insira Z##DPMNT como Nome e Autorização por departamento como Descrição e, em seguida, selecione Seguinte.

    3. Confirme a ordem de transporte e selecione Concluir.

  4. Confirme que o novo objeto de autorização contém o campo de autorização padrão ACTVT e as atividades permitidas padrão.

    1. Inspecione a seção Campos de autorização que deve conter seu próprio campo de autorização e o campo de autorização padrão ACTVT.

    2. Inspecione a seção Atividades permitidas que deve conter as quatro atividades padrão.

  5. Grave o objeto de autorização.

    1. Pressione Ctrl + S para gravar o objeto de autorização.

Tarefa 2: Definir controles de acesso

Defina controles de acesso para suas entidades de visão base, ou seja, a entidade de visão de base para dados do departamento (o nome sugerido era: Z##_R_Department) e a entidade da visão de base para dados do empregado (o nome sugerido era: Z##_R_Employee). Utilize um modelo que permita a você controlar o acesso com base no objeto de autorização que você acabou de criar.

Nota

Seguindo uma recomendação geral, nomeie os controles de acesso após a entidade de visão que protegem.

Etapas

  1. Abra sua entidade de visão de base para dados de departamento na ferramenta Visualização de dados.

    1. Abra a definição da entidade de visão e pressione F8 para abrir a ferramenta Visualização de dados.

  2. Para esta entidade de visão, crie um controle de acesso CDS que define uma função CDS com uma condição PFCG.

    1. No Project Explorer, localize sua definição de dados CDS Z##_R_DEPARTMENT.

    2. Clique com o botão direito na definição de dados para abrir o menu de contexto e selecione Novo controle de acesso.

    3. Copie o nome do campo Entidade protegida para o campo Nome.

    4. No campo Descrição, insira Departamento (controle de acesso) e selecione Seguinte.

    5. Confirme a ordem de transporte e selecione Seguinte.

    6. Na lista de Modelos, selecione Definir função com aspecto PFCG e, em seguida, Concluir.

  3. No código gerado, referencie seu objeto de autorização.

    1. Ajuste o código da seguinte forma:

      Code Snippet
      12345678910111213
      define role Z##_R_DEPARTMENT { grant select on Z##_R_Department where (entity_element_1, entity_element_2) = aspect pfcg_auth( Z##DPMNT, authorization_field_1, authorization_field_2, filter_field_1 = 'filter_value_1' ); }

      Nota

      Introduzimos quebras de linha adicionais para aumentar a legibilidade no material de treinamento impresso.
  4. Substitua o primeiro caractere de preenchimento para campos de autorização pelo nome do seu campo de autorização. Em seguida, remova o segundo caractere de preenchimento.

    1. Ajuste o código da seguinte forma:

      Code Snippet
      123456789101112
      define role Z##_R_DEPARTMENT { grant select on Z##_R_Department where (entity_element_1, entity_element_2) = aspect pfcg_auth( Z##DPMNT, Z##DPMNT, filter_field_1 = 'filter_value_1' ); }
  5. Use o campo de autorização ACTVT como um campo de filtro e forneça o mesmo com o valor do filtro para a atividade Exibir.

    1. Ajuste o código da seguinte forma:

      Code Snippet
      123456789101112
      define role Z##_R_DEPARTMENT { grant select on Z##_R_Department where (entity_element_1, entity_element_2) = aspect pfcg_auth( Z##DPMNT, Z##DPMNT, ACTVT = '03' ); }
  6. Referencie um elemento de entidade adequado para fornecer o primeiro campo de autorização. Em seguida, remova o caractere de preenchimento para um segundo elemento de visão.

    1. Ajuste o código da seguinte forma:

      Code Snippet
      123456789101112
      define role Z##_R_DEPARTMENT { grant select on Z##_R_Department where ( Id ) = aspect pfcg_auth( Z##DPMNT, Z##DPMNT, ACTVT = '03' ); }
  7. Ative o controle de acesso e atualize a exibição na ferramenta Visualização de dados.

    1. Pressione Ctrl + F3 para ativar o objeto de desenvolvimento.

    2. Volte para a Visualização de dados para a entidade protegida e selecione Atualizar.

    3. Como alternativa, você pode pressionar F5 para atualizar os dados exibidos.

  8. Para ver pelo menos alguns dados, processe novamente o controle de acesso CDS e substitua seu próprio objeto de autorização Z##DPMNT pelo objeto de solução /LRN/DPMNT e seu próprio campo de autorização Z##DPMNT pelo campo de autorização /LRN/DPMNT. Para este objeto de autorização, seu usuário já tem algumas autorizações.

    1. Retorne ao texto fonte do seu controle de acesso CDS.

    2. Ajuste o código da seguinte forma:

      Code Snippet
      123456789101112
      define role Z##_R_DEPARTMENT { grant select on Z##_R_Department where ( Id ) = aspect pfcg_auth( /LRN/DPMNT, /LRN/DPMNT, ACTVT = '03' ); }
    3. Ative o controle de acesso e atualize a exibição na ferramenta Visualização de dados.

  9. Da mesma forma, crie um controle de acesso CDS para sua entidade de visão de base para dados do empregado.

    1. No explorador de projetos, localize sua definição de dados CDS Z##_R_EMPLOYEE.

    2. Clique com o botão direito na definição de dados para abrir o menu de contexto e selecione Novo controle de acesso.

    3. Copie o nome do campo Entidade protegida para o campo Nome.

    4. No campo Descrição, insira Empregado (controle de acesso) e selecione Seguinte.

    5. Confirme a ordem de transporte e selecione Seguinte.

    6. Na lista de Modelos, selecione Definir função com aspecto PFCG e, em seguida, Concluir.

    7. Ajuste o código gerado da seguinte forma:

      Code Snippet
      123456789101112
      define role Z##_R_EMPLOYEE { grant select on Z##_R_Employee where ( DepartmentId ) = aspect pfcg_auth( /LRN/DPMNT, /LRN/DPMNT, ACTVT = '03' ); }
  10. Ative o controle de acesso.

    1. Pressione Ctrl + F3 para ativar o objeto de desenvolvimento.

Tarefa 3: Definir herdar controles de acesso

Defina um controle de acesso para a entidade de visão com a qual você consulta dados do empregado com base em dois parâmetros de entrada (o nome sugerido era: Z##_C_EmployeeQueryP). Da mesma forma, defina um controle de acesso para sua entidade de visão com a qual você consulta e os dados do empregado por departamento (o nome sugerido era: Z##_C_DepartmentQuery). Nos dois casos, utilize um modelo que permita a você herdar as regras de autorização das entidades de visão subjacentes.

Nota

Seguindo uma recomendação geral, nomeie os controles de acesso após a entidade de visão que protegem.

Etapas

  1. Abra a definição da sua entidade de visão CDS que consulta dados do empregado com base em dois parâmetros de entrada.

    1. Pressione Ctrl + Shift + A.

    2. Insira o nome da definição de dados CDS que você deseja abrir, ou seja, Z##_C_EMPLOYEEQUERYP, e selecione OK.

  2. Para a entidade de visão com parâmetros, crie um controle de acesso CDS que defina uma função CDS com condições herdadas.

    1. No Explorador de projetos, localize sua definição de dados CDS Z##_C_EMPLOYEEQUERYP.

    2. Clique com o botão direito na definição de dados para abrir o menu de contexto e selecione Novo controle de acesso.

    3. Copie o nome do campo Entidade protegida para o campo Nome.

    4. No campo Descrição, insira Consulta de empregado (controle de acesso) e selecione Seguinte.

    5. Confirme a ordem de transporte e selecione Seguinte.

    6. Na lista de Modelos, selecione Definir função com condições herdadas e, em seguida, Concluir.

  3. No código gerado, referencie a entidade de visão que a entidade protegida utiliza como fonte de dados, ou seja, Z##_R_Employee.

    1. Ajuste o código da seguinte forma:

      Code Snippet
      1234567
      define role Z##_C_EMPLOYEEQUERYP { grant select on Z##_C_EmployeeQueryP where inheriting conditions from entity Z##_R_Employee; }
  4. Ative o controle de acesso.

    1. Pressione Ctrl + F3 para ativar o objeto de desenvolvimento.

  5. Abra a definição da sua entidade de visão CDS que agrega dados do empregado por departamento.

    1. Pressione Ctrl + Shift + A.

    2. Insira o nome da definição de dados CDS que você quer abrir, ou seja, Z##_C_DEPARTMENTQUERY, e selecione OK.

  6. Defina um controle de acesso que herde as condições de acesso da fonte de dados primária.

    1. No Explorador de projetos, localize sua definição de dados CDS Z##_C_DEPARTMENTQUERY.

    2. Clique com o botão direito na definição de dados para abrir o menu de contexto e selecione Novo controle de acesso.

    3. Copie o nome do campo Entidade protegida para o campo Nome.

    4. No campo Descrição, insira Consulta de departamento (controle de acesso) e selecione Seguinte.

    5. Confirme a ordem de transporte e selecione Seguinte.

    6. Na lista de Modelos, selecione Definir função com condições herdadas e, em seguida, Concluir.

    7. Ajuste o código gerado da seguinte forma:

      Code Snippet
      1234567
      define role Z##_C_DEPARTMENTQUERY { grant select on Z##_C_DepartmentQuery where inheriting conditions from entity Z##_R_Department; }
  7. Ative o controle de acesso.

    1. Pressione Ctrl + F3 para ativar o objeto de desenvolvimento.