[{"data":1,"prerenderedAt":1708},["ShallowReactive",2],{"navigation_docs_hu":3,"-hu-auth-rbac":442,"-hu-auth-rbac-surround":1703},[4,45,60,81,112,129,146,173,197,213,242,280,357,373,385,404,430],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":44},"Kezdő lépések","i-lucide-rocket","\u002Fhu\u002Fgetting-started","hu\u002F1.getting-started",[10,15,20,24,29,34,39],{"title":11,"path":12,"stem":13,"icon":14},"Bevezetés","\u002Fhu\u002Fgetting-started\u002Fintroduction","hu\u002F1.getting-started\u002F1.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Laravelből érkezőknek","\u002Fhu\u002Fgetting-started\u002Fcoming-from-laravel","hu\u002F1.getting-started\u002F2.coming-from-laravel","i-lucide-arrow-right-left",{"title":21,"path":22,"stem":23,"icon":19},"Symfonyból érkezőknek","\u002Fhu\u002Fgetting-started\u002Fcoming-from-symfony","hu\u002F1.getting-started\u002F3.coming-from-symfony",{"title":25,"path":26,"stem":27,"icon":28},"Telepítés","\u002Fhu\u002Fgetting-started\u002Finstallation","hu\u002F1.getting-started\u002F4.installation","i-lucide-download",{"title":30,"path":31,"stem":32,"icon":33},"Az első modulod","\u002Fhu\u002Fgetting-started\u002Ffirst-module","hu\u002F1.getting-started\u002F5.first-module","i-lucide-package-plus",{"title":35,"path":36,"stem":37,"icon":38},"Projektstruktúra","\u002Fhu\u002Fgetting-started\u002Fproject-structure","hu\u002F1.getting-started\u002F6.project-structure","i-lucide-folder-tree",{"title":40,"path":41,"stem":42,"icon":43},"A shop mintaalkalmazás","\u002Fhu\u002Fgetting-started\u002Fsample-app","hu\u002F1.getting-started\u002F7.sample-app","i-lucide-shopping-cart",false,{"title":46,"icon":47,"path":48,"stem":49,"children":50,"page":44},"queue","i-lucide-layers","\u002Fhu\u002Fqueue","hu\u002F10.queue",[51,56],{"title":52,"path":53,"stem":54,"icon":55},"Áttekintés","\u002Fhu\u002Fqueue\u002Foverview","hu\u002F10.queue\u002F1.overview","i-lucide-list-ordered",{"title":57,"path":58,"stem":59,"icon":47},"Taskok","\u002Fhu\u002Fqueue\u002Ftasks","hu\u002F10.queue\u002F2.tasks",{"title":61,"icon":62,"path":63,"stem":64,"children":65,"page":44},"events","i-lucide-workflow","\u002Fhu\u002Fevents","hu\u002F11.events",[66,71,76],{"title":67,"path":68,"stem":69,"icon":70},"Események","\u002Fhu\u002Fevents\u002Foverview","hu\u002F11.events\u002F1.overview","i-lucide-radio",{"title":72,"path":73,"stem":74,"icon":75},"Outbox","\u002Fhu\u002Fevents\u002Foutbox","hu\u002F11.events\u002F2.outbox","i-lucide-inbox",{"title":77,"path":78,"stem":79,"icon":80},"Ütemezés","\u002Fhu\u002Fevents\u002Fscheduler","hu\u002F11.events\u002F3.scheduler","i-lucide-calendar-clock",{"title":82,"icon":83,"path":84,"stem":85,"children":86,"page":44},"auth","i-lucide-shield-check","\u002Fhu\u002Fauth","hu\u002F12.auth",[87,92,97,102,107],{"title":88,"path":89,"stem":90,"icon":91},"Autentikáció","\u002Fhu\u002Fauth\u002Foverview","hu\u002F12.auth\u002F1.overview","i-lucide-key-round",{"title":93,"path":94,"stem":95,"icon":96},"RBAC","\u002Fhu\u002Fauth\u002Frbac","hu\u002F12.auth\u002F2.rbac","i-lucide-users",{"title":98,"path":99,"stem":100,"icon":101},"Policy-k","\u002Fhu\u002Fauth\u002Fpolicy","hu\u002F12.auth\u002F3.policy","i-lucide-gavel",{"title":103,"path":104,"stem":105,"icon":106},"Az auth önálló használata","\u002Fhu\u002Fauth\u002Fstandalone","hu\u002F12.auth\u002F4.standalone","i-lucide-plug",{"title":108,"path":109,"stem":110,"icon":111},"Social login goth-tal, önállóan","\u002Fhu\u002Fauth\u002Fsocial-standalone","hu\u002F12.auth\u002F5.social-standalone","i-lucide-log-in",{"title":113,"icon":114,"path":115,"stem":116,"children":117,"page":44},"mail","i-lucide-mail","\u002Fhu\u002Fmail","hu\u002F13.mail",[118,121,125],{"title":52,"path":119,"stem":120,"icon":114},"\u002Fhu\u002Fmail\u002Foverview","hu\u002F13.mail\u002F1.overview",{"title":122,"path":123,"stem":124,"icon":114},"SMTP","\u002Fhu\u002Fmail\u002Fsmtp","hu\u002F13.mail\u002F2.smtp",{"title":126,"path":127,"stem":128,"icon":114},"MJML","\u002Fhu\u002Fmail\u002Fmjml","hu\u002F13.mail\u002F3.mjml",{"title":130,"icon":131,"path":132,"stem":133,"children":134,"page":44},"notify","i-lucide-bell","\u002Fhu\u002Fnotify","hu\u002F14.notify",[135,138,142],{"title":52,"path":136,"stem":137,"icon":131},"\u002Fhu\u002Fnotify\u002Foverview","hu\u002F14.notify\u002F1.overview",{"title":139,"path":140,"stem":141,"icon":131},"Database csatorna","\u002Fhu\u002Fnotify\u002Fdatabase","hu\u002F14.notify\u002F2.database",{"title":143,"path":144,"stem":145,"icon":131},"Broadcast csatorna","\u002Fhu\u002Fnotify\u002Fbroadcast","hu\u002F14.notify\u002F3.broadcast",{"title":147,"icon":148,"path":149,"stem":150,"children":151,"page":44},"storage","i-lucide-hard-drive","\u002Fhu\u002Fstorage","hu\u002F15.storage",[152,155,159,163,168],{"title":52,"path":153,"stem":154,"icon":148},"\u002Fhu\u002Fstorage\u002Foverview","hu\u002F15.storage\u002F1.overview",{"title":156,"path":157,"stem":158},"Disk API","\u002Fhu\u002Fstorage\u002Fdisk-api","hu\u002F15.storage\u002F2.disk-api",{"title":160,"path":161,"stem":162,"icon":148},"Memória és helyi lemez","\u002Fhu\u002Fstorage\u002Flocal","hu\u002F15.storage\u002F3.local",{"title":164,"path":165,"stem":166,"icon":167},"S3","\u002Fhu\u002Fstorage\u002Fs3","hu\u002F15.storage\u002F4.s3","i-lucide-cloud",{"title":169,"path":170,"stem":171,"icon":172},"Tesztelés","\u002Fhu\u002Fstorage\u002Ftesting","hu\u002F15.storage\u002F5.testing","i-lucide-flask-conical",{"title":174,"icon":175,"path":176,"stem":177,"children":178,"page":44},"telemetry","i-lucide-activity","\u002Fhu\u002Ftelemetry","hu\u002F16.telemetry",[179,182,187,192],{"title":52,"path":180,"stem":181,"icon":175},"\u002Fhu\u002Ftelemetry\u002Foverview","hu\u002F16.telemetry\u002F1.overview",{"title":183,"path":184,"stem":185,"icon":186},"Logolás","\u002Fhu\u002Ftelemetry\u002Flogging","hu\u002F16.telemetry\u002F2.logging","i-lucide-scroll-text",{"title":188,"path":189,"stem":190,"icon":191},"OpenTelemetry","\u002Fhu\u002Ftelemetry\u002Fopentelemetry","hu\u002F16.telemetry\u002F3.opentelemetry","i-lucide-radar",{"title":193,"path":194,"stem":195,"icon":196},"Sentry","\u002Fhu\u002Ftelemetry\u002Fsentry","hu\u002F16.telemetry\u002F4.sentry","i-lucide-bug",{"title":198,"icon":199,"path":200,"stem":201,"children":202,"page":44},"Referencia","i-lucide-book-open","\u002Fhu\u002Freference","hu\u002F17.reference",[203,208],{"title":204,"path":205,"stem":206,"icon":207},"Konfiguráció","\u002Fhu\u002Freference\u002Fconfiguration","hu\u002F17.reference\u002F1.configuration","i-lucide-settings",{"title":209,"path":210,"stem":211,"icon":212},"Külső függőségek","\u002Fhu\u002Freference\u002Fdependencies","hu\u002F17.reference\u002F2.dependencies","i-lucide-package",{"title":214,"icon":215,"path":216,"stem":217,"children":218,"page":44},"Koncepciók","i-lucide-lightbulb","\u002Fhu\u002Fconcepts","hu\u002F2.concepts",[219,223,228,232,237],{"title":220,"path":221,"stem":222,"icon":47},"Architektúra","\u002Fhu\u002Fconcepts\u002Farchitecture","hu\u002F2.concepts\u002F1.architecture",{"title":224,"path":225,"stem":226,"icon":227},"Hibamodell","\u002Fhu\u002Fconcepts\u002Ferror-model","hu\u002F2.concepts\u002F2.error-model","i-lucide-shield-alert",{"title":204,"path":229,"stem":230,"icon":231},"\u002Fhu\u002Fconcepts\u002Fconfiguration","hu\u002F2.concepts\u002F3.configuration","i-lucide-settings-2",{"title":233,"path":234,"stem":235,"icon":236},"Codegen pipeline","\u002Fhu\u002Fconcepts\u002Fcodegen-pipeline","hu\u002F2.concepts\u002F4.codegen-pipeline","i-lucide-file-json",{"title":238,"path":239,"stem":240,"icon":241},"Design patternek","\u002Fhu\u002Fconcepts\u002Fdesign-patterns","hu\u002F2.concepts\u002F5.design-patterns","i-lucide-puzzle",{"title":243,"icon":244,"path":245,"stem":246,"children":247,"page":44},"A kit","i-lucide-box","\u002Fhu\u002Fkit","hu\u002F3.kit",[248,252,257,262,267,271,276],{"title":249,"path":250,"stem":251,"icon":244},"A kit áttekintése","\u002Fhu\u002Fkit\u002Foverview","hu\u002F3.kit\u002F1.overview",{"title":253,"path":254,"stem":255,"icon":256},"Alkalmazás-életciklus","\u002Fhu\u002Fkit\u002Fapp","hu\u002F3.kit\u002F2.app","i-lucide-power",{"title":258,"path":259,"stem":260,"icon":261},"Szerver","\u002Fhu\u002Fkit\u002Fserver","hu\u002F3.kit\u002F3.server","i-lucide-server",{"title":263,"path":264,"stem":265,"icon":266},"Worker","\u002Fhu\u002Fkit\u002Fworker","hu\u002F3.kit\u002F4.worker","i-lucide-cog",{"title":268,"path":269,"stem":270,"icon":70},"Realtime","\u002Fhu\u002Fkit\u002Frealtime","hu\u002F3.kit\u002F5.realtime",{"title":272,"path":273,"stem":274,"icon":275},"Migrációk","\u002Fhu\u002Fkit\u002Fmigrations","hu\u002F3.kit\u002F6.migrations","i-lucide-file-stack",{"title":277,"path":278,"stem":279,"icon":111},"Social login","\u002Fhu\u002Fkit\u002Fsocial-login","hu\u002F3.kit\u002F7.social-login",{"title":281,"icon":282,"path":283,"stem":284,"children":285,"page":44},"CLI referencia","i-lucide-terminal","\u002Fhu\u002Fcli","hu\u002F4.cli",[286,289,294,299,304,309,314,319,324,329,334,338,343,348,352],{"title":52,"path":287,"stem":288,"icon":282},"\u002Fhu\u002Fcli\u002Foverview","hu\u002F4.cli\u002F1.overview",{"title":290,"path":291,"stem":292,"icon":293},"add db","\u002Fhu\u002Fcli\u002Fadd-db","hu\u002F4.cli\u002F10.add-db","i-lucide-database-zap",{"title":295,"path":296,"stem":297,"icon":298},"add compose \u002F add docker","\u002Fhu\u002Fcli\u002Fadd-compose","hu\u002F4.cli\u002F11.add-compose","i-lucide-container",{"title":300,"path":301,"stem":302,"icon":303},"add mail","\u002Fhu\u002Fcli\u002Fadd-mail","hu\u002F4.cli\u002F12.add-mail","i-lucide-mail-plus",{"title":305,"path":306,"stem":307,"icon":308},"add notification","\u002Fhu\u002Fcli\u002Fadd-notification","hu\u002F4.cli\u002F13.add-notification","i-lucide-bell-plus",{"title":310,"path":311,"stem":312,"icon":313},"add realtime","\u002Fhu\u002Fcli\u002Fadd-realtime","hu\u002F4.cli\u002F14.add-realtime","i-lucide-radio-tower",{"title":315,"path":316,"stem":317,"icon":318},"add seeder","\u002Fhu\u002Fcli\u002Fadd-seeder","hu\u002F4.cli\u002F15.add-seeder","i-lucide-sprout",{"title":320,"path":321,"stem":322,"icon":323},"new project","\u002Fhu\u002Fcli\u002Fnew-project","hu\u002F4.cli\u002F2.new-project","i-lucide-folder-plus",{"title":325,"path":326,"stem":327,"icon":328},"new module","\u002Fhu\u002Fcli\u002Fnew-module","hu\u002F4.cli\u002F3.new-module","i-lucide-blocks",{"title":330,"path":331,"stem":332,"icon":333},"add surface","\u002Fhu\u002Fcli\u002Fadd-surface","hu\u002F4.cli\u002F4.add-surface","i-lucide-layers-2",{"title":335,"path":336,"stem":337,"icon":244},"add core","\u002Fhu\u002Fcli\u002Fadd-core","hu\u002F4.cli\u002F5.add-core",{"title":339,"path":340,"stem":341,"icon":342},"add handler","\u002Fhu\u002Fcli\u002Fadd-handler","hu\u002F4.cli\u002F6.add-handler","i-lucide-webhook",{"title":344,"path":345,"stem":346,"icon":347},"new migration","\u002Fhu\u002Fcli\u002Fnew-migration","hu\u002F4.cli\u002F7.new-migration","i-lucide-file-plus",{"title":349,"path":350,"stem":351,"icon":266},"worker generátorok","\u002Fhu\u002Fcli\u002Fworker-generators","hu\u002F4.cli\u002F8.worker-generators",{"title":353,"path":354,"stem":355,"icon":356},"upgrade templates","\u002Fhu\u002Fcli\u002Fupgrade-templates","hu\u002F4.cli\u002F9.upgrade-templates","i-lucide-refresh-cw",{"title":358,"icon":227,"path":359,"stem":360,"children":361,"page":44},"errs","\u002Fhu\u002Ferrs","hu\u002F5.errs",[362,365,369],{"title":52,"path":363,"stem":364,"icon":227},"\u002Fhu\u002Ferrs\u002Foverview","hu\u002F5.errs\u002F1.overview",{"title":366,"path":367,"stem":368},"API","\u002Fhu\u002Ferrs\u002Fapi","hu\u002F5.errs\u002F2.api",{"title":370,"path":371,"stem":372,"icon":227},"Integráció","\u002Fhu\u002Ferrs\u002Fintegration","hu\u002F5.errs\u002F3.integration",{"title":374,"icon":231,"path":375,"stem":376,"children":377,"page":44},"envconf","\u002Fhu\u002Fenvconf","hu\u002F6.envconf",[378,381],{"title":52,"path":379,"stem":380,"icon":231},"\u002Fhu\u002Fenvconf\u002Foverview","hu\u002F6.envconf\u002F1.overview",{"title":382,"path":383,"stem":384},"Receptek","\u002Fhu\u002Fenvconf\u002Frecipes","hu\u002F6.envconf\u002F2.recipes",{"title":386,"icon":387,"path":388,"stem":389,"children":390,"page":44},"httperr","i-lucide-globe","\u002Fhu\u002Fhttperr","hu\u002F7.httperr",[391,394,399],{"title":52,"path":392,"stem":393,"icon":387},"\u002Fhu\u002Fhttperr\u002Foverview","hu\u002F7.httperr\u002F1.overview",{"title":395,"path":396,"stem":397,"icon":398},"Hibaválaszok","\u002Fhu\u002Fhttperr\u002Ferror-responses","hu\u002F7.httperr\u002F2.error-responses","i-lucide-octagon-alert",{"title":400,"path":401,"stem":402,"icon":403},"Validáció","\u002Fhu\u002Fhttperr\u002Fvalidation","hu\u002F7.httperr\u002F3.validation","i-lucide-badge-check",{"title":405,"icon":406,"path":407,"stem":408,"children":409,"page":44},"dbx","i-lucide-database","\u002Fhu\u002Fdbx","hu\u002F8.dbx",[410,413,417,421,426],{"title":52,"path":411,"stem":412,"icon":406},"\u002Fhu\u002Fdbx\u002Foverview","hu\u002F8.dbx\u002F1.overview",{"title":414,"path":415,"stem":416,"icon":106},"pgx","\u002Fhu\u002Fdbx\u002Fpg","hu\u002F8.dbx\u002F2.pg",{"title":418,"path":419,"stem":420,"icon":47},"bun","\u002Fhu\u002Fdbx\u002Fbunx","hu\u002F8.dbx\u002F3.bunx",{"title":422,"path":423,"stem":424,"icon":425},"Tranzakciók","\u002Fhu\u002Fdbx\u002Ftransactions","hu\u002F8.dbx\u002F4.transactions","i-lucide-git-merge",{"title":427,"path":428,"stem":429,"icon":318},"Seederek","\u002Fhu\u002Fdbx\u002Fseed","hu\u002F8.dbx\u002F5.seed",{"title":431,"icon":55,"path":432,"stem":433,"children":434,"page":44},"paginate","\u002Fhu\u002Fpaginate","hu\u002F9.paginate",[435,438],{"title":52,"path":436,"stem":437,"icon":55},"\u002Fhu\u002Fpaginate\u002Foverview","hu\u002F9.paginate\u002F1.overview",{"title":439,"path":440,"stem":441,"icon":19},"Cursor-lapozás","\u002Fhu\u002Fpaginate\u002Fcursor","hu\u002F9.paginate\u002F2.cursor",{"id":443,"title":93,"body":444,"description":1696,"extension":1697,"links":1698,"meta":1699,"navigation":1700,"path":94,"seo":1701,"stem":95,"__hash__":1702},"docs_hu\u002Fhu\u002F12.auth\u002F2.rbac.md",{"type":445,"value":446,"toc":1688},"minimark",[447,456,485,514,559,564,569,659,666,734,749,801,805,814,871,897,900,1086,1102,1106,1132,1367,1374,1431,1453,1457,1485,1506,1513,1517,1543,1636,1646,1650,1684],[448,449,450,451,455],"p",{},"Importáld az ",[452,453,454],"code",{},"rbac"," alcsomagot, hogy szerepeket és jogosultságokat ellenőrizz az autentikált identity fölött:",[457,458,463],"pre",{"className":459,"code":460,"language":461,"meta":462,"style":462},"language-go shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import \"github.com\u002Fgp-system\u002Fauth\u002Frbac\"\n","go","",[452,464,465],{"__ignoreMap":462},[466,467,470,474,478,482],"span",{"class":468,"line":469},"line",1,[466,471,473],{"class":472},"s7zQu","import",[466,475,477],{"class":476},"sMK4o"," \"",[466,479,481],{"class":480},"sBMFI","github.com\u002Fgp-system\u002Fauth\u002Frbac",[466,483,484],{"class":476},"\"\n",[448,486,487,488,490,491,493,494,500,501,507,508,510,511,513],{},"Az ",[452,489,454],{}," az ",[452,492,82],{}," modul szerep- és jogosultság-ellenőrző alcsomagja: szerep- és jogosultság-ellenőrzéseket ad egy autentikált ",[495,496,497],"strong",{},[452,498,499],{},"Identity"," fölött, ami a request contextben utazik. Nem foglal állást arról, honnan jönnek a szerepek: az ",[502,503,504],"a",{"href":89},[452,505,506],{},"auth.Identify"," (vagy bármi más) tölti be az ",[452,509,499],{},"-t, az ",[452,512,454],{}," csak ellenőriz: adatbázis-sémát, user-táblát nem feltételez, és sosem ír választ.",[448,515,516,517,520,521,524,525,520,528,531,532,535,536,539,540,520,543,546,547,550,551,554,555,558],{},"A csomag három szintet fed le: ",[452,518,519],{},"id.HasRole(\"admin\")"," \u002F ",[452,522,523],{},"id.HasPermission(\"orders.view\")"," a legegyszerűbb bool-ellenőrzésekhez, ",[452,526,527],{},"rbac.CheckRole(id, \"admin\")",[452,529,530],{},"rbac.CheckPermission(id, \"orders.view\")",", ami bool helyett ",[452,533,534],{},"ErrUnauthenticated","\u002F",[452,537,538],{},"ErrForbidden","-t ad vissza (akkor hasznos, ha külön nil-ellenőrzés nélkül meg kell különböztetned a \"nincs identity\"-t a \"rossz szerep\"-től), és a gpsystem kit ",[452,541,542],{},"server.RequireRole(\"admin\")",[452,544,545],{},"server.RequirePermission(\"orders.view\")","-ja a route-szintű ",[452,548,549],{},"net\u002Fhttp"," middleware-védelemhez, ami ezt a két sentinelt Problemként rendereli. Egy kit nélküli, csak ",[452,552,553],{},"CheckRole","-ra épülő, kézzel írt middleware-hez lásd az ",[502,556,557],{"href":104},"Önálló használat"," oldalt.",[560,561,563],"h2",{"id":562},"az-identity","Az Identity",[448,565,487,566,568],{},[452,567,499],{}," a hívó, ahogy az authorizációs döntések és az üzleti logika látja: ez a kontraktus az autentikáció és az authorizáció között:",[457,570,572],{"className":459,"code":571,"language":461,"meta":462,"style":462},"type Identity struct {\n    Subject     string         \u002F\u002F a user azonosítója (a JWT sub claimje)\n    Username    string\n    Roles       []string\n    Permissions []string\n    Extra       map[string]any \u002F\u002F a standard mezőkön túli claim-adat (pl. tenant)\n}\n",[452,573,574,588,603,612,623,633,653],{"__ignoreMap":462},[466,575,576,579,582,585],{"class":468,"line":469},[466,577,578],{"class":476},"type",[466,580,581],{"class":480}," Identity",[466,583,584],{"class":476}," struct",[466,586,587],{"class":476}," {\n",[466,589,591,595,599],{"class":468,"line":590},2,[466,592,594],{"class":593},"sTEyZ","    Subject     ",[466,596,598],{"class":597},"spNyl","string",[466,600,602],{"class":601},"sHwdD","         \u002F\u002F a user azonosítója (a JWT sub claimje)\n",[466,604,606,609],{"class":468,"line":605},3,[466,607,608],{"class":593},"    Username    ",[466,610,611],{"class":597},"string\n",[466,613,615,618,621],{"class":468,"line":614},4,[466,616,617],{"class":593},"    Roles       ",[466,619,620],{"class":476},"[]",[466,622,611],{"class":597},[466,624,626,629,631],{"class":468,"line":625},5,[466,627,628],{"class":593},"    Permissions ",[466,630,620],{"class":476},[466,632,611],{"class":597},[466,634,636,639,642,644,647,650],{"class":468,"line":635},6,[466,637,638],{"class":593},"    Extra       ",[466,640,641],{"class":476},"map[",[466,643,598],{"class":597},[466,645,646],{"class":476},"]",[466,648,649],{"class":480},"any",[466,651,652],{"class":601}," \u002F\u002F a standard mezőkön túli claim-adat (pl. tenant)\n",[466,654,656],{"class":468,"line":655},7,[466,657,658],{"class":476},"}\n",[448,660,661,662,665],{},"Két lekérdező metódusa van, mindkettő ",[495,663,664],{},"any-of"," szemantikával: több argumentumból egy találat is elég.",[457,667,669],{"className":459,"code":668,"language":461,"meta":462,"style":462},"id.HasRole(\"admin\", \"editor\")       \u002F\u002F igaz, ha bármelyik szerep megvan\nid.HasPermission(\"orders.view\")     \u002F\u002F igaz, ha a permission megvan\n",[452,670,671,711],{"__ignoreMap":462},[466,672,673,676,679,683,686,689,693,695,698,700,703,705,708],{"class":468,"line":469},[466,674,675],{"class":593},"id",[466,677,678],{"class":476},".",[466,680,682],{"class":681},"s2Zo4","HasRole",[466,684,685],{"class":476},"(",[466,687,688],{"class":476},"\"",[466,690,692],{"class":691},"sfazB","admin",[466,694,688],{"class":476},[466,696,697],{"class":476},",",[466,699,477],{"class":476},[466,701,702],{"class":691},"editor",[466,704,688],{"class":476},[466,706,707],{"class":476},")",[466,709,710],{"class":601},"       \u002F\u002F igaz, ha bármelyik szerep megvan\n",[466,712,713,715,717,720,722,724,727,729,731],{"class":468,"line":590},[466,714,675],{"class":593},[466,716,678],{"class":476},[466,718,719],{"class":681},"HasPermission",[466,721,685],{"class":476},[466,723,688],{"class":476},[466,725,726],{"class":691},"orders.view",[466,728,688],{"class":476},[466,730,707],{"class":476},[466,732,733],{"class":601},"     \u002F\u002F igaz, ha a permission megvan\n",[448,735,736,737,740,741,744,745,748],{},"Mindkettő biztonságosan hívható ",[495,738,739],{},"nil identity-n"," is (ilyenkor ",[452,742,743],{},"false","-t ad); ez illeszkedik ahhoz, hogy a ",[452,746,747],{},"FromContext"," nil-t ad vissza, ha a kérés nem ment át auth middleware-en. Így a guard-kódodban nem kell nil-ellenőrzést írnod:",[457,750,752],{"className":459,"code":751,"language":461,"meta":462,"style":462},"if rbac.FromContext(ctx).HasRole(\"admin\") { \u002F\u002F nil-en is működik, false-t ad\n    \u002F\u002F ...\n}\n",[452,753,754,792,797],{"__ignoreMap":462},[466,755,756,759,762,764,766,768,771,774,776,778,780,782,784,786,789],{"class":468,"line":469},[466,757,758],{"class":472},"if",[466,760,761],{"class":593}," rbac",[466,763,678],{"class":476},[466,765,747],{"class":681},[466,767,685],{"class":476},[466,769,770],{"class":593},"ctx",[466,772,773],{"class":476},").",[466,775,682],{"class":681},[466,777,685],{"class":476},[466,779,688],{"class":476},[466,781,692],{"class":691},[466,783,688],{"class":476},[466,785,707],{"class":476},[466,787,788],{"class":476}," {",[466,790,791],{"class":601}," \u002F\u002F nil-en is működik, false-t ad\n",[466,793,794],{"class":468,"line":590},[466,795,796],{"class":601},"    \u002F\u002F ...\n",[466,798,799],{"class":468,"line":605},[466,800,658],{"class":476},[560,802,804],{"id":803},"withidentity-és-fromcontext","WithIdentity és FromContext",[448,806,487,807,809,810,813],{},[452,808,499],{}," sima ",[452,811,812],{},"context.Context","-ben utazik:",[457,815,817],{"className":459,"code":816,"language":461,"meta":462,"style":462},"ctx = rbac.WithIdentity(ctx, id) \u002F\u002F az auth middleware hívja\nid := rbac.FromContext(ctx)      \u002F\u002F *rbac.Identity, vagy nil auth nélkül\n",[452,818,819,848],{"__ignoreMap":462},[466,820,821,824,827,829,831,834,836,838,840,843,845],{"class":468,"line":469},[466,822,823],{"class":593},"ctx ",[466,825,826],{"class":476},"=",[466,828,761],{"class":593},[466,830,678],{"class":476},[466,832,833],{"class":681},"WithIdentity",[466,835,685],{"class":476},[466,837,770],{"class":593},[466,839,697],{"class":476},[466,841,842],{"class":593}," id",[466,844,707],{"class":476},[466,846,847],{"class":601}," \u002F\u002F az auth middleware hívja\n",[466,849,850,853,856,858,860,862,864,866,868],{"class":468,"line":590},[466,851,852],{"class":593},"id ",[466,854,855],{"class":476},":=",[466,857,761],{"class":593},[466,859,678],{"class":476},[466,861,747],{"class":681},[466,863,685],{"class":476},[466,865,770],{"class":593},[466,867,707],{"class":476},[466,869,870],{"class":601},"      \u002F\u002F *rbac.Identity, vagy nil auth nélkül\n",[448,872,487,873,875,876,878,879,881,882,885,886,888,889,892,893,896],{},[452,874,499],{},", a ",[452,877,833],{}," és a ",[452,880,747],{}," ",[495,883,884],{},"framework-független",": se ",[452,887,549],{},"-importja, se router-importja nincs. Ezért ugyanez a kontraktus használható a HTTP-rétegen kívül is: service-ekben, ",[502,890,891],{"href":68},"listenerekben"," és ",[502,894,895],{"href":78},"jobokban",", ha a contextbe identity került.",[448,898,899],{},"A shopban például a rendeléslistázás service-szinten szűkül a hívóra: az admin mindent lát, a vásárló csak a sajátját.",[457,901,903],{"className":459,"code":902,"language":461,"meta":462,"style":462},"\u002F\u002F internal\u002Fmodules\u002Fshop\u002Fsurfaces\u002Fapi\u002Fservice\u002Forders.go\nfunc (s *Service) ListOrders(ctx context.Context, cursor string) ([]Order, error) {\n    id := rbac.FromContext(ctx)\n    if id.HasRole(\"admin\") {\n        return s.orders.ListAll(ctx, cursor)\n    }\n    return s.orders.ListByUser(ctx, id.Subject, cursor)\n}\n",[452,904,905,910,970,990,1013,1041,1046,1081],{"__ignoreMap":462},[466,906,907],{"class":468,"line":469},[466,908,909],{"class":601},"\u002F\u002F internal\u002Fmodules\u002Fshop\u002Fsurfaces\u002Fapi\u002Fservice\u002Forders.go\n",[466,911,912,915,918,922,925,928,930,933,935,937,940,942,945,947,950,953,955,958,961,963,966,968],{"class":468,"line":590},[466,913,914],{"class":476},"func",[466,916,917],{"class":476}," (",[466,919,921],{"class":920},"sHdIc","s ",[466,923,924],{"class":476},"*",[466,926,927],{"class":480},"Service",[466,929,707],{"class":476},[466,931,932],{"class":681}," ListOrders",[466,934,685],{"class":476},[466,936,770],{"class":920},[466,938,939],{"class":480}," context",[466,941,678],{"class":476},[466,943,944],{"class":480},"Context",[466,946,697],{"class":476},[466,948,949],{"class":920}," cursor",[466,951,952],{"class":597}," string",[466,954,707],{"class":476},[466,956,957],{"class":476}," ([]",[466,959,960],{"class":480},"Order",[466,962,697],{"class":476},[466,964,965],{"class":597}," error",[466,967,707],{"class":476},[466,969,587],{"class":476},[466,971,972,975,977,979,981,983,985,987],{"class":468,"line":605},[466,973,974],{"class":593},"    id ",[466,976,855],{"class":476},[466,978,761],{"class":593},[466,980,678],{"class":476},[466,982,747],{"class":681},[466,984,685],{"class":476},[466,986,770],{"class":593},[466,988,989],{"class":476},")\n",[466,991,992,995,997,999,1001,1003,1005,1007,1009,1011],{"class":468,"line":614},[466,993,994],{"class":472},"    if",[466,996,842],{"class":593},[466,998,678],{"class":476},[466,1000,682],{"class":681},[466,1002,685],{"class":476},[466,1004,688],{"class":476},[466,1006,692],{"class":691},[466,1008,688],{"class":476},[466,1010,707],{"class":476},[466,1012,587],{"class":476},[466,1014,1015,1018,1021,1023,1026,1028,1031,1033,1035,1037,1039],{"class":468,"line":625},[466,1016,1017],{"class":472},"        return",[466,1019,1020],{"class":593}," s",[466,1022,678],{"class":476},[466,1024,1025],{"class":593},"orders",[466,1027,678],{"class":476},[466,1029,1030],{"class":681},"ListAll",[466,1032,685],{"class":476},[466,1034,770],{"class":593},[466,1036,697],{"class":476},[466,1038,949],{"class":593},[466,1040,989],{"class":476},[466,1042,1043],{"class":468,"line":635},[466,1044,1045],{"class":476},"    }\n",[466,1047,1048,1051,1053,1055,1057,1059,1062,1064,1066,1068,1070,1072,1075,1077,1079],{"class":468,"line":655},[466,1049,1050],{"class":472},"    return",[466,1052,1020],{"class":593},[466,1054,678],{"class":476},[466,1056,1025],{"class":593},[466,1058,678],{"class":476},[466,1060,1061],{"class":681},"ListByUser",[466,1063,685],{"class":476},[466,1065,770],{"class":593},[466,1067,697],{"class":476},[466,1069,842],{"class":593},[466,1071,678],{"class":476},[466,1073,1074],{"class":593},"Subject",[466,1076,697],{"class":476},[466,1078,949],{"class":593},[466,1080,989],{"class":476},[466,1082,1084],{"class":468,"line":1083},8,[466,1085,658],{"class":476},[448,1087,1088,1089,1092,1093,1097,1098,1101],{},"Ez ",[495,1090,1091],{},"adat-szűkítés"," (mit lásson), nem hozzáférésdöntés (szabad-e egyáltalán). A kérésenkénti engedélyezés, azaz hogy „megnézheti-e ",[1094,1095,1096],"em",{},"ezt a konkrét"," rendelést\", a ",[502,1099,1100],{"href":99},"policy-k"," dolga.",[560,1103,1105],{"id":1104},"route-guardok","Route-guardok",[448,1107,1108,1109,520,1112,1115,1116,1121,1122,1124,1125,535,1128,1131],{},"A kit ",[452,1110,1111],{},"server.RequireRole",[452,1113,1114],{},"server.RequirePermission"," middleware-ei egy egész route-csoportot védenek. Feltételezik, hogy előttük már futott a ",[502,1117,1118],{"href":89},[452,1119,1120],{},"server.AuthMiddleware","; ők csak a contextbeli ",[452,1123,499],{},"-t vizsgálják, az ",[452,1126,1127],{},"rbac.CheckRole",[452,1129,1130],{},"CheckPermission","-en keresztül, és az eredményt Problemként rendereli.",[457,1133,1135],{"className":459,"code":1134,"language":461,"meta":462,"style":462},"router.Route(\"\u002Fadmin\u002Fshop\", func(r chi.Router) {\n    r.Use(\n        server.AuthMiddleware(deps.Auth), \u002F\u002F Bearer → parse → Identity a contextbe\n        server.RequireRole(\"admin\"),      \u002F\u002F identity nélkül 401, szerep nélkül 403\n    )\n    \u002F\u002F ...\n})\n\n\u002F\u002F permission-alapú változat, any-of szemantikával:\nrouter.Route(\"\u002Freports\", func(r chi.Router) {\n    r.Use(server.AuthMiddleware(deps.Auth),\n        server.RequirePermission(\"reports.view\", \"reports.export\"))\n    \u002F\u002F ...\n})\n",[452,1136,1137,1176,1189,1215,1237,1242,1246,1251,1257,1263,1297,1326,1357,1362],{"__ignoreMap":462},[466,1138,1139,1142,1144,1147,1149,1151,1154,1156,1158,1161,1164,1167,1169,1172,1174],{"class":468,"line":469},[466,1140,1141],{"class":593},"router",[466,1143,678],{"class":476},[466,1145,1146],{"class":681},"Route",[466,1148,685],{"class":476},[466,1150,688],{"class":476},[466,1152,1153],{"class":691},"\u002Fadmin\u002Fshop",[466,1155,688],{"class":476},[466,1157,697],{"class":476},[466,1159,1160],{"class":476}," func(",[466,1162,1163],{"class":920},"r",[466,1165,1166],{"class":480}," chi",[466,1168,678],{"class":476},[466,1170,1171],{"class":480},"Router",[466,1173,707],{"class":476},[466,1175,587],{"class":476},[466,1177,1178,1181,1183,1186],{"class":468,"line":590},[466,1179,1180],{"class":593},"    r",[466,1182,678],{"class":476},[466,1184,1185],{"class":681},"Use",[466,1187,1188],{"class":476},"(\n",[466,1190,1191,1194,1196,1199,1201,1204,1206,1209,1212],{"class":468,"line":605},[466,1192,1193],{"class":593},"        server",[466,1195,678],{"class":476},[466,1197,1198],{"class":681},"AuthMiddleware",[466,1200,685],{"class":476},[466,1202,1203],{"class":593},"deps",[466,1205,678],{"class":476},[466,1207,1208],{"class":593},"Auth",[466,1210,1211],{"class":476},"),",[466,1213,1214],{"class":601}," \u002F\u002F Bearer → parse → Identity a contextbe\n",[466,1216,1217,1219,1221,1224,1226,1228,1230,1232,1234],{"class":468,"line":614},[466,1218,1193],{"class":593},[466,1220,678],{"class":476},[466,1222,1223],{"class":681},"RequireRole",[466,1225,685],{"class":476},[466,1227,688],{"class":476},[466,1229,692],{"class":691},[466,1231,688],{"class":476},[466,1233,1211],{"class":476},[466,1235,1236],{"class":601},"      \u002F\u002F identity nélkül 401, szerep nélkül 403\n",[466,1238,1239],{"class":468,"line":625},[466,1240,1241],{"class":476},"    )\n",[466,1243,1244],{"class":468,"line":635},[466,1245,796],{"class":601},[466,1247,1248],{"class":468,"line":655},[466,1249,1250],{"class":476},"})\n",[466,1252,1253],{"class":468,"line":1083},[466,1254,1256],{"emptyLinePlaceholder":1255},true,"\n",[466,1258,1260],{"class":468,"line":1259},9,[466,1261,1262],{"class":601},"\u002F\u002F permission-alapú változat, any-of szemantikával:\n",[466,1264,1266,1268,1270,1272,1274,1276,1279,1281,1283,1285,1287,1289,1291,1293,1295],{"class":468,"line":1265},10,[466,1267,1141],{"class":593},[466,1269,678],{"class":476},[466,1271,1146],{"class":681},[466,1273,685],{"class":476},[466,1275,688],{"class":476},[466,1277,1278],{"class":691},"\u002Freports",[466,1280,688],{"class":476},[466,1282,697],{"class":476},[466,1284,1160],{"class":476},[466,1286,1163],{"class":920},[466,1288,1166],{"class":480},[466,1290,678],{"class":476},[466,1292,1171],{"class":480},[466,1294,707],{"class":476},[466,1296,587],{"class":476},[466,1298,1300,1302,1304,1306,1308,1311,1313,1315,1317,1319,1321,1323],{"class":468,"line":1299},11,[466,1301,1180],{"class":593},[466,1303,678],{"class":476},[466,1305,1185],{"class":681},[466,1307,685],{"class":476},[466,1309,1310],{"class":593},"server",[466,1312,678],{"class":476},[466,1314,1198],{"class":681},[466,1316,685],{"class":476},[466,1318,1203],{"class":593},[466,1320,678],{"class":476},[466,1322,1208],{"class":593},[466,1324,1325],{"class":476},"),\n",[466,1327,1329,1331,1333,1336,1338,1340,1343,1345,1347,1349,1352,1354],{"class":468,"line":1328},12,[466,1330,1193],{"class":593},[466,1332,678],{"class":476},[466,1334,1335],{"class":681},"RequirePermission",[466,1337,685],{"class":476},[466,1339,688],{"class":476},[466,1341,1342],{"class":691},"reports.view",[466,1344,688],{"class":476},[466,1346,697],{"class":476},[466,1348,477],{"class":476},[466,1350,1351],{"class":691},"reports.export",[466,1353,688],{"class":476},[466,1355,1356],{"class":476},"))\n",[466,1358,1360],{"class":468,"line":1359},13,[466,1361,796],{"class":601},[466,1363,1365],{"class":468,"line":1364},14,[466,1366,1250],{"class":476},[448,1368,1369,1370,1373],{},"A válaszok ",[502,1371,1372],{"href":396},"RFC 9457 problem dokumentumok",":",[1375,1376,1377,1390],"table",{},[1378,1379,1380],"thead",{},[1381,1382,1383,1387],"tr",{},[1384,1385,1386],"th",{},"Helyzet",[1384,1388,1389],{},"Eredmény",[1391,1392,1393,1410,1423],"tbody",{},[1381,1394,1395,1402],{},[1396,1397,1398,1399,1401],"td",{},"nincs ",[452,1400,499],{}," a contextben (nem futott auth)",[1396,1403,1404,881,1407],{},[495,1405,1406],{},"401",[452,1408,1409],{},"authentication required",[1381,1411,1412,1415],{},[1396,1413,1414],{},"van identity, de egyik felsorolt szerep\u002Fpermission sincs meg",[1396,1416,1417,881,1420],{},[495,1418,1419],{},"403",[452,1421,1422],{},"insufficient privileges",[1381,1424,1425,1428],{},[1396,1426,1427],{},"bármelyik felsorolt szerep\u002Fpermission megvan (any-of)",[1396,1429,1430],{},"átengedés",[448,1432,1433,1434,535,1436,1438,1439,535,1441,1443,1444,535,1447,1449,1450,1452],{},"Ez alatt a ",[452,1435,1111],{},[452,1437,1335],{}," közvetlenül az ",[452,1440,1127],{},[452,1442,1130],{},"-t hívja, és az ",[452,1445,1446],{},"rbac.ErrUnauthenticated",[452,1448,538],{},"-t képezi le erre a két státuszra; egy kit nélküli hívó ugyanezt a leképzést kézzel végzi el, ahogy az ",[502,1451,557],{"href":104}," oldal mutatja.",[560,1454,1456],{"id":1455},"a-kittel","A kittel",[448,1458,1459,1460,1462,1463,1465,1466,1469,1470,1473,1474,1477,1478,1481,1482,1484],{},"A shopban a teljes ",[452,1461,692],{}," surface (termék CRUD, képfeltöltés) a fenti párossal van védve: az ",[452,1464,330],{}," által generált ",[452,1467,1468],{},"RegisterAdmin"," függvénybe kerül a middleware, így a védelem surface-szintű, és a testvér ",[452,1471,1472],{},"api"," surface-t nem érinti. A pontos bekötést (és a ",[452,1475,1476],{},"deps.Auth"," mező felvételét) az ",[502,1479,1480],{"href":89},"autentikáció"," oldal mutatja; a surface-per-függvény szerkezetről az ",[502,1483,330],{"href":331}," szól.",[448,1486,1487,1488,1490,1491,1495,1496,1498,1499,535,1502,1505],{},"Ugyanaz az ",[452,1489,499],{}," a HTTP kérés\u002Fválasz-cikluson kívül is felbukkan: a ",[502,1492,1494],{"href":1493},"\u002Fhu\u002Fkit\u002Frealtime#a-gateway","realtime gateway"," minden WebSocket-kapcsolat JWT-jét ",[452,1497,499],{},"-vé oldja fel, és a topicra regisztrált ",[452,1500,1501],{},"Allow",[452,1503,1504],{},"AllowPrefix"," callbackek ellen ellenőrzi, így egy kapcsolat csak olyan csatornákra iratkozhat fel, amelyekre a hívó jogosult.",[448,1507,1508,1509,1512],{},"Finomabb szemcséhez ugyanezek a guardok route-csoport helyett kisebb csoportra is tehetők, de ha a döntés már nem „van-e ilyen szerepe\", hanem „az övé-e ez az erőforrás\", az nem RBAC: arra a ",[502,1510,1511],{"href":99},"policy-réteg"," való.",[560,1514,1516],{"id":1515},"honnan-jönnek-a-szerepek-és-a-permissionök","Honnan jönnek a szerepek és a permissionök",[448,1518,1519,1520,1523,1524,1526,1527,1529,1530,1532,1533,1535,1536,535,1539,1542],{},"A kit alapfelállásában a JWT claimjeiből: a login végpont a ",[452,1521,1522],{},"DefaultClaims","-be írja a user szerepeit és permissionjeit, az auth middleware pedig ezekből tölti az ",[452,1525,499],{}," mezőit. A teljes lánc az ",[502,1528,1480],{"href":89}," oldalon. Mivel az ",[452,1531,454],{}," csak az ",[452,1534,499],{},"-t látja, a forrás lecserélhető: saját claims-típus (",[452,1537,1538],{},"Identify",[452,1540,1541],{},"server.AuthMiddlewareFor","), API-kulcsból épített identity vagy teszt-fixture ugyanúgy működik.",[1544,1545,1546,1553],"tip",{},[448,1547,1548,1549,1552],{},"Teszthez nem kell HTTP: a ",[452,1550,1551],{},"rbac.WithIdentity","-vel közvetlenül a contextbe teheted a kívánt identityt, és a service-réteg úgy viselkedik, mintha a middleware töltötte volna be.",[457,1554,1556],{"className":459,"code":1555,"language":461,"meta":462,"style":462},"ctx := rbac.WithIdentity(t.Context(), &rbac.Identity{\n    Subject: \"u-42\", Roles: []string{\"admin\"},\n})\n",[452,1557,1558,1594,1632],{"__ignoreMap":462},[466,1559,1560,1562,1564,1566,1568,1570,1572,1575,1577,1579,1582,1585,1587,1589,1591],{"class":468,"line":469},[466,1561,823],{"class":593},[466,1563,855],{"class":476},[466,1565,761],{"class":593},[466,1567,678],{"class":476},[466,1569,833],{"class":681},[466,1571,685],{"class":476},[466,1573,1574],{"class":593},"t",[466,1576,678],{"class":476},[466,1578,944],{"class":681},[466,1580,1581],{"class":476},"(),",[466,1583,1584],{"class":476}," &",[466,1586,454],{"class":480},[466,1588,678],{"class":476},[466,1590,499],{"class":480},[466,1592,1593],{"class":476},"{\n",[466,1595,1596,1599,1601,1603,1606,1608,1610,1613,1615,1618,1620,1623,1625,1627,1629],{"class":468,"line":590},[466,1597,1598],{"class":593},"    Subject",[466,1600,1373],{"class":476},[466,1602,477],{"class":476},[466,1604,1605],{"class":691},"u-42",[466,1607,688],{"class":476},[466,1609,697],{"class":476},[466,1611,1612],{"class":593}," Roles",[466,1614,1373],{"class":476},[466,1616,1617],{"class":476}," []",[466,1619,598],{"class":597},[466,1621,1622],{"class":476},"{",[466,1624,688],{"class":476},[466,1626,692],{"class":691},[466,1628,688],{"class":476},[466,1630,1631],{"class":476},"},\n",[466,1633,1634],{"class":468,"line":605},[466,1635,1250],{"class":476},[448,1637,1638,1639,1642,1643,678],{},"A szerep azt mondja meg, a hívó ",[1094,1640,1641],{},"általában"," mit tehet. Ha a döntéshez a konkrét kérés is kell (tulajdonos-e, egy tenantban vannak-e, jó állapotban van-e a rekord), lépj tovább a ",[502,1644,1645],{"href":99},"policy-kra",[560,1647,1649],{"id":1648},"használt-patternek","Használt patternek",[1651,1652,1653,1667],"ul",{},[1654,1655,1656,917,1659,535,1661,1663,1664,678],"li",{},[495,1657,1658],{},"Context-injektált identity",[452,1660,833],{},[452,1662,747],{},", unexported kulccsal, nil-safe metódusok): ",[502,1665,238],{"href":1666},"\u002Fhu\u002Fconcepts\u002Fdesign-patterns#context-injekt%C3%A1lt-f%C3%BCgg%C5%91s%C3%A9g",[1654,1668,1669,917,1672,1675,1676,878,1678,1680,1681,678],{},[495,1670,1671],{},"Magasabb-rendű authorizációs guard",[452,1673,1674],{},"requireFn",", amit a ",[452,1677,1223],{},[452,1679,1335],{}," is megoszt): ",[502,1682,238],{"href":1683},"\u002Fhu\u002Fconcepts\u002Fdesign-patterns#magasabb-rend%C5%B1-authoriz%C3%A1ci%C3%B3s-guard",[1685,1686,1687],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}",{"title":462,"searchDepth":590,"depth":590,"links":1689},[1690,1691,1692,1693,1694,1695],{"id":562,"depth":590,"text":563},{"id":803,"depth":590,"text":804},{"id":1104,"depth":590,"text":1105},{"id":1455,"depth":590,"text":1456},{"id":1515,"depth":590,"text":1516},{"id":1648,"depth":590,"text":1649},"Szerep- és permission-ellenőrzések a contextben utazó Identity fölött: route-guardokkal és service-rétegbeli lekérdezéssel.","md",null,{},{"icon":96},{"title":93,"description":1696},"2Ho0pqkKbPMOHhajnMio2TrWp3Ay9iLj2f6CbamFDho",[1704,1706],{"title":88,"path":89,"stem":90,"description":1705,"icon":91,"children":-1},"JWT-kibocsátás és egy transport-független Identify függvény: stateless auth, framework nélkül.",{"title":98,"path":99,"stem":100,"description":1707,"icon":101,"children":-1},"Kérésenkénti, user-szintű engedélyezés a szerepek fölött: a kontraktusban deklarálva, generált kódból kikényszerítve.",1785445885029]