Permissão de Segurança
O sistema de permissões de segurança é um mecanismo de autorização e autenticação de usuários. Dessa forma, é possível definir regras de acessos a usuários ou grupos de usuários, além de permitir múltiplas formas de efetuar o login no sistema, utilizando as informações contidas no Banco de Dados (padrão) ou um provedor de login externo. Os provedores de login externo suportados incluem o Active Directory, SAML, OpenID-connect, Microsoft Account, Twitter, Login social (Github, Facebook, LinkedIn, Google e Cronapp), Certificados digitais e ICP Brasil, podendo também ser personalizado para qualquer provedor de login externo compatível com OAuth 2.0.
Os projetos Cronapp criados a partir da versão 2.9.6-SP.40 possuem um recurso de invalidação de tokens dos usuários. Para mais detalhes desse recurso, consulte a documentação Invalidação de tokens.
Estrutura
A Permissão de Segurança do Cronapp possui uma estrutura dividida em 3 camadas: Permissionáveis (Securable), Grupos (Role) e Usuários (User). Essa estrutura possui uma pequena hierarquia, onde um permissionável possui as permissões do sistema e é composto por usuários e grupos de usuários; um Grupo, possui um ou mais usuários e pode estar associado a um ou mais permissionáveis e o Usuário, que pode estar dentro de um ou mais grupos e estar diretamente vinculado a um ou mais permissionáveis. A figura 1 representa essa estrutura.
Figura 1 - Estrutura das permissões de segurança do Cronapp
Permissionável
Cada permissionável possui um conjunto de permissões (métodos de requisição HTTP) que podem ser aplicadas em arquivos específicos ou todo o conteúdo dentro de um diretório. O acesso a arquivos é feito diretamente nas configurações do permissionável, porém, o Cronapp também utiliza a lista de permissionáveis do sistema para liberar acessos a recursos dentro de uma página, relatório, bloco de programação e diversas outras funcionalidades (veja exemplos no tópico Atribuir Permissões).
Por padrão, os projetos criados no Cronapp já incluem os seguintes permissionáveis: Public, Authenticated e Administrators. Não sendo possível renomear ou remover esses permissionáveis. Os permissionáveis herdam permissões de outros permissionáveis, assim:
O permissionável Public possui as permissões mais básicas, como acesso ao conteúdo do diretório
publice arquivos necessários para que os usuários não logados possam visualizar o conteúdo público, exemplo de arquivosCSSe tema da aplicação.O permissionável Authenticated herda todas as permissões do permissionável Public e possui algumas permissões próprias, como acesso ao conteúdo do diretório
views/logged/.O permissionável Administrators herda todas as permissões do permissionável Authenticated e possui algumas permissões próprias, com acesso completo ao sistema e diretório
views/admin/.Todo os novos permissionáveis do sistema herdarão automaticamente as permissões do permissionável Authenticated.
Usuários vinculados a mais de um permissionável terá o acesso do permissionável de maior abrangência. Por exemplo, se um usuário estiver associado a dois permissionáveis, através de grupos ou diretamente, sendo que o primeiro permissionável concede acesso a parte do sistema e o segundo possua acesso completo, ao logar, esse usuário terá acesso total.
Alterar regras
É possível modificar as regras dos 3 permissionáveis padrão para que eles se adequem melhor as necessidades do seu sistema. Porém, é preciso ter bastante atenção ao fazer isso, pois podem abrir brechas para falhas de segurança. Além disso, essas alterações devem contemplar tanto a aplicação web quanto a mobile.
Em alguns casos, talvez seja prudente ter o permissionável Authenticated mais restrito, apenas com o que é realmente comum e criar permissionáveis com acessos bem específicos ao que aquele usuário ou grupo de usuários necessitarão dentro do sistema. Por exemplo, o permissionável “comprador” pode contemplar tudo o que é necessário para a funcionalidade, e se necessário, criar permissionáveis ainda mais específicos, como “Comprador - Escrita” e “Comprador - Leitura”.
Grupos
Um grupo pode conter diversos usuários, e esses usuários herdarão automaticamente os acessos dos permissionáveis dos quais esse grupo pertença. Dessa forma, um grupo é considerado um papel ou função, já que pode possuir as regras necessárias para que o usuário associado execute seu papel e acesse suas funções dentro do sistema, exemplo: Vendedor, Gerente, Gestão de pessoas.
Por padrão, os projetos criados no Cronapp já incluem os seguintes Grupos:
Anonymous Users: associado ao permissionável Public.
Authenticated Users: associado ao permissionável Authenticated.
Administrators: associado ao permissionável Administrators. É fundamental que sempre haja um grupo associado ao permissionável Administrators.
Usuários
Um usuário do sistema pode obter suas autorizações por estar associado a grupos ou diretamente a permissionáveis. Usuários criados sem vínculos com grupos ou permissionáveis receberá, de forma implícita, todas as regras do permissionável Authenticated.
Por padrão, os projetos criados no Cronapp contêm o usuário:
Administrator: esse usuário já vem associado ao grupo Administrators, que por sua vez, está vinculado ao permissionável Administrators. É fundamental que sempre haja um usuário associado ao permissionável Administrators.
Estrutura de Classes
Por padrão, o sistema de permissões e segurança armazena informações de usuário em um banco de dados usando o JPA. Essa abordagem funciona bem para muitos aplicativos. Entretanto, você pode preferir usar um mecanismo de persistência ou esquema de dados diferente, dessa forma, é possível alterar e tornar o modelo extensível e personalizável.
Na figura abaixo são exibidas as classes usadas na Permissão de Segurança do Cronapp. Dependendo das configurações do seu projeto, outras três classes também serão exibidas: AuditLog (Log de auditoria), Device (Dispositivos móveis) e InvalidatedToken (Invalidação de tokens) (acesse as documentações Diagrama, Log de Auditoria e Invalidação de Tokens para mais detalhes sobre essas três classes).
Figura 1.1 - Diagrama de dados inicial de um sistema Cronapp
O modelo de dados das permissões de segurança consiste dos seguintes tipos de entidade (Figura 1.1):
Nome da Entidade | Descrição |
|---|---|
Representa um usuário. | |
Representa um grupo (função). | |
Representa logins de provedores externos para um usuário. | |
Representa um permissionável. | |
Representa um objeto do tipo View ao qual você quer aplicar controle de acesso através dos métodos de requisição HTTP. | |
Representa uma aplicação, utilizado em sistemas com multi aplicações. | |
Associa grupos e permissionáveis, permitindo que todos os usuários contidos em um grupo tenham permissão ao conjunto de acessos do permissionável. | |
Associa usuários e permissionáveis, permitindo que o usuário tenha permissão diretamente ao conjunto de acessos do permissionável. | |
Associa um usuário a um grupo (função). | |
Associa usuários e aplicações, utilizado em sistemas com multi aplicações. |
Relacionamentos entre entidades
Os tipos de entidade são relacionados entre si das seguintes formas:
Cada
Userpode ter múltiplosSecurablesassociados, e cadaSecurablepode estar associado a múltiplosUsers. Esse relacionamento muitos-para-muitos é representado pela entidadeUserSecurable.Cada
Userpode ter múltiplosLoginsassociados.Cada
Userpode ter múltiplosRolesassociados, e cadaRolepode estar associada a múltiplosUsers. Esse relacionamento muitos-para-muitos é representado pela entidadeUserRole.Cada
Rolepode ter múltiplosSecurablesassociados, e cadaSecurablepode estar associado a múltiplosRoles. Esse relacionamento muitos-para-muitos é representado pela entidadeRoleSecurable.Cada
Securablepode ter múltiplosViewsassociados.
Relacionamentos para Multi Aplicações
Os relacionamentos abaixo são específicos para a utilização de Multiplas aplicações dentro da mesma base de dados, para isso são utilizadas as tabelas Application e ApplicationUser. Os tipos de entidade são relacionados entre si das seguintes formas:
Cada
Applicationpode ter múltiplosRoleassociados.Cada
Applicationpode ter múltiplosSecurableassociados.Cada
Applicationpode ter múltiplosViewassociados.Cada
Applicationpode ter múltiplosUserassociados, e cadaUserpode estar associado a múltiplosApplication. Esse relacionamento muitos-para-muitos é representado pela entidadeApplicationUser.
Tabelas
Abaixo são detalhados todos os campos das tabelas usadas pelo Sistema de Segurança.
User
Usuário.
Coluna do Banco | Tipo | Função |
|---|---|---|
id | Texto | Chave primária. |
access_failed_count | Inteiro | Número de falha de acesso seguidos. |
Texto | E-mail do usuário. | |
email_confirmed | Lógico | Confirmação se o e-mail foi validado. |
lockout_enabled | Lógico | Permite que o mecanismo de segurança bloqueie o acesso do usuário (por exemplo, errar a senha várias vezes). |
lockout_end | Data e Hora | Horário que o usuário será desbloqueado para acessar o sistema. |
name | Texto | Nome do usuário. |
normalized_email | Texto | Cria uma cópia normalizada do email do usuário, garantindo que o usuário possa ter e-mail com caracteres especiais. |
normalized_user_name | Texto | Cria uma cópia normalizada do user_name, garantindo que o usuário possa ter um login com caracteres especiais. |
password | Texto | Senha do usuário. |
phone_number | Texto | Número de telefone. |
phone_number_confirmed | Lógico | Confirmação se o telefone foi validado. |
security_stamp | Texto | Usado para rastrear as alterações feitas no perfil do usuário. É usado para fins de segurança quando as propriedades importantes de um usuário são alteradas, como a alteração da senha. |
two_factor_enabled | Lógico | Habilita a autenticação de dois fatores. |
user_name | Texto | Login do usuário. |
theme | Imagem no Banco | Tema escolhido pelo usuário. |
picture | Texto | Foto do usuário. |
Role
Grupo.
Coluna do Banco | Tipo | Função |
|---|---|---|
id | Texto | Chave primária. |
builtin | Lógico | Quando verdadeiro, o registro só pode ser alterado em tempo de desenvolvimento. |
membership_enabled | Lógico | Quando verdadeiro, novos membros podem ser inseridos no grupo. |
name | Texto | Nome do grupo. |
normalized_name | Texto | Cria uma cópia normalizada do nome do grupo (função), permitindo que o nome tenha caracteres especiais. |
application | Texto | Chave estrangeira da tabela Application. |
Login
A entidade Login garante que um mesmo usuário possa logar com diferentes contas. Por exemplo, um usuário pode logar e acessar na sua conta do sistema usando sua conta do Facebook, Gmail ou do próprio sistema, essa última é gravada diretamente na tabela User.
Coluna do Banco | Tipo | Função |
|---|---|---|
id | Texto | Chave primária. |
login_provider | Texto | Provedor da autenticação externa. |
provider_display_name | Texto | Login do usuário no provedor externo, |
provider_key | Texto | Senha do usuário no provedor externo. |
user_id | Texto | Chave estrangeira da tabela User. |
Securable
Permissionável.
Coluna do Banco | Tipo | Função |
|---|---|---|
id | Texto | Chave primária. |
name | Texto | Nome do permissionável. |
application | Texto | Chave estrangeira da tabela Application. |
View
Aplica o controle de acesso (métodos de requisição HTTP) à diretórios e arquivos.
Coluna do Banco | Tipo | Função |
|---|---|---|
id | Texto | Chave primária. |
securable_id | Texto | Chave estrangeira da tabela Securable. |
pattern | Texto | Página ou local com o controle de acesso. |
getMethodAllowed | Lógico | Permissão para o método get. |
headMethodAllowed | Lógico | Permissão para o método head. |
putMethodAllowed | Lógico | Permissão para o método put. |
postMethodAllowed | Lógico | Permissão para o método post. |
patchMethodAllowed | Lógico | Permissão para o método patch. |
deleteMethodAllowed | Lógico | Permissão para o método delete. |
optionsMethodAllowed | Lógico | Permissão para o método options. |
traceMethodAllowed | Lógico | Permissão para o método trace. |
application | Texto | Chave estrangeira da tabela Application. |
Application
Aplicações. Ver mais detalhes em Multi aplicações.
Coluna do Banco | Tipo | Função |
|---|---|---|
id | Texto | Chave primária. |
name | Texto | Nome da aplicação. |
Role Securable
Tabela de relacionamento entre Grupo e Permissionável.
Coluna do Banco | Tipo | Função |
|---|---|---|
id | Texto | Chave primária. |
role_id | Texto | Chave estrangeira da tabela Role. |
securable_id | Texto | Chave estrangeira da tabela Securable. |
User Securable
Tabela de relacionamento entre Usuário e Permissionável.
Coluna do Banco |
|---|