| Recommend this page to a friend! | 
| Info | Documentation | Reputation | Support forum | Blog | Links | 
| Last Updated | Ratings | Unique User Downloads | Download Rankings | |||||
| 2024-03-29 (0 years ago)  | Not enough user ratings | Total: 88 | All time:  9,993 This week: 43 | |||||
| Version | License | PHP version | Categories | |||
| webappmultiperfil 1.0.0 | MIT/X Consortium ... | 5 | PHP 5, Databases, Design Patterns, Ap... | 
| Description | Author  | |
This package provides an application that uses CRUD to manage multiple users.  | 
Autenticação e Autorização (somente back via API) Instruções: Clone o repositório e instale as dependências:
git clone https://github.com/faustinopsy/WebAppMultiPerfil.git
composer install
Durante o login, um token é fornecido ao usuário. Este token é crucial para a autenticação subsequente e contém informações importantes, como permissões do usuário e seu ID.
public function login($senha,$lembrar) {
        $condicoes = ['email' => $this->usuarios->getEmail(),'ativo' => 1];
        $resultado = $this->select($this->usuarios, $condicoes);
        $checado=$lembrar? 60*12 : 3;
        $permissoes=[];
        if (!$resultado) {
            return ['status' => false, 'message' => 'Usuário não encontrado ou bloqueado.'];
        }
        if (!password_verify($senha, $resultado[0]['senha'])) {
            return ['status' => false, 'message' => 'Senha incorreta.'];
        }
        $perfper = $this->select($this->PerfilPermissoes,['perfilid'=>$resultado[0]['perfilid']]);
        foreach($perfper as $key => $value){
            $permissoes[] = $this->select($this->permissoes,['id'=>$value['permissao_id']]);
        } 
        foreach ($permissoes as $permissaoArray) {
            foreach ($permissaoArray as $permissao) {
                if (isset($permissao['nome'])) {
                    $permissoesNomes[] = $permissao['nome'];
                }
            }
        }
        $key = TOKEN;
        $local=$_SERVER['HTTP_HOST'];
        $nome=$_SERVER['SERVER_NAME'];
        $algoritimo='HS256';
            $payload = [
                "iss" =>  $local,
                "aud" =>  $nome,
                "iat" => time(),
                "exp" => time() + (60 * $checado),  
                "sub" => $resultado[0]['id'],
                'telas'=>$permissoesNomes
            ];
            
            $jwt = JWT::encode($payload, $key,$algoritimo);
        return ['status' => true, 'message' => 'Login bem-sucedido!','token'=>$jwt,'telas'=>$permissoesNomes];
    }
As permissões incluídas no token determinam o que o usuário pode fazer dentro do sistema. Isso permite um controle de acesso eficaz e seguro.
Em algumas operações, como inserção de registros ou logs, o ID do usuário é extraído do token. Isso assegura que as ações sejam corretamente atribuídas ao usuário autenticado.
$router->post('/', function () {
        $body = json_decode(file_get_contents('php://input'), true);
        $permitido = new TokenController();
        $permitido->autorizado();
        $iduser= $permitido->verIdUserToken();
        $perfil = new Perfis();
        $perfil->setNome($body['nome']);
        $perfil->setCreate_id($iduser);
        $controller = new PerfilController($perfil);
            $resultado = $controller->adicionarPerfil();
            echo json_encode($resultado);
    });
