{"_id":"@cjr-unb/autho","_rev":"7-6b42f97bbddb0f7aeca7d8a03dc75849","time":{"created":"2023-06-22T14:25:16.997Z","1.0.0":"2023-06-22T14:13:23.062Z","modified":"2023-06-29T13:47:34.778Z","1.0.1":"2023-06-22T14:25:17.247Z","1.0.2":"2023-06-22T14:39:40.734Z","1.0.3":"2023-06-28T17:57:44.762Z","1.1.0":"2023-06-29T13:43:46.510Z","1.1.1":"2023-06-29T13:47:34.591Z"},"name":"@cjr-unb/autho","dist-tags":{"latest":"1.1.1"},"versions":{"1.0.1":{"name":"@cjr-unb/autho","version":"1.0.1","description":"Module for authorization in NestJS built with CASL","author":{"name":"Edson Sales"},"license":"MIT","main":"dist/index.js","types":"dist/index.d.ts","repository":{"type":"git","url":"git+https://github.com/CJR-UnB/autho.git"},"scripts":{"build":"rimraf dist && tsc","prepare":"npm run build"},"dependencies":{"@casl/ability":"^6.5.0","@casl/prisma":"^1.4.0"},"peerDependencies":{"@nestjs/common":"9.X","@nestjs/core":"9.X","@prisma/client":"4.X"},"devDependencies":{"@types/node":"^20.2.5","prisma":"^4.15.0","rimraf":"^5.0.1","typescript":"^5.1.3"},"keywords":["nest","nestjs","casl","prisma","authorization","module","autho"],"gitHead":"7b45ed91f757e0d56537d94caafb0ecbebd07b27","bugs":{"url":"https://github.com/CJR-UnB/autho/issues"},"homepage":"https://github.com/CJR-UnB/autho#readme","_id":"@cjr-unb/autho@1.0.1","_nodeVersion":"20.0.0","_npmVersion":"9.6.4","dist":{"integrity":"sha512-bwvTWnrbldxwjYPDVqleoEfjorpkFYMwiCtmqWWXjoEKwNE1IJ3hA4eiju9Ni0SUx3cIx3CxeHI4aheuYhTUFQ==","shasum":"60af3bc2540c7e2d897305679ebd3550efcbc4e7","tarball":"https://registry.npmjs.org/@cjr-unb/autho/-/autho-1.0.1.tgz","fileCount":32,"unpackedSize":45107,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICwWaboJzF+mUjmm5pdg98L1xIFn4RNLm9fc3ZSXIW05AiEA691wzHW6URrdu1eW2eQY8M0hqOKI9pXjqTHKCvIJZQk="}]},"_npmUser":{"name":"edson25","email":"edsondesouzasales@gmail.com"},"directories":{},"maintainers":[{"name":"ndp-cjr","email":"ndp@cjr.org.br"},{"name":"edson25","email":"edsondesouzasales@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/autho_1.0.1_1687443917063_0.7207889620726247"},"_hasShrinkwrap":false},"1.0.2":{"name":"@cjr-unb/autho","version":"1.0.2","description":"Module for authorization in NestJS built with CASL and integrated with Prisma","author":{"name":"Edson Sales"},"license":"MIT","main":"dist/index.js","types":"dist/index.d.ts","repository":{"type":"git","url":"git+https://github.com/CJR-UnB/autho.git"},"scripts":{"build":"rimraf dist && tsc","prepare":"npm run build"},"dependencies":{"@casl/ability":"^6.5.0","@casl/prisma":"^1.4.0"},"peerDependencies":{"@nestjs/common":"9.X","@nestjs/core":"9.X","@prisma/client":"4.X"},"devDependencies":{"@types/node":"^20.2.5","prisma":"^4.15.0","rimraf":"^5.0.1","typescript":"^5.1.3"},"keywords":["nest","nestjs","casl","prisma","authorization","module","autho"],"gitHead":"bd747bc6f4c44efea7c49c9b0f467664e68bc2d2","bugs":{"url":"https://github.com/CJR-UnB/autho/issues"},"homepage":"https://github.com/CJR-UnB/autho#readme","_id":"@cjr-unb/autho@1.0.2","_nodeVersion":"20.0.0","_npmVersion":"9.6.4","dist":{"integrity":"sha512-uqp3c6o/cIwG+SryWBY8vmfjXTPlAvuIW0LToblT/NREzFMKuYvm1Leqo+lICfqMiO7R3/N73mtgN0JrqYNZFg==","shasum":"24d8cbc16dab030c3e36e12a7d0be45c3e326af8","tarball":"https://registry.npmjs.org/@cjr-unb/autho/-/autho-1.0.2.tgz","fileCount":32,"unpackedSize":45134,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIDdrVXL3rvPopZOkbRijOladWzxBOwm4myyrR27qoMxQAiEA9k0edy9fhuLPe6O3W1CrS8zjZRVgSDu26YHwBzKmV0c="}]},"_npmUser":{"name":"edson25","email":"edsondesouzasales@gmail.com"},"directories":{},"maintainers":[{"name":"ndp-cjr","email":"ndp@cjr.org.br"},{"name":"edson25","email":"edsondesouzasales@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/autho_1.0.2_1687444780573_0.13609997723226464"},"_hasShrinkwrap":false},"1.0.3":{"name":"@cjr-unb/autho","version":"1.0.3","description":"Module for authorization in NestJS built with CASL and integrated with Prisma","author":{"name":"Edson Sales"},"license":"MIT","main":"dist/index.js","types":"dist/index.d.ts","repository":{"type":"git","url":"git+https://github.com/CJR-UnB/autho.git"},"scripts":{"build":"rimraf dist && tsc","prepare":"npm run build"},"dependencies":{"@casl/ability":"^6.5.0","@casl/prisma":"^1.4.0"},"peerDependencies":{"@nestjs/common":"9.X","@nestjs/core":"9.X","@prisma/client":"4.X"},"devDependencies":{"@types/node":"^20.2.5","prisma":"^4.15.0","rimraf":"^5.0.1","typescript":"^5.1.3"},"keywords":["nest","nestjs","casl","prisma","authorization","module","autho"],"gitHead":"cdd9e203e8d2e2f27875ee2ce3a49d30024560f3","bugs":{"url":"https://github.com/CJR-UnB/autho/issues"},"homepage":"https://github.com/CJR-UnB/autho#readme","_id":"@cjr-unb/autho@1.0.3","_nodeVersion":"20.0.0","_npmVersion":"9.6.4","dist":{"integrity":"sha512-ZvtqTjez+wUIBLWVUjv5EMXO4RcwetdlzGEkvwaQa7iKQxif8oTM7AJxvdWQBS51rVjQxxZTO5pwFwWs0ie2Og==","shasum":"5d022ec9b93cf1e41d4b9ed94fe4863599db38c8","tarball":"https://registry.npmjs.org/@cjr-unb/autho/-/autho-1.0.3.tgz","fileCount":32,"unpackedSize":45104,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCpgAx3Q60/puqSvkPU6hCdSBLVBIQ9zMoGtTQzSX/DaQIgR/k6VJI/RjgeenyjuFCSOsbC7UFh3vUaTeUPvO6HfWc="}]},"_npmUser":{"name":"edson25","email":"edsondesouzasales@gmail.com"},"directories":{},"maintainers":[{"name":"edson25","email":"edsondesouzasales@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/autho_1.0.3_1687975064540_0.9182410283929574"},"_hasShrinkwrap":false},"1.1.0":{"name":"@cjr-unb/autho","version":"1.1.0","description":"Module for authorization in NestJS built with CASL and integrated with Prisma","author":{"name":"Edson Sales"},"license":"MIT","main":"dist/index.js","types":"dist/index.d.ts","repository":{"type":"git","url":"git+https://github.com/CJR-UnB/autho.git"},"scripts":{"build":"rimraf dist && tsc","prepare":"npm run build"},"dependencies":{"@casl/ability":"^6.5.0","@casl/prisma":"^1.4.0"},"peerDependencies":{"@nestjs/common":"9.X","@nestjs/core":"9.X","@prisma/client":"4.X"},"devDependencies":{"@types/node":"^20.2.5","prisma":"^4.15.0","rimraf":"^5.0.1","typescript":"^5.1.3"},"keywords":["nest","nestjs","casl","prisma","authorization","module","autho"],"gitHead":"1967f5142f802db329a59267a3de82f3c29f3f3c","bugs":{"url":"https://github.com/CJR-UnB/autho/issues"},"homepage":"https://github.com/CJR-UnB/autho#readme","_id":"@cjr-unb/autho@1.1.0","_nodeVersion":"20.0.0","_npmVersion":"9.6.4","dist":{"integrity":"sha512-hoaO3BDtJ1xj6pt83LvZtuKgoKlrHpDij/6ja8Sj+kTJABDBbRTIKhjLNtAtZXBgjyfV56ML+XbkQi7xrVLbFA==","shasum":"860bc7245eb57943ef1d2b6a726c5c9bc39cf629","tarball":"https://registry.npmjs.org/@cjr-unb/autho/-/autho-1.1.0.tgz","fileCount":32,"unpackedSize":47600,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDjpndFiVL0HBNnnY2yIlE3eMLlQEEfJP6AaeDFtocBQgIhAI7PT5ukHxK3i6EOL9n/gr3kFTAigokJTFoq+zTryg/E"}]},"_npmUser":{"name":"edson25","email":"edsondesouzasales@gmail.com"},"directories":{},"maintainers":[{"name":"edson25","email":"edsondesouzasales@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/autho_1.1.0_1688046226375_0.6481268235499202"},"_hasShrinkwrap":false},"1.1.1":{"name":"@cjr-unb/autho","version":"1.1.1","description":"Module for authorization in NestJS built with CASL and integrated with Prisma","author":{"name":"Edson Sales"},"license":"MIT","main":"dist/index.js","types":"dist/index.d.ts","repository":{"type":"git","url":"git+https://github.com/CJR-UnB/autho.git"},"scripts":{"build":"rimraf dist && tsc","prepare":"npm run build"},"dependencies":{"@casl/ability":"^6.5.0","@casl/prisma":"^1.4.0"},"peerDependencies":{"@nestjs/common":"9.X","@nestjs/core":"9.X","@prisma/client":"4.X"},"devDependencies":{"@types/node":"^20.2.5","prisma":"^4.15.0","rimraf":"^5.0.1","typescript":"^5.1.3"},"keywords":["nest","nestjs","casl","prisma","authorization","module","autho"],"gitHead":"0a359de7201aba5a29b52c56329995cc71a4af6c","bugs":{"url":"https://github.com/CJR-UnB/autho/issues"},"homepage":"https://github.com/CJR-UnB/autho#readme","_id":"@cjr-unb/autho@1.1.1","_nodeVersion":"20.0.0","_npmVersion":"9.6.4","dist":{"integrity":"sha512-fb//n9McFMOvVpWI9ZQ+CyawBH865UU6b6kLEmFiQYZPS17IadJiqZRO8ofFRFv+iJZJHUNGpJmHIlMeCS33FQ==","shasum":"b4878a99e82fd33e5bf7516d4328589bc3b0c4da","tarball":"https://registry.npmjs.org/@cjr-unb/autho/-/autho-1.1.1.tgz","fileCount":32,"unpackedSize":47520,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBbsT4Ze8WA3iGKP4AwvikmK4joeacriJotiIA6gmGwPAiEAq7LCJoRo4IvmKHtUxQuglepyPHdgextBahrBSNIHySo="}]},"_npmUser":{"name":"edson25","email":"edsondesouzasales@gmail.com"},"directories":{},"maintainers":[{"name":"edson25","email":"edsondesouzasales@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/autho_1.1.1_1688046454377_0.8738938706783326"},"_hasShrinkwrap":false}},"maintainers":[{"name":"edson25","email":"edsondesouzasales@gmail.com"}],"description":"Module for authorization in NestJS built with CASL and integrated with Prisma","homepage":"https://github.com/CJR-UnB/autho#readme","keywords":["nest","nestjs","casl","prisma","authorization","module","autho"],"repository":{"type":"git","url":"git+https://github.com/CJR-UnB/autho.git"},"author":{"name":"Edson Sales"},"bugs":{"url":"https://github.com/CJR-UnB/autho/issues"},"license":"MIT","readme":"# @cjr-unb/autho\n\nMódulo para autorização em NestJS construído com CASL e integrado com o Prisma.\n\n# Instalação\n\nÉ necessário ter Nest e o Prisma instalados com pelo menos uma migração executada. Em seguida, execute o comando:\n\n```bash\nnpm install @cjr-unb/autho\n```\n\n# Como usar\n\n## Definindo Regras\n\nDefina as regras de autorização da sua aplicação numa função de callback do tipo Rules. Essa função recebe o tipo do usuário armazenado no token JWT e um objeto com as propriedades _can_, _cannot_ e _user_.\n\n```typescript\nimport { Rules } from \"@cjr-unb/autho\";\nimport { JwtPayload } from \"./auth/dtos/jwt-payload.dto\";\n\nexport const rules: Rules<JwtPayload> = ({ can, cannot, user }) => {\n  // Defina aqui as regras de autorização da sua aplicação. Exemplo:\n\n  if (user.roles.includes(\"admin\")) can(\"manage\", \"all\");\n\n  can(\"update\", \"post\", { authorId: user.id });\n};\n```\n\nOs nomes das possíveis actions são: _manage_, _create_, _read_, _update_ e _delete_.\nOs nomes dos possíveis resources são: _all_ e o nome das entidades do seu banco de dados.\nVocê pode definir actions e resources customizados. Veja a seção [Definindo Actions e Resources Customizados](#definindo-actions-e-resources-customizados).\n\nA definição das regras é feita como descrito na documentação do [CASL](https://casl.js.org/v6/en/guide/define-rules).\n\n## AuthoModule\n\nAdicione o AuthoModule utilizando o método forRoot em um dos módulos da sua aplicação. Os argumentos que o método recebe são:\n\n- **\\<JwtPayload\\>:** Tipo do usuário armazenado no token JWT.\n- Options:\n  - **PrismaModule:** Módulo do prisma que deve exportar o PrismaService\n  - **rules:** Função de callback que contém as regras de autenticação. Recebe um objeto com as propriedades _can_, _cannot_ e _user_.\n  - **userProperty?:** Nome da propriedade que contém o usuário autenticado no objeto request. Default: _user_.\n  - **exceptionIfNotFound?:** Tipo de exceção que deve ser lançada caso o recurso não seja encontrado no banco de dados. Os possíveis valores são: _404_, _403_ e _prisma_. Default: _not found_.\n  - **forbiddenMessage?:** Função que recebe o nome da action e do resource que o usuário não tem permissão para acessar e retorna a mensagem que deve ser exibida na exceção. Caso não seja definida, a mensagem \"Forbidden resource\" será exibida. Default: _undefined_.\n  - **numberIdName?:** Nome da propriedade que contém o id do recurso no Prisma. Deve ser utilizado quando o id do recurso é um número. Você deve escolher entre _numberIdName_ e _stringIdName_.\n    Default: _id_.\n  - **stringIdName?:** Nome da propriedade que contém o id do recurso no Prisma. Deve ser utilizado quando o id do recurso é uma string. Você deve escolher entre _numberIdName_ e _stringIdName_. Default: _undefined_.\n\n```typescript\nimport { AuthoModule } from \"@cjr-unb/autho\";\nimport { JwtPayload } from \"./auth/dtos/jwt-payload.dto\";\nimport { Module } from \"@nestjs/common\";\nimport { PrismaModule } from \"./prisma/prisma.module\";\nimport { rules } from \"./auth/auth.rules\";\n\n@Module({\n  imports: [\n    AuthoModule.forRoot<JwtPayload>({\n      PrismaModule,\n      rules,\n    }),\n  ],\n})\nexport class AppModule {}\n```\n\n## Decorator Ability\n\nAgora você pode utilizar o decorator @Ability em qualquer rota da sua aplicação. O decorator recebe a ação que o usuário está tentando executa, o nome do recurso que ele está tentando acessar e opções adicionais.\n\n```typescript\nimport { Ability } from \"@cjr-unb/autho\";\nimport { Controller, Get, UseGuards } from \"@nestjs/common\";\nimport { AuthGuard } from \"@nestjs/passport\";\n\n@Controller(\"post\")\nexport class PostsController {\n  @Ability(\"read\", \"post\")\n  @UseGuards(AuthGuard(\"jwt\")) // O guard de autenticação deve ser executado antes do guard de autorização\n  @Get()\n  findAll() {\n    // ...\n  }\n}\n```\n\nCaso seja necessário consultar o banco de dados para verificar se o usuário tem permissão para acessar o recurso, você pode utilizar a opção _useDb_. O recurso será buscado através do id passado no parâmetro da rota.\n\nO nome da propriedade que contém o id do recurso no é definido nas opções _numberIdName_ ou _stringIdName_.\n\nSe na sua rota, o nome da propriedade que contém o id do recurso no for diferente do definido na opção _numberIdName_ ou _stringIdName_, você pode passar o nome correto na opção _param_.\n\nCaso o recurso não seja encontrado, o Autho lançará uma exceção do tipo definido na opção _exceptionIfNotFound_.\n\n```typescript\nimport { Ability } from \"@cjr-unb/autho\";\nimport { Controller, Get, UseGuards } from \"@nestjs/common\";\nimport { AuthGuard } from \"@nestjs/passport\";\n\n@Controller(\"post\")\nexport class PostsController {\n  @Ability(\"read\", \"post\", { useDb: true, param: \"postId\" })\n  @UseGuards(AuthGuard(\"jwt\"))\n  @Get(\":postId\")\n  findOne() {\n    // ...\n  }\n}\n```\n\nAgora quando um usuário que não tem permissão tentar acessar a rota, uma exceção do tipo _ForbiddenException_ será lançada.\n\n## Definindo Actions e Resources Customizados\n\nÉ possível definir seus próprios actions e resources customizados criando um tipo que contém as propriedades _action_ e _resource_ e passando esse tipo como parâmetro para a função rules, para o AuthoModule, para o decorator Ability e para a função forbiddenMessage caso ela seja definida.\n\nVocê pode extender as Actions e Resources padrões através dos tipos _DefaultActions_ e _DefaultResources_.\n\n```typescript\nimport { DefaultActions, DefaultResources } from \"@cjr-unb/autho\";\n\nexport type CustomOptions = {\n  actions: \"operate\" | DefaultActions;\n  resources: \"calculator\" | DefaultResources;\n};\n```\n\nNa função rules:\n```typescript\nimport { Rules } from \"@cjr-unb/autho\";\nimport { JwtPayload } from \"./auth/dtos/jwt-payload.dto\";\nimport { CustomOptions } from \"./custom-options\";\n\nexport const rules: Rules<JwtPayload, CustomOptions> = ({\n  can,\n  cannot,\n  user,\n}) => {\n  if (user.roles.includes(\"admin\")) can(\"operate\", \"calculator\");\n};\n```\n\nNo AuthoModule:\n```typescript\nimport { AuthoModule } from \"@cjr-unb/autho\";\nimport { JwtPayload } from \"./auth/dtos/jwt-payload.dto\";\nimport { Module } from \"@nestjs/common\";\nimport { PrismaModule } from \"./prisma/prisma.module\";\nimport { rules } from \"./auth/auth.rules\";\nimport { CustomOptions } from \"./custom-options\";\n\n@Module({\n  imports: [\n    AuthoModule.forRoot<JwtPayload, CustomOptions>({\n      PrismaModule,\n      rules,\n    }),\n  ],\n})\nexport class AppModule {}\n```\n\nNo decorator Ability:\n```typescript\nimport { Ability } from \"@cjr-unb/autho\";\nimport { Controller, Get, UseGuards } from \"@nestjs/common\";\nimport { AuthGuard } from \"@nestjs/passport\";\nimport { CustomOptions } from \"./custom-options\";\n\n@Controller(\"calculator\")\nexport class CalculatorController {\n  @Ability<CustomOptions>(\"operate\", \"calculator\")\n  @UseGuards(AuthGuard(\"jwt\"))\n  @Get()\n  operate() {\n    // ...\n  }\n}\n```\n\n# Limitações\n\nAtualmente, para o funcionamento correto do Autho, é necessário que em todas as models do Prisma o nome da coluna que contém a PK sejam iguais.\n\nAlém disso, o Autho não tem suporte para definição de aliases para as actions.","readmeFilename":"README.pt-br.md"}