{"elements":[{"id":7005,"title":"Autenticazione e ACL","body":"<section class=\"da-section\">\n  <div class=\"container\">\n    <h2>Autenticazione JWT<\/h2>\n    <p class=\"lead\">DressAPI integra un sistema completo di autenticazione e controllo degli accessi che protegge ogni endpoint in modo granulare. Il framework supporta due modalit&agrave; &mdash; token JWT per le API stateless e sessioni PHP per il CMS &mdash; e gestisce i permessi attraverso un meccanismo di ACL basato su ruoli, tabelle e operazioni CRUD.<\/p>\n    <div class=\"text-center my-4\"><img src=\"\/assets\/images\/ACL.png\" alt=\"Gestione ACL e permessi in DressAPI\" class=\"img-fluid rounded shadow\" style=\"max-width: 80%;\"><\/div>\n\n    <h3 class=\"mt-4\">Login e Token<\/h3>\n    <div class=\"da-snippet\">\n      <div class=\"da-snippet-label\">Login Request<\/div>\n<span class=\"kw\">curl<\/span> -X <span class=\"str\">POST<\/span> https:\/\/api.example.com\/sign\n  -d <span class=\"str\">\"dusername=admin&amp;dpassword=admin\"<\/span>\n    <\/div>\n    <div class=\"da-snippet\">\n      <div class=\"da-snippet-label\">Response<\/div>\n{\n  <span class=\"str\">\"token\"<\/span>: <span class=\"str\">\"eyJhbGciOiJIUzI1NiIs...\"<\/span>,\n  <span class=\"str\">\"user\"<\/span>: {\n    <span class=\"str\">\"id\"<\/span>: <span class=\"fn\">1<\/span>,\n    <span class=\"str\">\"username\"<\/span>: <span class=\"str\">\"admin\"<\/span>,\n    <span class=\"str\">\"role\"<\/span>: <span class=\"str\">\"admin\"<\/span>\n  }\n}\n    <\/div>\n\n    <h3 class=\"mt-4\">Uso del token<\/h3>\n    <div class=\"da-snippet\">\n      <div class=\"da-snippet-label\">Authenticated Request<\/div>\n<span class=\"kw\">curl<\/span>\n  -H <span class=\"str\">\"Authorization: Bearer YOUR_TOKEN\"<\/span>\n  -X <span class=\"str\">GET<\/span> https:\/\/api.example.com\/product\n    <\/div>\n\n    <h3 class=\"mt-5\">Sessioni PHP (CMS)<\/h3>\n    <p>Per le pagine HTML, l'autenticazione usa sessioni PHP standard. Viene attivata automaticamente quando il client richiede <code>Accept: text\/html<\/code>. Per richieste JSON che necessitano sessione, aggiungere il campo nascosto <code>site_mode=1<\/code>.<\/p>\n\n    <h3 class=\"mt-5\">Sistema ACL (Controllo Accessi)<\/h3>\n    <p>Il sistema ACL &egrave; definito nel database tramite tabelle di sistema:<\/p>\n    <div class=\"table-responsive\">\n      <table class=\"table table-striped\">\n        <thead class=\"table-dark\">\n          <tr><th>Tabella<\/th><th>Descrizione<\/th><\/tr>\n        <\/thead>\n        <tbody>\n          <tr><td><code>_user<\/code><\/td><td>Utenti del sistema<\/td><\/tr>\n          <tr><td><code>_role<\/code><\/td><td>Ruoli disponibili<\/td><\/tr>\n          <tr><td><code>_user_role<\/code><\/td><td>Assegnazione ruoli agli utenti<\/td><\/tr>\n          <tr><td><code>_permission<\/code><\/td><td>Permessi CRUD per modulo\/ruolo<\/td><\/tr>\n        <\/tbody>\n      <\/table>\n    <\/div>\n    <p>Ogni risposta API include i <code>permissions<\/code> dell'utente corrente per il modulo richiesto, permettendo al frontend di mostrare\/nascondere azioni.<\/p>\n\n    <h3 class=\"mt-5\">Configurazione sicurezza<\/h3>\n    <div class=\"da-snippet\">\n      <div class=\"da-snippet-label\">config.php - Costanti da personalizzare<\/div>\n<span class=\"kw\">define<\/span>(<span class=\"str\">'TOKEN_SECRET_KEY'<\/span>, <span class=\"str\">'la-tua-chiave-segreta'<\/span>);  <span class=\"cm\">\/\/ Firma JWT<\/span>\n<span class=\"kw\">define<\/span>(<span class=\"str\">'TOKEN_DURATION'<\/span>,   <span class=\"str\">'2 months'<\/span>);                <span class=\"cm\">\/\/ Durata token<\/span>\n<span class=\"kw\">define<\/span>(<span class=\"str\">'PWD_CRYPT'<\/span>,        <span class=\"str\">'il-tuo-salt'<\/span>);              <span class=\"cm\">\/\/ Salt password<\/span>\n    <\/div>\n  <\/div>\n<\/section>\n\n<section class=\"da-section text-center\">\n  <a href=\"\/tutorials\" class=\"btn btn-outline-primary\">&larr; Torna ai Tutorial<\/a>\n<\/section>","description":"JWT, sessioni e sistema permessi RBAC","meta_keywords":"","visible":"yes","status":"public","creation_date":"0000-00-00","id__user":1,"priority":0,"groupname":"TUTORIAL"}],"module":"pages","permissions":{"can_read":true},"main_item_title":"title","related_tables":[{"name":"Newsonpage","module":"newsonpage","FK":"id_cmspage","permissions":[]}],"page_info":{"table":"","key":"id","url":"\/pages","url_list":"\/pages","filters":{"id":["=","7005"]},"pagination":{"total_items":23,"page":1,"total_pages":2,"step":1,"items_per_page":20,"url_prev":"\/pages","url_next":"\/pages\/p\/2","url_tmpl":"\/pages\/p\/[[p]]","url_tmpl_with_order":"\/pages\/p\/[[p]]\/ob\/[[ob]]"},"order":{"field":"id","type":"DESC","url_tmpl":"\/pages\/p\/[[p]]"},"module":{"title":"Pages","description":"List of pages","name":"pages"},"current":{"title":"Pages","description":"List of pages","name":"pages","url":"\/tutorials\/autenticazione"}},"components":{"alert":{"alert1":[{"type":"warning","message":"OK COMPONENT!"},{"type":"danger","message":"ERROR COMPONENT!"}]}},"messages":[]}