[{"data":1,"prerenderedAt":2108},["ShallowReactive",2],{"navigation_docs":3,"-apps-security-access-control":196,"-apps-security-access-control-surround":2103},[4,127,166],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":36},"Kinotic Apps","i-lucide-rocket","\u002Fapps","1.apps",[10,14,18,37,58,91,106,122],{"title":11,"path":12,"stem":13},"Introduction","\u002Fapps\u002Fintroduction","1.apps\u002F1.introduction",{"title":15,"path":16,"stem":17},"Quick Start","\u002Fapps\u002Fquick-start","1.apps\u002F2.quick-start",{"title":19,"icon":20,"path":21,"stem":22,"children":23,"page":36},"Application Structure","i-lucide-folder-tree","\u002Fapps\u002Fapplication-structure","1.apps\u002F3.application-structure",[24,28,32],{"title":25,"path":26,"stem":27},"Overview","\u002Fapps\u002Fapplication-structure\u002Foverview","1.apps\u002F3.application-structure\u002F1.overview",{"title":29,"path":30,"stem":31},"Applications and Projects","\u002Fapps\u002Fapplication-structure\u002Fapplications-and-projects","1.apps\u002F3.application-structure\u002F2.applications-and-projects",{"title":33,"path":34,"stem":35},"Artifact Types","\u002Fapps\u002Fapplication-structure\u002Fartifact-types","1.apps\u002F3.application-structure\u002F3.artifact-types",false,{"title":38,"icon":39,"path":40,"stem":41,"children":42,"page":36},"Services","i-lucide-network","\u002Fapps\u002Fservices","1.apps\u002F4.services",[43,46,50,54],{"title":25,"path":44,"stem":45},"\u002Fapps\u002Fservices\u002Foverview","1.apps\u002F4.services\u002F1.overview",{"title":47,"path":48,"stem":49},"Publishing Services","\u002Fapps\u002Fservices\u002Fpublishing-services","1.apps\u002F4.services\u002F2.publishing-services",{"title":51,"path":52,"stem":53},"Service Proxies","\u002Fapps\u002Fservices\u002Fservice-proxies","1.apps\u002F4.services\u002F3.service-proxies",{"title":55,"path":56,"stem":57},"Streaming","\u002Fapps\u002Fservices\u002Fstreaming","1.apps\u002F4.services\u002F4.streaming",{"title":59,"icon":60,"path":61,"stem":62,"children":63,"page":36},"Persistence","i-lucide-database","\u002Fapps\u002Fpersistence","1.apps\u002F5.persistence",[64,67,71,75,79,83,87],{"title":25,"path":65,"stem":66},"\u002Fapps\u002Fpersistence\u002Foverview","1.apps\u002F5.persistence\u002F1.overview",{"title":68,"path":69,"stem":70},"Defining Entities","\u002Fapps\u002Fpersistence\u002Fdefining-entities","1.apps\u002F5.persistence\u002F2.defining-entities",{"title":72,"path":73,"stem":74},"Entity Decorators","\u002Fapps\u002Fpersistence\u002Fentity-decorators","1.apps\u002F5.persistence\u002F3.entity-decorators",{"title":76,"path":77,"stem":78},"CRUD Operations","\u002Fapps\u002Fpersistence\u002Fcrud-operations","1.apps\u002F5.persistence\u002F4.crud-operations",{"title":80,"path":81,"stem":82},"Named Queries","\u002Fapps\u002Fpersistence\u002Fnamed-queries","1.apps\u002F5.persistence\u002F5.named-queries",{"title":84,"path":85,"stem":86},"Multi-Tenancy","\u002Fapps\u002Fpersistence\u002Fmulti-tenancy","1.apps\u002F5.persistence\u002F6.multi-tenancy",{"title":88,"path":89,"stem":90},"Migrations","\u002Fapps\u002Fpersistence\u002Fmigrations","1.apps\u002F5.persistence\u002F7.migrations",{"title":92,"icon":93,"path":94,"stem":95,"children":96,"page":36},"Security","i-lucide-shield-check","\u002Fapps\u002Fsecurity","1.apps\u002F6.security",[97,101],{"title":98,"path":99,"stem":100,"icon":93},"Access Control","\u002Fapps\u002Fsecurity\u002Faccess-control","1.apps\u002F6.security\u002F1.access-control",{"title":102,"path":103,"stem":104,"icon":105},"Authentication","\u002Fapps\u002Fsecurity\u002Fauthentication","1.apps\u002F6.security\u002F2.authentication","i-lucide-key-round",{"title":107,"icon":108,"path":109,"stem":110,"children":111,"page":36},"Deployment","i-lucide-cloud-upload","\u002Fapps\u002Fdeployment","1.apps\u002F7.deployment",[112,117],{"title":113,"path":114,"stem":115,"icon":116},"Deployment Workflow","\u002Fapps\u002Fdeployment\u002Fworkflow","1.apps\u002F7.deployment\u002F1.workflow","i-lucide-git-branch",{"title":118,"path":119,"stem":120,"icon":121},"Environments","\u002Fapps\u002Fdeployment\u002Fenvironments","1.apps\u002F7.deployment\u002F2.environments","i-lucide-server",{"title":123,"path":124,"stem":125,"icon":126},"CLI Reference","\u002Fapps\u002Fcli-reference","1.apps\u002F8.cli-reference","i-lucide-terminal",{"title":128,"icon":121,"path":129,"stem":130,"children":131,"page":36},"Kinotic OS","\u002Fplatform","2.platform",[132,137,141,146,151,156,161],{"title":133,"path":134,"stem":135,"icon":136},"System Architecture","\u002Fplatform\u002Farchitecture","2.platform\u002F1.architecture","i-lucide-boxes",{"title":138,"path":139,"stem":140,"icon":6},"Deployment Guide","\u002Fplatform\u002Fdeployment-guide","2.platform\u002F2.deployment-guide",{"title":142,"path":143,"stem":144,"icon":145},"Configuration","\u002Fplatform\u002Fconfiguration","2.platform\u002F3.configuration","i-lucide-settings",{"title":147,"path":148,"stem":149,"icon":150},"Organization Management","\u002Fplatform\u002Forganization-management","2.platform\u002F4.organization-management","i-lucide-building-2",{"title":152,"path":153,"stem":154,"icon":155},"System Security","\u002Fplatform\u002Fsystem-security","2.platform\u002F5.system-security","i-lucide-shield",{"title":157,"path":158,"stem":159,"icon":160},"Observability","\u002Fplatform\u002Fobservability","2.platform\u002F6.observability","i-lucide-activity",{"title":162,"path":163,"stem":164,"icon":165},"Contributing","\u002Fplatform\u002Fcontributing","2.platform\u002F7.contributing","i-lucide-git-pull-request",{"title":167,"icon":168,"path":169,"stem":170,"children":171,"page":36},"Reference","i-lucide-book-open","\u002Freference","3.reference",[172,177,181,186,191],{"title":173,"path":174,"stem":175,"icon":176},"Decorators Reference","\u002Freference\u002Fdecorators","3.reference\u002F1.decorators","i-lucide-at-sign",{"title":178,"path":179,"stem":180,"icon":60},"Migration SQL Grammar","\u002Freference\u002Fmigration-sql-grammar","3.reference\u002F2.migration-sql-grammar",{"title":182,"path":183,"stem":184,"icon":185},"ABAC Expression Language","\u002Freference\u002Fabac-expression-language","3.reference\u002F3.abac-expression-language","i-lucide-file-code",{"title":187,"path":188,"stem":189,"icon":190},"CRI Format","\u002Freference\u002Fcri-format","3.reference\u002F4.cri-format","i-lucide-link",{"title":192,"path":193,"stem":194,"icon":195},"SDK Packages","\u002Freference\u002Fsdk-packages","3.reference\u002F5.sdk-packages","i-lucide-package",{"id":197,"title":98,"body":198,"description":2096,"extension":2097,"links":2098,"meta":2099,"navigation":2100,"path":99,"seo":2101,"stem":100,"__hash__":2102},"docs\u002F1.apps\u002F6.security\u002F1.access-control.md",{"type":199,"value":200,"toc":2078},"minimark",[201,205,223,259,263,266,271,274,300,304,471,475,490,502,512,516,589,593,599,857,861,867,918,922,931,1205,1209,1295,1298,1375,1379,1382,1387,1397,1610,1614,1617,1962,1965,1986,1990,1993,2071,2074],[202,203,25],"h2",{"id":204},"overview",[206,207,208,209,213,214,217,218,222],"p",{},"Kinotic provides a unified policy expression language for controlling access to both ",[210,211,212],"strong",{},"published service methods"," and ",[210,215,216],{},"entity data",". The same ",[219,220,221],"code",{},"@AbacPolicy"," expression syntax works in both contexts — the platform routes enforcement to the appropriate layer based on where the policy is applied.",[224,225,226,239],"table",{},[227,228,229],"thead",{},[230,231,232,236],"tr",{},[233,234,235],"th",{},"Placement",[233,237,238],{},"Enforcement Point",[240,241,242,251],"tbody",{},[230,243,244,248],{},[245,246,247],"td",{},"Service method",[245,249,250],{},"Before invocation -- the call is rejected if the policy fails",[230,252,253,256],{},[245,254,255],{},"Entity decorator",[245,257,258],{},"At the data layer -- unauthorized records are never returned",[202,260,262],{"id":261},"expression-language","Expression Language",[206,264,265],{},"Policy expressions use a simple, developer-friendly syntax with dotted attribute paths, comparison operators, and boolean logic.",[267,268,270],"h3",{"id":269},"attribute-paths","Attribute Paths",[206,272,273],{},"Expressions reference attributes using dotted notation. The root identifier determines what the path resolves against:",[275,276,277,286,294],"ul",{},[278,279,280,285],"li",{},[210,281,282],{},[219,283,284],{},"participant"," — the authenticated caller (roles, department, limits, etc.)",[278,287,288,293],{},[210,289,290],{},[219,291,292],{},"context"," — the request environment (time, IP, etc.)",[278,295,296,299],{},[210,297,298],{},"Any other root"," — resolved against method parameter names (service methods) or the entity being accessed (entity decorators)",[267,301,303],{"id":302},"operators","Operators",[224,305,306,319],{},[227,307,308],{},[230,309,310,313,316],{},[233,311,312],{},"Operator",[233,314,315],{},"Description",[233,317,318],{},"Example",[240,320,321,336,351,366,381,396,411,426,441,456],{},[230,322,323,328,331],{},[245,324,325],{},[219,326,327],{},"==",[245,329,330],{},"Equals",[245,332,333],{},[219,334,335],{},"participant.department == 'engineering'",[230,337,338,343,346],{},[245,339,340],{},[219,341,342],{},"!=",[245,344,345],{},"Not equals",[245,347,348],{},[219,349,350],{},"entity.status != 'archived'",[230,352,353,358,361],{},[245,354,355],{},[219,356,357],{},"\u003C",[245,359,360],{},"Less than",[245,362,363],{},[219,364,365],{},"order.amount \u003C 50000",[230,367,368,373,376],{},[245,369,370],{},[219,371,372],{},">",[245,374,375],{},"Greater than",[245,377,378],{},[219,379,380],{},"entity.priority > 3",[230,382,383,388,391],{},[245,384,385],{},[219,386,387],{},"\u003C=",[245,389,390],{},"Less than or equal",[245,392,393],{},[219,394,395],{},"transfer.amount \u003C= participant.transferLimit",[230,397,398,403,406],{},[245,399,400],{},[219,401,402],{},">=",[245,404,405],{},"Greater than or equal",[245,407,408],{},[219,409,410],{},"entity.score >= 80",[230,412,413,418,421],{},[245,414,415],{},[219,416,417],{},"contains",[245,419,420],{},"Collection membership",[245,422,423],{},[219,424,425],{},"participant.roles contains 'admin'",[230,427,428,433,436],{},[245,429,430],{},[219,431,432],{},"in",[245,434,435],{},"Value in set",[245,437,438],{},[219,439,440],{},"entity.status in ['active', 'pending']",[230,442,443,448,451],{},[245,444,445],{},[219,446,447],{},"exists",[245,449,450],{},"Field presence",[245,452,453],{},[219,454,455],{},"entity.approvedBy exists",[230,457,458,463,466],{},[245,459,460],{},[219,461,462],{},"like",[245,464,465],{},"Pattern match",[245,467,468],{},[219,469,470],{},"entity.email like '*@kinotic.ai'",[267,472,474],{"id":473},"boolean-logic","Boolean Logic",[206,476,477,478,481,482,485,486,489],{},"Combine conditions with ",[219,479,480],{},"and",", ",[219,483,484],{},"or",", and ",[219,487,488],{},"not",". Parentheses override default precedence. Keywords are case-insensitive.",[206,491,492,495,496,481,498,481,500],{},[210,493,494],{},"Precedence"," (highest to lowest): comparisons, ",[219,497,488],{},[219,499,480],{},[219,501,484],{},[503,504,509],"pre",{"className":505,"code":507,"language":508},[506],"language-text","participant.roles contains 'finance' and order.amount \u003C 50000\n\nentity.status in ['active', 'pending'] or participant.department == entity.department\n\nnot entity.deleted == true\n\n(participant.roles contains 'admin' or participant.roles contains 'manager')\n    and entity.classification != 'top-secret'\n","text",[219,510,507],{"__ignoreMap":511},"",[267,513,515],{"id":514},"literals","Literals",[224,517,518,530],{},[227,519,520],{},[230,521,522,525,528],{},[233,523,524],{},"Type",[233,526,527],{},"Syntax",[233,529,318],{},[240,531,532,545,558,571],{},[230,533,534,537,540],{},[245,535,536],{},"String",[245,538,539],{},"Single quotes",[245,541,542],{},[219,543,544],{},"'finance'",[230,546,547,550,553],{},[245,548,549],{},"Integer",[245,551,552],{},"Digits",[245,554,555],{},[219,556,557],{},"50000",[230,559,560,563,566],{},[245,561,562],{},"Decimal",[245,564,565],{},"Digits with dot",[245,567,568],{},[219,569,570],{},"3.14",[230,572,573,576,585],{},[245,574,575],{},"Boolean",[245,577,578,581,582],{},[219,579,580],{},"true"," \u002F ",[219,583,584],{},"false",[245,586,587],{},[219,588,580],{},[202,590,592],{"id":591},"service-method-policies","Service Method Policies",[206,594,595,596,598],{},"Apply ",[219,597,221],{}," to published service methods to enforce authorization before the call reaches the service. The platform evaluates the policy against the method's arguments and the caller's identity.",[503,600,604],{"className":601,"code":602,"language":603,"meta":511,"style":511},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { AbacPolicy, Publish } from '@kinotic-ai\u002Fcore'\n\n@Publish('com.example')\nclass OrderService {\n\n    @AbacPolicy(\"participant.roles contains 'finance' and order.amount \u003C 50000\")\n    placeOrder(order: Order): void {\n        \u002F\u002F Only reached if the caller has the 'finance' role\n        \u002F\u002F AND the order amount is under 50,000\n    }\n\n    @AbacPolicy(\"participant.roles contains 'finance'\")\n    @AbacPolicy(\"transfer.amount \u003C= participant.transferLimit\")\n    transferFunds(transfer: Transfer, approval: Approval): void {\n        \u002F\u002F Multiple policies are combined with AND semantics —\n        \u002F\u002F both must be satisfied\n    }\n}\n","typescript",[219,605,606,645,652,676,690,695,716,743,750,756,762,767,785,802,834,840,846,851],{"__ignoreMap":511},[607,608,611,615,619,623,626,629,632,635,638,642],"span",{"class":609,"line":610},"line",1,[607,612,614],{"class":613},"s7zQu","import",[607,616,618],{"class":617},"sMK4o"," {",[607,620,622],{"class":621},"sTEyZ"," AbacPolicy",[607,624,625],{"class":617},",",[607,627,628],{"class":621}," Publish",[607,630,631],{"class":617}," }",[607,633,634],{"class":613}," from",[607,636,637],{"class":617}," '",[607,639,641],{"class":640},"sfazB","@kinotic-ai\u002Fcore",[607,643,644],{"class":617},"'\n",[607,646,648],{"class":609,"line":647},2,[607,649,651],{"emptyLinePlaceholder":650},true,"\n",[607,653,655,658,662,665,668,671,673],{"class":609,"line":654},3,[607,656,657],{"class":617},"@",[607,659,661],{"class":660},"s2Zo4","Publish",[607,663,664],{"class":621},"(",[607,666,667],{"class":617},"'",[607,669,670],{"class":640},"com.example",[607,672,667],{"class":617},[607,674,675],{"class":621},")\n",[607,677,679,683,687],{"class":609,"line":678},4,[607,680,682],{"class":681},"spNyl","class",[607,684,686],{"class":685},"sBMFI"," OrderService",[607,688,689],{"class":617}," {\n",[607,691,693],{"class":609,"line":692},5,[607,694,651],{"emptyLinePlaceholder":650},[607,696,698,701,704,706,709,712,714],{"class":609,"line":697},6,[607,699,700],{"class":617},"    @",[607,702,703],{"class":660},"AbacPolicy",[607,705,664],{"class":621},[607,707,708],{"class":617},"\"",[607,710,711],{"class":640},"participant.roles contains 'finance' and order.amount \u003C 50000",[607,713,708],{"class":617},[607,715,675],{"class":621},[607,717,719,723,725,729,732,735,738,741],{"class":609,"line":718},7,[607,720,722],{"class":721},"swJcz","    placeOrder",[607,724,664],{"class":617},[607,726,728],{"class":727},"sHdIc","order",[607,730,731],{"class":617},":",[607,733,734],{"class":685}," Order",[607,736,737],{"class":617},"):",[607,739,740],{"class":685}," void",[607,742,689],{"class":617},[607,744,746],{"class":609,"line":745},8,[607,747,749],{"class":748},"sHwdD","        \u002F\u002F Only reached if the caller has the 'finance' role\n",[607,751,753],{"class":609,"line":752},9,[607,754,755],{"class":748},"        \u002F\u002F AND the order amount is under 50,000\n",[607,757,759],{"class":609,"line":758},10,[607,760,761],{"class":617},"    }\n",[607,763,765],{"class":609,"line":764},11,[607,766,651],{"emptyLinePlaceholder":650},[607,768,770,772,774,776,778,781,783],{"class":609,"line":769},12,[607,771,700],{"class":617},[607,773,703],{"class":660},[607,775,664],{"class":621},[607,777,708],{"class":617},[607,779,780],{"class":640},"participant.roles contains 'finance'",[607,782,708],{"class":617},[607,784,675],{"class":621},[607,786,788,790,792,794,796,798,800],{"class":609,"line":787},13,[607,789,700],{"class":617},[607,791,703],{"class":660},[607,793,664],{"class":621},[607,795,708],{"class":617},[607,797,395],{"class":640},[607,799,708],{"class":617},[607,801,675],{"class":621},[607,803,805,808,810,813,815,818,820,823,825,828,830,832],{"class":609,"line":804},14,[607,806,807],{"class":721},"    transferFunds",[607,809,664],{"class":617},[607,811,812],{"class":727},"transfer",[607,814,731],{"class":617},[607,816,817],{"class":685}," Transfer",[607,819,625],{"class":617},[607,821,822],{"class":727}," approval",[607,824,731],{"class":617},[607,826,827],{"class":685}," Approval",[607,829,737],{"class":617},[607,831,740],{"class":685},[607,833,689],{"class":617},[607,835,837],{"class":609,"line":836},15,[607,838,839],{"class":748},"        \u002F\u002F Multiple policies are combined with AND semantics —\n",[607,841,843],{"class":609,"line":842},16,[607,844,845],{"class":748},"        \u002F\u002F both must be satisfied\n",[607,847,849],{"class":609,"line":848},17,[607,850,761],{"class":617},[607,852,854],{"class":609,"line":853},18,[607,855,856],{"class":617},"}\n",[267,858,860],{"id":859},"parameter-name-resolution","Parameter Name Resolution",[206,862,863,864,731],{},"In service method policies, non-reserved root identifiers are resolved against method parameter names. For a method like ",[219,865,866],{},"transferFunds(transfer: Transfer, approval: Approval)",[224,868,869,879],{},[227,870,871],{},[230,872,873,876],{},[233,874,875],{},"Expression Path",[233,877,878],{},"Resolves To",[240,880,881,895,908],{},[230,882,883,888],{},[245,884,885],{},[219,886,887],{},"transfer.amount",[245,889,890,891,894],{},"The ",[219,892,893],{},"amount"," field of the first argument",[230,896,897,902],{},[245,898,899],{},[219,900,901],{},"approval.approved",[245,903,890,904,907],{},[219,905,906],{},"approved"," field of the second argument",[230,909,910,915],{},[245,911,912],{},[219,913,914],{},"participant.roles",[245,916,917],{},"The caller's roles from the security context",[202,919,921],{"id":920},"entity-policies","Entity Policies",[206,923,595,924,926,927,930],{},[219,925,221],{}," to entities via ",[219,928,929],{},"@EntityServiceDecorators"," to enforce authorization at the data layer. Unauthorized records are never returned -- the platform filters them before they reach your code.",[503,932,934],{"className":601,"code":933,"language":603,"meta":511,"style":511},"import { Entity, AutoGeneratedId } from '@kinotic-ai\u002Fpersistence'\nimport { EntityServiceDecorators, $AbacPolicy } from '@kinotic-ai\u002Fpersistence'\n\n@EntityServiceDecorators({\n    allRead: [\n        $AbacPolicy(\"entity.sharedWith contains participant.id\")\n    ],\n    allCreate: [\n        $AbacPolicy(\"participant.roles contains 'editor'\")\n    ],\n    allDelete: [\n        $AbacPolicy(\"participant.roles contains 'admin'\")\n    ]\n})\n@Entity()\nexport class Photo {\n    @AutoGeneratedId\n    id: string | null = null\n    title: string = ''\n    ownerId: string = ''\n    sharedWith: string[] = []\n}\n",[219,935,936,961,985,989,1001,1011,1027,1035,1044,1059,1065,1074,1088,1093,1100,1110,1123,1130,1152,1167,1181,1200],{"__ignoreMap":511},[607,937,938,940,942,945,947,950,952,954,956,959],{"class":609,"line":610},[607,939,614],{"class":613},[607,941,618],{"class":617},[607,943,944],{"class":621}," Entity",[607,946,625],{"class":617},[607,948,949],{"class":621}," AutoGeneratedId",[607,951,631],{"class":617},[607,953,634],{"class":613},[607,955,637],{"class":617},[607,957,958],{"class":640},"@kinotic-ai\u002Fpersistence",[607,960,644],{"class":617},[607,962,963,965,967,970,972,975,977,979,981,983],{"class":609,"line":647},[607,964,614],{"class":613},[607,966,618],{"class":617},[607,968,969],{"class":621}," EntityServiceDecorators",[607,971,625],{"class":617},[607,973,974],{"class":621}," $AbacPolicy",[607,976,631],{"class":617},[607,978,634],{"class":613},[607,980,637],{"class":617},[607,982,958],{"class":640},[607,984,644],{"class":617},[607,986,987],{"class":609,"line":654},[607,988,651],{"emptyLinePlaceholder":650},[607,990,991,993,996,998],{"class":609,"line":678},[607,992,657],{"class":617},[607,994,995],{"class":660},"EntityServiceDecorators",[607,997,664],{"class":621},[607,999,1000],{"class":617},"{\n",[607,1002,1003,1006,1008],{"class":609,"line":692},[607,1004,1005],{"class":721},"    allRead",[607,1007,731],{"class":617},[607,1009,1010],{"class":621}," [\n",[607,1012,1013,1016,1018,1020,1023,1025],{"class":609,"line":697},[607,1014,1015],{"class":660},"        $AbacPolicy",[607,1017,664],{"class":621},[607,1019,708],{"class":617},[607,1021,1022],{"class":640},"entity.sharedWith contains participant.id",[607,1024,708],{"class":617},[607,1026,675],{"class":621},[607,1028,1029,1032],{"class":609,"line":718},[607,1030,1031],{"class":621},"    ]",[607,1033,1034],{"class":617},",\n",[607,1036,1037,1040,1042],{"class":609,"line":745},[607,1038,1039],{"class":721},"    allCreate",[607,1041,731],{"class":617},[607,1043,1010],{"class":621},[607,1045,1046,1048,1050,1052,1055,1057],{"class":609,"line":752},[607,1047,1015],{"class":660},[607,1049,664],{"class":621},[607,1051,708],{"class":617},[607,1053,1054],{"class":640},"participant.roles contains 'editor'",[607,1056,708],{"class":617},[607,1058,675],{"class":621},[607,1060,1061,1063],{"class":609,"line":758},[607,1062,1031],{"class":621},[607,1064,1034],{"class":617},[607,1066,1067,1070,1072],{"class":609,"line":764},[607,1068,1069],{"class":721},"    allDelete",[607,1071,731],{"class":617},[607,1073,1010],{"class":621},[607,1075,1076,1078,1080,1082,1084,1086],{"class":609,"line":769},[607,1077,1015],{"class":660},[607,1079,664],{"class":621},[607,1081,708],{"class":617},[607,1083,425],{"class":640},[607,1085,708],{"class":617},[607,1087,675],{"class":621},[607,1089,1090],{"class":609,"line":787},[607,1091,1092],{"class":621},"    ]\n",[607,1094,1095,1098],{"class":609,"line":804},[607,1096,1097],{"class":617},"}",[607,1099,675],{"class":621},[607,1101,1102,1104,1107],{"class":609,"line":836},[607,1103,657],{"class":617},[607,1105,1106],{"class":660},"Entity",[607,1108,1109],{"class":621},"()\n",[607,1111,1112,1115,1118,1121],{"class":609,"line":842},[607,1113,1114],{"class":613},"export",[607,1116,1117],{"class":681}," class",[607,1119,1120],{"class":685}," Photo",[607,1122,689],{"class":617},[607,1124,1125,1127],{"class":609,"line":848},[607,1126,700],{"class":617},[607,1128,1129],{"class":621},"AutoGeneratedId\n",[607,1131,1132,1135,1137,1140,1143,1146,1149],{"class":609,"line":853},[607,1133,1134],{"class":721},"    id",[607,1136,731],{"class":617},[607,1138,1139],{"class":685}," string",[607,1141,1142],{"class":617}," |",[607,1144,1145],{"class":685}," null",[607,1147,1148],{"class":617}," =",[607,1150,1151],{"class":617}," null\n",[607,1153,1155,1158,1160,1162,1164],{"class":609,"line":1154},19,[607,1156,1157],{"class":721},"    title",[607,1159,731],{"class":617},[607,1161,1139],{"class":685},[607,1163,1148],{"class":617},[607,1165,1166],{"class":617}," ''\n",[607,1168,1170,1173,1175,1177,1179],{"class":609,"line":1169},20,[607,1171,1172],{"class":721},"    ownerId",[607,1174,731],{"class":617},[607,1176,1139],{"class":685},[607,1178,1148],{"class":617},[607,1180,1166],{"class":617},[607,1182,1184,1187,1189,1191,1194,1197],{"class":609,"line":1183},21,[607,1185,1186],{"class":721},"    sharedWith",[607,1188,731],{"class":617},[607,1190,1139],{"class":685},[607,1192,1193],{"class":621},"[] ",[607,1195,1196],{"class":617},"=",[607,1198,1199],{"class":621}," []\n",[607,1201,1203],{"class":609,"line":1202},22,[607,1204,856],{"class":617},[267,1206,1208],{"id":1207},"operation-groups","Operation Groups",[224,1210,1211,1221],{},[227,1212,1213],{},[230,1214,1215,1218],{},[233,1216,1217],{},"Group",[233,1219,1220],{},"Operations Covered",[240,1222,1223,1238,1265,1280],{},[230,1224,1225,1230],{},[245,1226,1227],{},[219,1228,1229],{},"allCreate",[245,1231,1232,481,1235],{},[219,1233,1234],{},"save",[219,1236,1237],{},"bulkSave",[230,1239,1240,1245],{},[245,1241,1242],{},[219,1243,1244],{},"allRead",[245,1246,1247,481,1250,481,1253,481,1256,481,1259,481,1262],{},[219,1248,1249],{},"findById",[219,1251,1252],{},"findByIds",[219,1254,1255],{},"findAll",[219,1257,1258],{},"search",[219,1260,1261],{},"count",[219,1263,1264],{},"countByQuery",[230,1266,1267,1272],{},[245,1268,1269],{},[219,1270,1271],{},"allUpdate",[245,1273,1274,481,1277],{},[219,1275,1276],{},"update",[219,1278,1279],{},"bulkUpdate",[230,1281,1282,1287],{},[245,1283,1284],{},[219,1285,1286],{},"allDelete",[245,1288,1289,481,1292],{},[219,1290,1291],{},"deleteById",[219,1293,1294],{},"deleteByQuery",[206,1296,1297],{},"You can also target individual operations:",[503,1299,1301],{"className":601,"code":1300,"language":603,"meta":511,"style":511},"@EntityServiceDecorators({\n    findAll: [\n        $AbacPolicy(\"entity.status in ['active', 'pending']\")\n    ],\n    deleteById: [\n        $AbacPolicy(\"participant.roles contains 'admin'\")\n    ]\n})\n",[219,1302,1303,1313,1322,1336,1342,1351,1365,1369],{"__ignoreMap":511},[607,1304,1305,1307,1309,1311],{"class":609,"line":610},[607,1306,657],{"class":617},[607,1308,995],{"class":660},[607,1310,664],{"class":621},[607,1312,1000],{"class":617},[607,1314,1315,1318,1320],{"class":609,"line":647},[607,1316,1317],{"class":721},"    findAll",[607,1319,731],{"class":617},[607,1321,1010],{"class":621},[607,1323,1324,1326,1328,1330,1332,1334],{"class":609,"line":654},[607,1325,1015],{"class":660},[607,1327,664],{"class":621},[607,1329,708],{"class":617},[607,1331,440],{"class":640},[607,1333,708],{"class":617},[607,1335,675],{"class":621},[607,1337,1338,1340],{"class":609,"line":678},[607,1339,1031],{"class":621},[607,1341,1034],{"class":617},[607,1343,1344,1347,1349],{"class":609,"line":692},[607,1345,1346],{"class":721},"    deleteById",[607,1348,731],{"class":617},[607,1350,1010],{"class":621},[607,1352,1353,1355,1357,1359,1361,1363],{"class":609,"line":697},[607,1354,1015],{"class":660},[607,1356,664],{"class":621},[607,1358,708],{"class":617},[607,1360,425],{"class":640},[607,1362,708],{"class":617},[607,1364,675],{"class":621},[607,1366,1367],{"class":609,"line":718},[607,1368,1092],{"class":621},[607,1370,1371,1373],{"class":609,"line":745},[607,1372,1097],{"class":617},[607,1374,675],{"class":621},[267,1376,1378],{"id":1377},"dynamic-resource-sharing","Dynamic Resource Sharing",[206,1380,1381],{},"Entity policies enable user-driven access control without creating dynamic policies. The policies themselves stay static — only the entity data changes.",[206,1383,1384],{},[210,1385,1386],{},"Example: Photo sharing",[206,1388,1389,1390,1392,1393,1396],{},"The policy ",[219,1391,1022],{}," never changes. When a user shares a photo, the application updates the photo's ",[219,1394,1395],{},"sharedWith"," array. The next time anyone queries photos, the policy filters results to only include photos shared with the caller.",[503,1398,1400],{"className":601,"code":1399,"language":603,"meta":511,"style":511},"class PhotoService {\n    async sharePhoto(photoId: string, userId: string): Promise\u003Cvoid> {\n        const photo = await this.photoEntityService.findById(photoId)\n        photo.sharedWith.push(userId)\n        await this.photoEntityService.update(photo)\n    }\n\n    \u002F\u002F No authorization code here — the EntityService policy handles it\n    async getMyPhotos(): Promise\u003CPhoto[]> {\n        return await this.photoEntityService.findAll({ page: 0, size: 100 })\n    }\n}\n",[219,1401,1402,1411,1451,1481,1502,1522,1526,1530,1535,1559,1602,1606],{"__ignoreMap":511},[607,1403,1404,1406,1409],{"class":609,"line":610},[607,1405,682],{"class":681},[607,1407,1408],{"class":685}," PhotoService",[607,1410,689],{"class":617},[607,1412,1413,1416,1419,1421,1424,1426,1428,1430,1433,1435,1437,1439,1442,1444,1447,1449],{"class":609,"line":647},[607,1414,1415],{"class":681},"    async",[607,1417,1418],{"class":721}," sharePhoto",[607,1420,664],{"class":617},[607,1422,1423],{"class":727},"photoId",[607,1425,731],{"class":617},[607,1427,1139],{"class":685},[607,1429,625],{"class":617},[607,1431,1432],{"class":727}," userId",[607,1434,731],{"class":617},[607,1436,1139],{"class":685},[607,1438,737],{"class":617},[607,1440,1441],{"class":685}," Promise",[607,1443,357],{"class":617},[607,1445,1446],{"class":685},"void",[607,1448,372],{"class":617},[607,1450,689],{"class":617},[607,1452,1453,1456,1459,1461,1464,1467,1470,1473,1475,1477,1479],{"class":609,"line":654},[607,1454,1455],{"class":681},"        const",[607,1457,1458],{"class":621}," photo",[607,1460,1148],{"class":617},[607,1462,1463],{"class":613}," await",[607,1465,1466],{"class":617}," this.",[607,1468,1469],{"class":621},"photoEntityService",[607,1471,1472],{"class":617},".",[607,1474,1249],{"class":660},[607,1476,664],{"class":721},[607,1478,1423],{"class":621},[607,1480,675],{"class":721},[607,1482,1483,1486,1488,1490,1492,1495,1497,1500],{"class":609,"line":678},[607,1484,1485],{"class":621},"        photo",[607,1487,1472],{"class":617},[607,1489,1395],{"class":621},[607,1491,1472],{"class":617},[607,1493,1494],{"class":660},"push",[607,1496,664],{"class":721},[607,1498,1499],{"class":621},"userId",[607,1501,675],{"class":721},[607,1503,1504,1507,1509,1511,1513,1515,1517,1520],{"class":609,"line":692},[607,1505,1506],{"class":613},"        await",[607,1508,1466],{"class":617},[607,1510,1469],{"class":621},[607,1512,1472],{"class":617},[607,1514,1276],{"class":660},[607,1516,664],{"class":721},[607,1518,1519],{"class":621},"photo",[607,1521,675],{"class":721},[607,1523,1524],{"class":609,"line":697},[607,1525,761],{"class":617},[607,1527,1528],{"class":609,"line":718},[607,1529,651],{"emptyLinePlaceholder":650},[607,1531,1532],{"class":609,"line":745},[607,1533,1534],{"class":748},"    \u002F\u002F No authorization code here — the EntityService policy handles it\n",[607,1536,1537,1539,1542,1545,1547,1549,1552,1555,1557],{"class":609,"line":752},[607,1538,1415],{"class":681},[607,1540,1541],{"class":721}," getMyPhotos",[607,1543,1544],{"class":617},"():",[607,1546,1441],{"class":685},[607,1548,357],{"class":617},[607,1550,1551],{"class":685},"Photo",[607,1553,1554],{"class":621},"[]",[607,1556,372],{"class":617},[607,1558,689],{"class":617},[607,1560,1561,1564,1566,1568,1570,1572,1574,1576,1579,1582,1584,1588,1590,1593,1595,1598,1600],{"class":609,"line":758},[607,1562,1563],{"class":613},"        return",[607,1565,1463],{"class":613},[607,1567,1466],{"class":617},[607,1569,1469],{"class":621},[607,1571,1472],{"class":617},[607,1573,1255],{"class":660},[607,1575,664],{"class":721},[607,1577,1578],{"class":617},"{",[607,1580,1581],{"class":721}," page",[607,1583,731],{"class":617},[607,1585,1587],{"class":1586},"sbssI"," 0",[607,1589,625],{"class":617},[607,1591,1592],{"class":721}," size",[607,1594,731],{"class":617},[607,1596,1597],{"class":1586}," 100",[607,1599,631],{"class":617},[607,1601,675],{"class":721},[607,1603,1604],{"class":609,"line":764},[607,1605,761],{"class":617},[607,1607,1608],{"class":609,"line":769},[607,1609,856],{"class":617},[202,1611,1613],{"id":1612},"combining-both-layers","Combining Both Layers",[206,1615,1616],{},"Service method policies and entity policies work together:",[503,1618,1620],{"className":601,"code":1619,"language":603,"meta":511,"style":511},"\u002F\u002F Service-level enforcement — can this caller use this service at all?\n@Publish('com.example')\nclass PhotoService {\n\n    @AbacPolicy(\"participant.roles contains 'user'\")\n    async sharePhoto(photoId: string, userId: string): Promise\u003Cvoid> {\n        const photo = await this.photoEntityService.findById(photoId)\n        photo.sharedWith.push(userId)\n        await this.photoEntityService.update(photo)\n    }\n}\n\n\u002F\u002F Persistence enforcement — which photos can this caller see?\n@EntityServiceDecorators({\n    allRead: [\n        $AbacPolicy(\"entity.ownerId == participant.id or entity.sharedWith contains participant.id\")\n    ],\n    allCreate: [\n        $AbacPolicy(\"participant.roles contains 'user'\")\n    ],\n    allDelete: [\n        $AbacPolicy(\"entity.ownerId == participant.id\")\n    ]\n})\n@Entity()\nexport class Photo {\n    @AutoGeneratedId\n    id: string | null = null\n    ownerId: string = ''\n    sharedWith: string[] = []\n}\n",[219,1621,1622,1627,1643,1651,1655,1672,1706,1730,1748,1766,1770,1774,1778,1783,1793,1801,1816,1822,1830,1844,1850,1858,1873,1878,1885,1894,1905,1912,1929,1942,1957],{"__ignoreMap":511},[607,1623,1624],{"class":609,"line":610},[607,1625,1626],{"class":748},"\u002F\u002F Service-level enforcement — can this caller use this service at all?\n",[607,1628,1629,1631,1633,1635,1637,1639,1641],{"class":609,"line":647},[607,1630,657],{"class":617},[607,1632,661],{"class":660},[607,1634,664],{"class":621},[607,1636,667],{"class":617},[607,1638,670],{"class":640},[607,1640,667],{"class":617},[607,1642,675],{"class":621},[607,1644,1645,1647,1649],{"class":609,"line":654},[607,1646,682],{"class":681},[607,1648,1408],{"class":685},[607,1650,689],{"class":617},[607,1652,1653],{"class":609,"line":678},[607,1654,651],{"emptyLinePlaceholder":650},[607,1656,1657,1659,1661,1663,1665,1668,1670],{"class":609,"line":692},[607,1658,700],{"class":617},[607,1660,703],{"class":660},[607,1662,664],{"class":621},[607,1664,708],{"class":617},[607,1666,1667],{"class":640},"participant.roles contains 'user'",[607,1669,708],{"class":617},[607,1671,675],{"class":621},[607,1673,1674,1676,1678,1680,1682,1684,1686,1688,1690,1692,1694,1696,1698,1700,1702,1704],{"class":609,"line":697},[607,1675,1415],{"class":681},[607,1677,1418],{"class":721},[607,1679,664],{"class":617},[607,1681,1423],{"class":727},[607,1683,731],{"class":617},[607,1685,1139],{"class":685},[607,1687,625],{"class":617},[607,1689,1432],{"class":727},[607,1691,731],{"class":617},[607,1693,1139],{"class":685},[607,1695,737],{"class":617},[607,1697,1441],{"class":685},[607,1699,357],{"class":617},[607,1701,1446],{"class":685},[607,1703,372],{"class":617},[607,1705,689],{"class":617},[607,1707,1708,1710,1712,1714,1716,1718,1720,1722,1724,1726,1728],{"class":609,"line":718},[607,1709,1455],{"class":681},[607,1711,1458],{"class":621},[607,1713,1148],{"class":617},[607,1715,1463],{"class":613},[607,1717,1466],{"class":617},[607,1719,1469],{"class":621},[607,1721,1472],{"class":617},[607,1723,1249],{"class":660},[607,1725,664],{"class":721},[607,1727,1423],{"class":621},[607,1729,675],{"class":721},[607,1731,1732,1734,1736,1738,1740,1742,1744,1746],{"class":609,"line":745},[607,1733,1485],{"class":621},[607,1735,1472],{"class":617},[607,1737,1395],{"class":621},[607,1739,1472],{"class":617},[607,1741,1494],{"class":660},[607,1743,664],{"class":721},[607,1745,1499],{"class":621},[607,1747,675],{"class":721},[607,1749,1750,1752,1754,1756,1758,1760,1762,1764],{"class":609,"line":752},[607,1751,1506],{"class":613},[607,1753,1466],{"class":617},[607,1755,1469],{"class":621},[607,1757,1472],{"class":617},[607,1759,1276],{"class":660},[607,1761,664],{"class":721},[607,1763,1519],{"class":621},[607,1765,675],{"class":721},[607,1767,1768],{"class":609,"line":758},[607,1769,761],{"class":617},[607,1771,1772],{"class":609,"line":764},[607,1773,856],{"class":617},[607,1775,1776],{"class":609,"line":769},[607,1777,651],{"emptyLinePlaceholder":650},[607,1779,1780],{"class":609,"line":787},[607,1781,1782],{"class":748},"\u002F\u002F Persistence enforcement — which photos can this caller see?\n",[607,1784,1785,1787,1789,1791],{"class":609,"line":804},[607,1786,657],{"class":617},[607,1788,995],{"class":660},[607,1790,664],{"class":621},[607,1792,1000],{"class":617},[607,1794,1795,1797,1799],{"class":609,"line":836},[607,1796,1005],{"class":721},[607,1798,731],{"class":617},[607,1800,1010],{"class":621},[607,1802,1803,1805,1807,1809,1812,1814],{"class":609,"line":842},[607,1804,1015],{"class":660},[607,1806,664],{"class":621},[607,1808,708],{"class":617},[607,1810,1811],{"class":640},"entity.ownerId == participant.id or entity.sharedWith contains participant.id",[607,1813,708],{"class":617},[607,1815,675],{"class":621},[607,1817,1818,1820],{"class":609,"line":848},[607,1819,1031],{"class":621},[607,1821,1034],{"class":617},[607,1823,1824,1826,1828],{"class":609,"line":853},[607,1825,1039],{"class":721},[607,1827,731],{"class":617},[607,1829,1010],{"class":621},[607,1831,1832,1834,1836,1838,1840,1842],{"class":609,"line":1154},[607,1833,1015],{"class":660},[607,1835,664],{"class":621},[607,1837,708],{"class":617},[607,1839,1667],{"class":640},[607,1841,708],{"class":617},[607,1843,675],{"class":621},[607,1845,1846,1848],{"class":609,"line":1169},[607,1847,1031],{"class":621},[607,1849,1034],{"class":617},[607,1851,1852,1854,1856],{"class":609,"line":1183},[607,1853,1069],{"class":721},[607,1855,731],{"class":617},[607,1857,1010],{"class":621},[607,1859,1860,1862,1864,1866,1869,1871],{"class":609,"line":1202},[607,1861,1015],{"class":660},[607,1863,664],{"class":621},[607,1865,708],{"class":617},[607,1867,1868],{"class":640},"entity.ownerId == participant.id",[607,1870,708],{"class":617},[607,1872,675],{"class":621},[607,1874,1876],{"class":609,"line":1875},23,[607,1877,1092],{"class":621},[607,1879,1881,1883],{"class":609,"line":1880},24,[607,1882,1097],{"class":617},[607,1884,675],{"class":621},[607,1886,1888,1890,1892],{"class":609,"line":1887},25,[607,1889,657],{"class":617},[607,1891,1106],{"class":660},[607,1893,1109],{"class":621},[607,1895,1897,1899,1901,1903],{"class":609,"line":1896},26,[607,1898,1114],{"class":613},[607,1900,1117],{"class":681},[607,1902,1120],{"class":685},[607,1904,689],{"class":617},[607,1906,1908,1910],{"class":609,"line":1907},27,[607,1909,700],{"class":617},[607,1911,1129],{"class":621},[607,1913,1915,1917,1919,1921,1923,1925,1927],{"class":609,"line":1914},28,[607,1916,1134],{"class":721},[607,1918,731],{"class":617},[607,1920,1139],{"class":685},[607,1922,1142],{"class":617},[607,1924,1145],{"class":685},[607,1926,1148],{"class":617},[607,1928,1151],{"class":617},[607,1930,1932,1934,1936,1938,1940],{"class":609,"line":1931},29,[607,1933,1172],{"class":721},[607,1935,731],{"class":617},[607,1937,1139],{"class":685},[607,1939,1148],{"class":617},[607,1941,1166],{"class":617},[607,1943,1945,1947,1949,1951,1953,1955],{"class":609,"line":1944},30,[607,1946,1186],{"class":721},[607,1948,731],{"class":617},[607,1950,1139],{"class":685},[607,1952,1193],{"class":621},[607,1954,1196],{"class":617},[607,1956,1199],{"class":621},[607,1958,1960],{"class":609,"line":1959},31,[607,1961,856],{"class":617},[206,1963,1964],{},"In this example:",[275,1966,1967,1977,1980,1983],{},[278,1968,1969,1970,1973,1974],{},"The platform ensures only authenticated users with the ",[219,1971,1972],{},"'user'"," role can call ",[219,1975,1976],{},"sharePhoto",[278,1978,1979],{},"The persistence layer ensures users only see photos they own or that are shared with them",[278,1981,1982],{},"Only the photo owner can delete their photos",[278,1984,1985],{},"The service code contains zero authorization logic — the platform handles it",[202,1987,1989],{"id":1988},"role-based-access-control","Role-Based Access Control",[206,1991,1992],{},"ABAC policies can express pure role-based checks:",[503,1994,1996],{"className":601,"code":1995,"language":603,"meta":511,"style":511},"\u002F\u002F Only admins\n@AbacPolicy(\"participant.roles contains 'admin'\")\n\n\u002F\u002F Admin or manager\n@AbacPolicy(\"participant.roles contains 'admin' or participant.roles contains 'manager'\")\n\n\u002F\u002F Must have both roles\n@AbacPolicy(\"participant.roles contains 'finance' and participant.roles contains 'approver'\")\n",[219,1997,1998,2003,2019,2023,2028,2045,2049,2054],{"__ignoreMap":511},[607,1999,2000],{"class":609,"line":610},[607,2001,2002],{"class":748},"\u002F\u002F Only admins\n",[607,2004,2005,2007,2009,2011,2013,2015,2017],{"class":609,"line":647},[607,2006,657],{"class":617},[607,2008,703],{"class":660},[607,2010,664],{"class":621},[607,2012,708],{"class":617},[607,2014,425],{"class":640},[607,2016,708],{"class":617},[607,2018,675],{"class":621},[607,2020,2021],{"class":609,"line":654},[607,2022,651],{"emptyLinePlaceholder":650},[607,2024,2025],{"class":609,"line":678},[607,2026,2027],{"class":748},"\u002F\u002F Admin or manager\n",[607,2029,2030,2032,2034,2036,2038,2041,2043],{"class":609,"line":692},[607,2031,657],{"class":617},[607,2033,703],{"class":660},[607,2035,664],{"class":621},[607,2037,708],{"class":617},[607,2039,2040],{"class":640},"participant.roles contains 'admin' or participant.roles contains 'manager'",[607,2042,708],{"class":617},[607,2044,675],{"class":621},[607,2046,2047],{"class":609,"line":697},[607,2048,651],{"emptyLinePlaceholder":650},[607,2050,2051],{"class":609,"line":718},[607,2052,2053],{"class":748},"\u002F\u002F Must have both roles\n",[607,2055,2056,2058,2060,2062,2064,2067,2069],{"class":609,"line":745},[607,2057,657],{"class":617},[607,2059,703],{"class":660},[607,2061,664],{"class":621},[607,2063,708],{"class":617},[607,2065,2066],{"class":640},"participant.roles contains 'finance' and participant.roles contains 'approver'",[607,2068,708],{"class":617},[607,2070,675],{"class":621},[206,2072,2073],{},"RBAC is a subset of ABAC — no separate role-checking mechanism is needed.",[2075,2076,2077],"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 .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}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}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 .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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":511,"searchDepth":647,"depth":647,"links":2079},[2080,2081,2087,2090,2094,2095],{"id":204,"depth":647,"text":25},{"id":261,"depth":647,"text":262,"children":2082},[2083,2084,2085,2086],{"id":269,"depth":654,"text":270},{"id":302,"depth":654,"text":303},{"id":473,"depth":654,"text":474},{"id":514,"depth":654,"text":515},{"id":591,"depth":647,"text":592,"children":2088},[2089],{"id":859,"depth":654,"text":860},{"id":920,"depth":647,"text":921,"children":2091},[2092,2093],{"id":1207,"depth":654,"text":1208},{"id":1377,"depth":654,"text":1378},{"id":1612,"depth":647,"text":1613},{"id":1988,"depth":647,"text":1989},"Attribute-Based Access Control (ABAC) for published services and entity data.","md",null,{},{"icon":93},{"title":98,"description":2096},"4Z9adKjjoOErh22IW0o1swpRYRXdQcrD3qH9G5A2c7U",[2104,2106],{"title":88,"path":89,"stem":90,"description":2105,"children":-1},"Schema evolution using versioned migration scripts for Kinotic's persistence layer.",{"title":102,"path":103,"stem":104,"description":2107,"icon":105,"children":-1},"Authentication methods and identity management in Kinotic.",1775187765503]