142142import org .opensearch .security .auditlog .config .AuditConfig .Filter .FilterEntries ;
143143import org .opensearch .security .auditlog .impl .AuditLogImpl ;
144144import org .opensearch .security .auth .BackendRegistry ;
145+ import org .opensearch .security .auth .RolesInjector ;
145146import org .opensearch .security .compliance .ComplianceIndexingOperationListener ;
146147import org .opensearch .security .compliance .ComplianceIndexingOperationListenerImpl ;
147148import org .opensearch .security .configuration .AdminDNs ;
150151import org .opensearch .security .configuration .ConfigurationRepository ;
151152import org .opensearch .security .configuration .DlsFlsRequestValve ;
152153import org .opensearch .security .configuration .DlsFlsValveImpl ;
153- import org .opensearch .security .configuration .PrivilegesInterceptorImpl ;
154154import org .opensearch .security .configuration .SecurityConfigVersionHandler ;
155155import org .opensearch .security .configuration .SecurityFlsDlsIndexSearcherWrapper ;
156156import org .opensearch .security .dlic .rest .api .Endpoint ;
166166import org .opensearch .security .http .XFFResolver ;
167167import org .opensearch .security .identity .SecurePluginSubject ;
168168import org .opensearch .security .identity .SecurityTokenManager ;
169+ import org .opensearch .security .privileges .ConfigurableRoleMapper ;
170+ import org .opensearch .security .privileges .PrivilegesConfiguration ;
169171import org .opensearch .security .privileges .PrivilegesEvaluationContext ;
170172import org .opensearch .security .privileges .PrivilegesEvaluationException ;
171- import org .opensearch .security .privileges .PrivilegesEvaluator ;
172- import org .opensearch .security .privileges .PrivilegesInterceptor ;
173173import org .opensearch .security .privileges .ResourceAccessEvaluator ;
174174import org .opensearch .security .privileges .RestLayerPrivilegesEvaluator ;
175+ import org .opensearch .security .privileges .RoleMapper ;
175176import org .opensearch .security .privileges .actionlevel .RoleBasedActionPrivileges ;
176177import org .opensearch .security .privileges .dlsfls .DlsFlsBaseContext ;
177178import org .opensearch .security .resolver .IndexResolverReplacer ;
@@ -270,7 +271,8 @@ public final class OpenSearchSecurityPlugin extends OpenSearchSecuritySSLPlugin
270271
271272 private boolean sslCertReloadEnabled ;
272273 private volatile SecurityInterceptor si ;
273- private volatile PrivilegesEvaluator evaluator ;
274+ private volatile PrivilegesConfiguration privilegesConfiguration ;
275+ private volatile RoleMapper roleMapper ;
274276 private volatile UserService userService ;
275277 private volatile RestLayerPrivilegesEvaluator restLayerEvaluator ;
276278 private volatile ConfigurationRepository cr ;
@@ -623,19 +625,25 @@ public List<RestHandler> getRestHandlers(
623625 // FGAC enabled == not sslOnly
624626 if (!SSLConfig .isSslOnlyMode ()) {
625627 handlers .add (
626- new SecurityInfoAction (settings , restController , Objects .requireNonNull (evaluator ), Objects .requireNonNull (threadPool ))
628+ new SecurityInfoAction (
629+ settings ,
630+ restController ,
631+ Objects .requireNonNull (privilegesConfiguration ),
632+ Objects .requireNonNull (threadPool )
633+ )
627634 );
628635 handlers .add (
629636 new SecurityHealthAction (
630637 settings ,
631638 restController ,
632639 Objects .requireNonNull (backendRegistry ),
633- Objects .requireNonNull (evaluator )
640+ Objects .requireNonNull (privilegesConfiguration )
634641 )
635642 );
636643 handlers .add (
637644 new DashboardsInfoAction (
638- Objects .requireNonNull (evaluator ),
645+ Objects .requireNonNull (privilegesConfiguration ),
646+ Objects .requireNonNull (cr ),
639647 Objects .requireNonNull (threadPool ),
640648 resourceSharingEnabledSetting
641649 )
@@ -644,7 +652,7 @@ public List<RestHandler> getRestHandlers(
644652 new TenantInfoAction (
645653 settings ,
646654 restController ,
647- Objects .requireNonNull (evaluator ),
655+ Objects .requireNonNull (privilegesConfiguration ),
648656 Objects .requireNonNull (threadPool ),
649657 Objects .requireNonNull (cs ),
650658 Objects .requireNonNull (adminDns ),
@@ -682,7 +690,8 @@ public List<RestHandler> getRestHandlers(
682690 cr ,
683691 cs ,
684692 principalExtractor ,
685- evaluator ,
693+ roleMapper ,
694+ privilegesConfiguration ,
686695 threadPool ,
687696 Objects .requireNonNull (auditLog ),
688697 sslSettingsManager ,
@@ -753,7 +762,8 @@ public void onIndexModule(IndexModule indexModule) {
753762 cs ,
754763 auditLog ,
755764 ciol ,
756- evaluator ,
765+ privilegesConfiguration ,
766+ roleMapper ,
757767 dlsFlsValve ::getCurrentConfig ,
758768 dlsFlsBaseContext
759769 )
@@ -1139,15 +1149,11 @@ public Collection<Object> createComponents(
11391149
11401150 UserFactory userFactory = new UserFactory .Caching (settings );
11411151
1142- final PrivilegesInterceptor privilegesInterceptor ;
1143-
11441152 namedXContentRegistry .set (xContentRegistry );
11451153 if (SSLConfig .isSslOnlyMode ()) {
11461154 auditLog = new NullAuditLog ();
1147- privilegesInterceptor = new PrivilegesInterceptor (resolver , clusterService , localClient , threadPool );
11481155 } else {
11491156 auditLog = new AuditLogImpl (settings , configPath , localClient , threadPool , resolver , clusterService , environment , userFactory );
1150- privilegesInterceptor = new PrivilegesInterceptorImpl (resolver , clusterService , localClient , threadPool );
11511157 }
11521158
11531159 sslExceptionHandler = new AuditLogSslExceptionHandler (auditLog );
@@ -1169,21 +1175,29 @@ public Collection<Object> createComponents(
11691175 final CompatConfig compatConfig = new CompatConfig (environment , transportPassiveAuthSetting );
11701176
11711177 rsIndexHandler = new ResourceSharingIndexHandler (localClient , threadPool , resourcePluginInfo );
1172- evaluator = new PrivilegesEvaluator (
1178+
1179+ RoleMapper roleMapper = new RolesInjector .InjectedRoleMapper (
1180+ new ConfigurableRoleMapper (cr , settings ),
1181+ threadPool .getThreadContext ()
1182+ );
1183+ this .roleMapper = roleMapper ;
1184+
1185+ PrivilegesConfiguration privilegesConfiguration = new PrivilegesConfiguration (
1186+ cr ,
11731187 clusterService ,
11741188 clusterService ::state ,
1189+ localClient ,
1190+ roleMapper ,
11751191 threadPool ,
1176- threadPool .getThreadContext (),
1177- cr ,
11781192 resolver ,
11791193 auditLog ,
11801194 settings ,
1181- privilegesInterceptor ,
1182- cih ,
1195+ cih ::getReasonForUnavailability ,
11831196 irr
11841197 );
1198+ this .privilegesConfiguration = privilegesConfiguration ;
11851199
1186- dlsFlsBaseContext = new DlsFlsBaseContext (evaluator , threadPool .getThreadContext (), adminDns );
1200+ dlsFlsBaseContext = new DlsFlsBaseContext (privilegesConfiguration , threadPool .getThreadContext (), adminDns );
11871201
11881202 if (SSLConfig .isSslOnlyMode ()) {
11891203 dlsFlsValve = new DlsFlsRequestValve .NoopDlsFlsRequestValve ();
@@ -1203,7 +1217,7 @@ public Collection<Object> createComponents(
12031217 cr .subscribeOnChange (configMap -> { ((DlsFlsValveImpl ) dlsFlsValve ).updateConfiguration (cr .getConfiguration (CType .ROLES )); });
12041218 }
12051219
1206- resourceAccessHandler = new ResourceAccessHandler (threadPool , rsIndexHandler , adminDns , evaluator , resourcePluginInfo );
1220+ resourceAccessHandler = new ResourceAccessHandler (threadPool , rsIndexHandler , adminDns , resourcePluginInfo );
12071221
12081222 // Assign resource sharing client to each extension
12091223 // Using the non-gated client (i.e. no additional permissions required)
@@ -1228,7 +1242,7 @@ public Collection<Object> createComponents(
12281242
12291243 sf = new SecurityFilter (
12301244 settings ,
1231- evaluator ,
1245+ privilegesConfiguration ,
12321246 adminDns ,
12331247 dlsFlsValve ,
12341248 auditLog ,
@@ -1249,7 +1263,7 @@ public Collection<Object> createComponents(
12491263 principalExtractor = ReflectionHelper .instantiatePrincipalExtractor (principalExtractorClass );
12501264 }
12511265
1252- restLayerEvaluator = new RestLayerPrivilegesEvaluator (evaluator );
1266+ restLayerEvaluator = new RestLayerPrivilegesEvaluator (privilegesConfiguration );
12531267
12541268 securityRestHandler = new SecurityRestFilter (
12551269 backendRegistry ,
@@ -1266,7 +1280,6 @@ public Collection<Object> createComponents(
12661280 dcf .registerDCFListener (compatConfig );
12671281 dcf .registerDCFListener (irr );
12681282 dcf .registerDCFListener (xffResolver );
1269- dcf .registerDCFListener (evaluator );
12701283 dcf .registerDCFListener (securityRestHandler );
12711284 dcf .registerDCFListener (tokenManager );
12721285 if (!(auditLog instanceof NullAuditLog )) {
@@ -1306,7 +1319,7 @@ public Collection<Object> createComponents(
13061319 components .add (cr );
13071320 components .add (xffResolver );
13081321 components .add (backendRegistry );
1309- components .add (evaluator );
1322+ components .add (privilegesConfiguration );
13101323 components .add (restLayerEvaluator );
13111324 components .add (si );
13121325 components .add (dcf );
@@ -2408,7 +2421,7 @@ public PluginSubject getPluginSubject(Plugin plugin) {
24082421 }
24092422 }
24102423 pluginPermissions .getCluster_permissions ().add (BulkAction .NAME );
2411- evaluator .updatePluginToActionPrivileges (pluginPrincipal , pluginPermissions );
2424+ privilegesConfiguration .updatePluginToActionPrivileges (pluginPrincipal , pluginPermissions );
24122425 }
24132426 return subject ;
24142427 }
0 commit comments