| Recommend this page to a friend! | 
|  Download | 
| Info | Documentation |  Files |  Install with Composer |  Download | 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.
|  Files (95) | 
| File | Role | Description | ||
|---|---|---|---|---|
|  assets (3 directories) | ||||
|  backend (1 file, 4 directories) | ||||
|    composer.json | Data | Auxiliary data | ||
|    composer.lock | Data | Auxiliary data | ||
|    database.sql | Data | Auxiliary data | ||
|    favicon.ico | Icon | Icon image | ||
|    index.html | Data | Application page | ||
|    manifest.json | Data | Auxiliary data | ||
|    readme.md | Doc. | Documentation | ||
|    saloes.html | Data | Application page | ||
|  Files (95) | / | assets | 
|  Files (95) | / | assets | / | css | 
| File | Role | Description | ||
|---|---|---|---|---|
|  images (5 files) | ||||
|    leaflet.css | Data | Auxiliary data | ||
|    styleaTime.css | Data | Auxiliary data | ||
|    styles.css | Data | Auxiliary data | ||
|    w3.css | Data | Auxiliary data | ||
|  Files (95) | / | assets | / | css | / | images | 
| File | Role | Description | 
|---|---|---|
|    layers-2x.png | Icon | Icon image | 
|    layers.png | Icon | Icon image | 
|    marker-icon-2x.png | Icon | Icon image | 
|    marker-icon.png | Icon | Icon image | 
|    marker-shadow.png | Icon | Icon image | 
|  Files (95) | / | assets | / | img | 
| File | Role | Description | 
|---|---|---|
|    about.png | Icon | Icon image | 
|    admin.png | Data | Auxiliary data | 
|    cad.png | Icon | Icon image | 
|    combina.png | Icon | Icon image | 
|    conf.png | Icon | Icon image | 
|    home.png | Data | Auxiliary data | 
|    img_avatar4.png | Data | Auxiliary data | 
|    list.png | Icon | Icon image | 
|    login.png | Data | Auxiliary data | 
|    logo.jpg | Data | Auxiliary data | 
|    logo.png | Data | Auxiliary data | 
|    permiss.png | Data | Auxiliary data | 
|    salao.png | Data | Auxiliary data | 
|    salon.png | Icon | Icon image | 
|    seqex.svg | Data | Auxiliary data | 
|    users.png | Data | Auxiliary data | 
|  Files (95) | / | assets | / | js | 
| File | Role | Description | ||
|---|---|---|---|---|
|  components (2 files, 4 directories) | ||||
|  json (2 files) | ||||
|  lang (2 files) | ||||
|    App.js | Data | Auxiliary data | ||
|    heatmap.min.js | Data | Auxiliary data | ||
|    leaflet.js | Data | Auxiliary data | ||
|    MouseTrackerSDK.js | Data | Auxiliary data | ||
|    script.js | Data | Auxiliary data | ||
|    sweetalert2.11.js | Data | Auxiliary data | ||
|  Files (95) | / | assets | / | js | / | components | 
|  Files (95) | / | assets | / | js | / | components | / | cad | 
| File | Role | Description | 
|---|---|---|
|    CadEnderecos.js | Data | Auxiliary data | 
|    CadSaloes.js | Data | Auxiliary data | 
|  Files (95) | / | assets | / | js | / | components | / | lib | 
| File | Role | Description | 
|---|---|---|
|    BuscaApiG.js | Data | Auxiliary data | 
|    HeatmapComponent.js | Data | Auxiliary data | 
|    Mensagens.js | Data | Auxiliary data | 
|    MouseMovementTracker.js | Data | Auxiliary data | 
|    ValidadorToken.js | Data | Auxiliary data | 
|  Files (95) | / | assets | / | js | / | components | / | list | 
| File | Role | Description | 
|---|---|---|
|    GerenciadorPermissoes.js | Data | Auxiliary data | 
|    GerenciadorSaloes.js | Data | Auxiliary data | 
|    GerenciadorUsuarios.js | Data | Auxiliary data | 
|    ListaSaloes.js | Data | Auxiliary data | 
|    ListaSaloeslivre.js | Data | Auxiliary data | 
|  Files (95) | / | assets | / | js | / | components | / | screen | 
| File | Role | Description | 
|---|---|---|
|    About.js | Data | Auxiliary data | 
|    Admin.js | Data | Auxiliary data | 
|    LoginScreen.js | Data | Auxiliary data | 
|    MapaSaloes.js | Data | Auxiliary data | 
|    MinhaArea.js | Data | Auxiliary data | 
|    RecoveryScreen.js | Data | Auxiliary data | 
|    RegistrationScreen.js | Data | Auxiliary data | 
|  Files (95) | / | assets | / | js | / | json | 
| File | Role | Description | 
|---|---|---|
|    cards.json | Data | Auxiliary data | 
|    times.json | Data | Auxiliary data | 
|  Files (95) | / | assets | / | js | / | lang | 
|  Files (95) | / | backend | 
| File | Role | Description | ||
|---|---|---|---|---|
|  Controller (9 files) | ||||
|  Database (4 files) | ||||
|  Model (7 files) | ||||
|  Router (10 files) | ||||
|    .htaccess | Data | Auxiliary data | ||
|  Files (95) | / | backend | / | Controller | 
| File | Role | Description | 
|---|---|---|
|  AnaliticosController.php | Class | Class source | 
|  EnderecosController.php | Class | Class source | 
|  EnviaEmail.php | Class | Class source | 
|  PerfilController.php | Class | Class source | 
|  PerfilPermissaoController.php | Class | Class source | 
|  PermissaoController.php | Class | Class source | 
|  SaloesController.php | Class | Class source | 
|  TokenController.php | Class | Class source | 
|  UsuarioController.php | Class | Class source | 
|  Files (95) | / | backend | / | Database | 
| File | Role | Description | 
|---|---|---|
|    config.php | Conf. | Configuration script | 
|    configEmail.php | Conf. | Configuration script | 
|  Connection.php | Class | Class source | 
|  Crud.php | Class | Class source | 
|  Files (95) | / | backend | / | Model | 
| File | Role | Description | 
|---|---|---|
|  Analiticos.php | Class | Class source | 
|  Enderecos.php | Class | Class source | 
|  PerfilPermissoes.php | Class | Class source | 
|  Perfis.php | Class | Class source | 
|  Permissoes.php | Class | Class source | 
|  Saloes.php | Class | Class source | 
|  Usuarios.php | Class | Class source | 
|  Files (95) | / | backend | / | Router | 
| File | Role | Description | 
|---|---|---|
|    .htaccess | Data | Auxiliary data | 
|    Analiticos.php | Example | Example script | 
|    Enderecos.php | Example | Example script | 
|    index.php | Example | Example script | 
|    PerfilPermissoes.php | Example | Example script | 
|    Perfis.php | Example | Example script | 
|    Permissoes.php | Example | Example script | 
|    Saloes.php | Example | Example script | 
|    Token.php | Example | Example script | 
|    Usuarios.php | 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. | 
|  Install with Composer | 
|  | 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.
 If you know an application of this package, send a message to the author to add a link here.