Authorization não é fixa, pois a cada login é gerado novo token para validação subsequente, no projeto login no meu github possui um frontend que contem um javascript que faz uma requisição a cada 3 minutos para validar o login, caso queira saber mais, pois no exemplo abaixo na parte do login estou enviando o lembrar-me como true o que faz o token não expirar, mas se o lembrar-me for false o token é expiravel em alguns minutos.
Method: GET
URL: http://localhost/backend/Router/Permissoes
Headers: - Authorization: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJsb2NhbGhvc3QiLCJhdWQiOiJsb2NhbGhvc3QiLCJpYXQiOjE3MDY3OTAxMzYsImV4cCI6MTcwNjgzMzMzNiwic3ViIjoxLCJ0ZWxhcyI6WyJpbmRleCIsInByb2R1dG9zIiwiYWRtaW4iLCJ1c3VhcmlvcyIsInNhbG9lcyJdfQ.kZI3h-PjZn9aGZ4Q8d5nolmzM0CH68hSbz6ZhHFOw10"
Body: N/A
Method: POST
URL: http://localhost/backend/Router/Permissoes
Headers: - Authorization: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJsb2NhbGhvc3QiLCJhdWQiOiJsb2NhbGhvc3QiLCJpYXQiOjE3MDY3OTAxMzYsImV4cCI6MTcwNjgzMzMzNiwic3ViIjoxLCJ0ZWxhcyI6WyJpbmRleCIsInByb2R1dG9zIiwiYWRtaW4iLCJ1c3VhcmlvcyIsInNhbG9lcyJdfQ.kZI3h-PjZn9aGZ4Q8d5nolmzM0CH68hSbz6ZhHFOw10"
Body:
{
    "nome":"xxxxxxx"
}
Method: GET
URL: http://localhost/backend/Router/Perfil
Headers: - Authorization: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJsb2NhbGhvc3QiLCJhdWQiOiJsb2NhbGhvc3QiLCJpYXQiOjE3MDY3OTAxMzYsImV4cCI6MTcwNjgzMzMzNiwic3ViIjoxLCJ0ZWxhcyI6WyJpbmRleCIsInByb2R1dG9zIiwiYWRtaW4iLCJ1c3VhcmlvcyIsInNhbG9lcyJdfQ.kZI3h-PjZn9aGZ4Q8d5nolmzM0CH68hSbz6ZhHFOw10"
Body: N/A
Method: POST
URL: http://localhost/backend/Router/Perfil
Headers: - Authorization: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJsb2NhbGhvc3QiLCJhdWQiOiJsb2NhbGhvc3QiLCJpYXQiOjE3MDY3OTAxMzYsImV4cCI6MTcwNjgzMzMzNiwic3ViIjoxLCJ0ZWxhcyI6WyJpbmRleCIsInByb2R1dG9zIiwiYWRtaW4iLCJ1c3VhcmlvcyIsInNhbG9lcyJdfQ.kZI3h-PjZn9aGZ4Q8d5nolmzM0CH68hSbz6ZhHFOw10"
Body:
{
    "nome":"xxxxx"
}
Method: POST
URL: http://localhost/backend/Router/Usuarios/login
Headers:
Body:
{
    "email":"rfaustino@gmail.com",
    "senha":"123456",
    "lembrar":"true"
}
Method: GET
URL: http://localhost/backend/Router/Usuarios
Headers: - Authorization: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJsb2NhbGhvc3QiLCJhdWQiOiJsb2NhbGhvc3QiLCJpYXQiOjE3MDY3OTAxMzYsImV4cCI6MTcwNjgzMzMzNiwic3ViIjoxLCJ0ZWxhcyI6WyJpbmRleCIsInByb2R1dG9zIiwiYWRtaW4iLCJ1c3VhcmlvcyIsInNhbG9lcyJdfQ.kZI3h-PjZn9aGZ4Q8d5nolmzM0CH68hSbz6ZhHFOw10"
Body: N/A
Method: POST
URL: http://localhost/backend/Router/Usuarios/Registrar
Headers: - Authorization: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJsb2NhbGhvc3QiLCJhdWQiOiJsb2NhbGhvc3QiLCJpYXQiOjE3MDY3OTAxMzYsImV4cCI6MTcwNjgzMzMzNiwic3ViIjoxLCJ0ZWxhcyI6WyJpbmRleCIsInByb2R1dG9zIiwiYWRtaW4iLCJ1c3VhcmlvcyIsInNhbG9lcyJdfQ.kZI3h-PjZn9aGZ4Q8d5nolmzM0CH68hSbz6ZhHFOw10"
Body:
{
    "nome":"Rodrigo Teste",
    "email":"rfaustino@gmail.com",
    "senha":"123456"
}
Method: DELETE
URL: http://localhost/backend/Router/Usuarios
Headers: - Authorization: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJsb2NhbGhvc3QiLCJhdWQiOiJsb2NhbGhvc3QiLCJpYXQiOjE3MDY3OTAxMzYsImV4cCI6MTcwNjgzMzMzNiwic3ViIjoxLCJ0ZWxhcyI6WyJpbmRleCIsInByb2R1dG9zIiwiYWRtaW4iLCJ1c3VhcmlvcyIsInNhbG9lcyJdfQ.kZI3h-PjZn9aGZ4Q8d5nolmzM0CH68hSbz6ZhHFOw10"
Body:
{
    "email":"rfaustino@gmail.com"
}
Method: POST
URL: http://localhost/backend/Router/Associar
Headers: - Authorization: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJsb2NhbGhvc3QiLCJhdWQiOiJsb2NhbGhvc3QiLCJpYXQiOjE3MDY3OTAxMzYsImV4cCI6MTcwNjgzMzMzNiwic3ViIjoxLCJ0ZWxhcyI6WyJpbmRleCIsInByb2R1dG9zIiwiYWRtaW4iLCJ1c3VhcmlvcyIsInNhbG9lcyJdfQ.kZI3h-PjZn9aGZ4Q8d5nolmzM0CH68hSbz6ZhHFOw10"
Body:
{
    "perfilId":"2",
    "permissao_id":"1"
}
Method: GET
URL: http://localhost/backend/Router/Associar/2
Headers: - Authorization: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJsb2NhbGhvc3QiLCJhdWQiOiJsb2NhbGhvc3QiLCJpYXQiOjE3MDY3OTAxMzYsImV4cCI6MTcwNjgzMzMzNiwic3ViIjoxLCJ0ZWxhcyI6WyJpbmRleCIsInByb2R1dG9zIiwiYWRtaW4iLCJ1c3VhcmlvcyIsInNhbG9lcyJdfQ.kZI3h-PjZn9aGZ4Q8d5nolmzM0CH68hSbz6ZhHFOw10"
Body: N/A
Method: DELETE
URL: http://localhost/backend/Router/Associar/4
Headers: - Authorization: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJsb2NhbGhvc3QiLCJhdWQiOiJsb2NhbGhvc3QiLCJpYXQiOjE3MDY3OTAxMzYsImV4cCI6MTcwNjgzMzMzNiwic3ViIjoxLCJ0ZWxhcyI6WyJpbmRleCIsInByb2R1dG9zIiwiYWRtaW4iLCJ1c3VhcmlvcyIsInNhbG9lcyJdfQ.kZI3h-PjZn9aGZ4Q8d5nolmzM0CH68hSbz6ZhHFOw10"
Body:
{
    "permissao_id":"5"
}
Localizada em App\Database\Crud, esta classe é responsável pelas operações básicas de banco de dados em um estilo de programação orientado a objetos. Ela estende a classe Connection, indicando que gerencia a conexão com o banco de dados. A classe Crud segue o padrão de design Active Record, que é um padrão de acesso a dados. Este padrão implica que um objeto de um modelo contém tanto os dados (representados pelos campos do banco de dados) quanto o comportamento que inclui a lógica de acesso a esses dados (as operações CRUD). A classe estende uma Connection, que presumivelmente gerencia a conexão com o banco de dados, seguindo o princípio de herança para reutilizar a lógica de conexão.
Reflexão para Mapeamento Objeto-Relacional (ORM): Utiliza reflexão para mapear propriedades de objetos para colunas em uma tabela de banco de dados. Isso permite uma abstração significativa, mas tem limitações, como a necessidade de que as propriedades sejam privadas e mapeadas um-a-um com as colunas da tabela.
Abstração e Flexibilidade: Facilita operações com o banco de dados sem escrever SQL diretamente, abstraindo muitos dos detalhes e aumentando a segurança contra injeções de SQL através do uso de prepared statements.
Validação e Sanitização: Incluir mecanismos de validação e sanitização de dados antes de executar operações no banco de dados para aumentar a segurança. Padronização dos Nomes das Tabelas: A classe assume que o nome da tabela é o nome da classe do objeto passado em minúsculas. Isso pode não ser sempre desejável ou viável, especialmente em bancos de dados com convenções de nomenclatura específicas. Tratamento de Erros: O código atualmente apenas imprime mensagens de erro. Seria mais adequado lançar exceções ou utilizar um sistema de logging para registrar esses erros. Suporte a Relacionamentos: Não há suporte explícito para o mapeamento de relações entre tabelas, como chave estrangeira, o que poderia ser uma adição valiosa.
A classe Crud utiliza reflexão (a classe ReflectionClass do PHP) para manipular propriedades privadas dos objetos passados. Isso permite que a classe opere de maneira genérica com diferentes tipos de objetos, adequando-se às necessidades de várias tabelas e estruturas de dados.
Reflexão é um recurso de linguagens de programação que permite a um programa inspecionar e modificar sua estrutura e comportamento em tempo de execução. Em PHP, a reflexão é usada principalmente para:
Obter Informações sobre Classes e Objetos: Inspecionar classes, propriedades, métodos e outros aspectos internos de um objeto.
Manipular propriedades e invocar métodos, independentemente de sua visibilidade (pública, protegida ou privada). Vantagens e Usabilidade no Contexto dos Códigos Nos códigos fornecidos, a reflexão é usada na classe Crud para manipular objetos de diferentes tipos de forma genérica. Vamos detalhar suas vantagens e usabilidade:
A classe Crud é capaz de realizar operações de banco de dados com qualquer tipo de objeto sem necessitar de implementações específicas para cada tipo. Isso é possível porque a reflexão permite inspecionar os objetos em tempo de execução e descobrir suas propriedades. Assim, a mesma lógica de insert, update, select e delete pode ser reutilizada para diferentes tipos de entidades.
Normalmente, propriedades privadas em uma classe não são acessíveis fora da própria classe. No entanto, com reflexão, a classe Crud pode acessar e modificar essas propriedades. Isso é crucial para operações de banco de dados onde cada propriedade do objeto pode mapear para uma coluna na tabela do banco de dados.
A reflexão permite que a classe Crud construa consultas SQL dinamicamente baseadas nos objetos passados. Por exemplo, ao inserir um objeto, a classe pode automaticamente gerar uma instrução INSERT INTO com colunas e valores correspondentes às propriedades do objeto. Isso elimina a necessidade de escrever consultas SQL manualmente para cada tipo de objeto, simplificando o código e reduzindo a probabilidade de erros.
A capacidade de tratar diferentes tipos de objetos de maneira genérica facilita a manutenção e extensão do código. Novas entidades podem ser adicionadas ao sistema sem a necessidade de alterar a lógica central de CRUD, desde que sigam a estrutura esperada.
Na classe que irá usar o CRUD, usa extends para herdar a classe CRUD, e inicia o construtor da classe pai que a classe CRUD dentro do proprio construtor.
1º:
class PerfilController extends Crud{
    private $perfil;
    public function __construct($perfil){
        parent::__construct();
        $this->perfil=$perfil;
    }
Assim a classe filha poderá usar o "$this" como se fosse a própria classe, usando os métodos da classe pai, pois herdou e instanciou-a 2º SELECT $this->select(ARGUMENTO1, ARGUMENTO2) - $this->perfil = ARGUMENTO 1, classe Model que representa a tabela do banco de dados. - ['nome'=> $this->perfil->getNome()) = ARGUMENTO 2, um array nome da coluna do banco e seu valor. se vazio [] trará todos os registros. - uso com betwwen: ['latitude' => ['BETWEEN', [$latMin, $latMax]]] - uso com like: ['bairro' => ['LIKE', $this->enderecos->getBairro()]]
$this->select($this->perfil,['nome'=> $this->perfil->getNome()]);
Uso de um select especial como Inner join: onde precisaria exibir todas as permissoes de um perfil (neste caso há uma associação N:N), primeiro busquei o perfil especifico e com o resultado que é o id das permissões listei em um array todas as permissões.
public function obterPermissoesDoPerfil($permissoes){
         $resultado = $this->select($this->perfilpermissoes,['perfilid'=> $this->perfilpermissoes->getPerfilid()]);
         $dados=[];
         foreach($resultado as $key => $value) {
            $dados[] = $this->select($permissoes,['id'=> $value['permissao_id']]);
         }
         return $dados;
    }
Mas o padrão de uso é enviar a "classe model" que representa a tabela do banco no primeiro argumento do método.
| File | Role | Description | ||
|---|---|---|---|---|
| Data | Auxiliary data | |||
| Data | Auxiliary data | |||
| Data | Auxiliary data | |||
| Icon | Icon image | |||
| Data | Application page | |||
| Data | Auxiliary data | |||
| Doc. | Documentation | |||
| Data | Application page | |||
| / | assets | 
| / | assets | / | css | 
| File | Role | Description | ||
|---|---|---|---|---|
|    | 
Data | Auxiliary data | ||
|    | 
Data | Auxiliary data | ||
|    | 
Data | Auxiliary data | ||
|    | 
Data | Auxiliary data | ||
| / | assets | / | css | / | images | 
| File | Role | Description | 
|---|---|---|
|    | 
Icon | Icon image | 
|    | 
Icon | Icon image | 
|    | 
Icon | Icon image | 
|    | 
Icon | Icon image | 
|    | 
Icon | Icon image | 
| / | assets | / | img | 
| File | Role | Description | 
|---|---|---|
|    | 
Icon | Icon image | 
|    | 
Data | Auxiliary data | 
|    | 
Icon | Icon image | 
|    | 
Icon | Icon image | 
|    | 
Icon | Icon image | 
|    | 
Data | Auxiliary data | 
|    | 
Data | Auxiliary data | 
|    | 
Icon | Icon image | 
|    | 
Data | Auxiliary data | 
|    | 
Data | Auxiliary data | 
|    | 
Data | Auxiliary data | 
|    | 
Data | Auxiliary data | 
|    | 
Data | Auxiliary data | 
|    | 
Icon | Icon image | 
|    | 
Data | Auxiliary data | 
|    | 
Data | Auxiliary data | 
| / | assets | / | js | 
| File | Role | Description | ||
|---|---|---|---|---|
|    | 
Data | Auxiliary data | ||
|    | 
Data | Auxiliary data | ||
|    | 
Data | Auxiliary data | ||
|    | 
Data | Auxiliary data | ||
|    | 
Data | Auxiliary data | ||
|    | 
Data | Auxiliary data | ||
| / | assets | / | js | / | components | 
| / | assets | / | js | / | components | / | cad | 
| File | Role | Description | 
|---|---|---|
|    | 
Data | Auxiliary data | 
|    | 
Data | Auxiliary data | 
| / | assets | / | js | / | components | / | lib | 
| File | Role | Description | 
|---|---|---|
|    | 
Data | Auxiliary data | 
|    | 
Data | Auxiliary data | 
|    | 
Data | Auxiliary data | 
|    | 
Data | Auxiliary data | 
|    | 
Data | Auxiliary data | 
| / | assets | / | js | / | components | / | list | 
| File | Role | Description | 
|---|---|---|
|    | 
Data | Auxiliary data | 
|    | 
Data | Auxiliary data | 
|    | 
Data | Auxiliary data | 
|    | 
Data | Auxiliary data | 
|    | 
Data | Auxiliary data | 
| / | assets | / | js | / | components | / | screen | 
| File | Role | Description | 
|---|---|---|
|    | 
Data | Auxiliary data | 
|    | 
Data | Auxiliary data | 
|    | 
Data | Auxiliary data | 
|    | 
Data | Auxiliary data | 
|    | 
Data | Auxiliary data | 
|    | 
Data | Auxiliary data | 
|    | 
Data | Auxiliary data | 
| / | assets | / | js | / | json | 
| File | Role | Description | 
|---|---|---|
|    | 
Data | Auxiliary data | 
|    | 
Data | Auxiliary data | 
| / | assets | / | js | / | lang | 
| / | backend | 
| File | Role | Description | ||
|---|---|---|---|---|
|    | 
Data | Auxiliary data | ||
| / | backend | / | Controller | 
| File | Role | Description | 
|---|---|---|
|    | 
Class | Class source | 
|    | 
Class | Class source | 
|    | 
Class | Class source | 
|    | 
Class | Class source | 
|    | 
Class | Class source | 
|    | 
Class | Class source | 
|    | 
Class | Class source | 
|    | 
Class | Class source | 
|    | 
Class | Class source | 
| / | backend | / | Database | 
| File | Role | Description | 
|---|---|---|
|    | 
Conf. | Configuration script | 
|    | 
Conf. | Configuration script | 
|    | 
Class | Class source | 
|    | 
Class | Class source | 
| / | backend | / | Model | 
| File | Role | Description | 
|---|---|---|
|    | 
Class | Class source | 
|    | 
Class | Class source | 
|    | 
Class | Class source | 
|    | 
Class | Class source | 
|    | 
Class | Class source | 
|    | 
Class | Class source | 
|    | 
Class | Class source | 
| / | backend | / | Router | 
| File | Role | Description | 
|---|---|---|
|    | 
Data | Auxiliary data | 
|    | 
Example | Example script | 
|    | 
Example | Example script | 
|    | 
Example | Example script | 
|    | 
Example | Example script | 
|    | 
Example | Example script | 
|    | 
Example | Example script | 
|    | 
Example | Example script | 
|    | 
Example | Example script | 
|    | 
Example | Example script | 
| The PHP Classes site has supported package installation using the Composer tool since 2013, as you may verify by reading this instructions page. | 
| webappmultiperfil-2024-03-29.zip 926KB | |
| webappmultiperfil-2024-03-29.tar.gz 900KB | |
| Install with Composer | 
| Version Control | Unique User Downloads | Download Rankings | |||||||||||||||
| 100% | 
  | 
  | 
| Applications that use this package | 
 If you know an application of this package, send a message to the author to add a link here.