Recommend this page to a friend! |
Download .zip |
Info | Documentation | View files (95) | Download .zip | Reputation | Support forum | Blog (1) | Links |
Last Updated | Ratings | Unique User Downloads | Download Rankings | |||||
2024-03-29 (1 month ago) | Not yet rated by the users | Total: 50 This week: 50 | All time: 10,667 This week: 2 |
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 |
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 | / | assets |
Files | / | 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 | / | 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 | / | 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 | / | 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 | / | assets | / | js | / | components | / | cad |
File | Role | Description |
---|---|---|
CadEnderecos.js | Data | Auxiliary data |
CadSaloes.js | Data | Auxiliary data |
Files | / | 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 | / | 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 | / | 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 | / | assets | / | js | / | json |
File | Role | Description |
---|---|---|
cards.json | Data | Auxiliary data |
times.json | Data | Auxiliary data |
Files | / | backend |
File | Role | Description | ||
---|---|---|---|---|
Controller (9 files) | ||||
Database (4 files) | ||||
Model (7 files) | ||||
Router (10 files) | ||||
.htaccess | Data | Auxiliary data |
Files | / | 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 | / | 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 | / | 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 | / | 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 |
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.