@@ -139,7 +139,8 @@ func Filter[O Objecter](ctx context.Context, auth Authorizer, subject Subject, a
139
139
140
140
// RegoAuthorizer will use a prepared rego query for performing authorize()
141
141
type RegoAuthorizer struct {
142
- query rego.PreparedEvalQuery
142
+ query rego.PreparedEvalQuery
143
+ partialQuery rego.PreparedPartialQuery
143
144
144
145
authorizeHist * prometheus.HistogramVec
145
146
prepareHist prometheus.Histogram
@@ -151,9 +152,10 @@ var (
151
152
// Load the policy from policy.rego in this directory.
152
153
//
153
154
//go:embed policy.rego
154
- policy string
155
- queryOnce sync.Once
156
- query rego.PreparedEvalQuery
155
+ policy string
156
+ queryOnce sync.Once
157
+ query rego.PreparedEvalQuery
158
+ partialQuery rego.PreparedPartialQuery
157
159
)
158
160
159
161
func NewAuthorizer (registry prometheus.Registerer ) * RegoAuthorizer {
@@ -166,6 +168,21 @@ func NewAuthorizer(registry prometheus.Registerer) *RegoAuthorizer {
166
168
if err != nil {
167
169
panic (xerrors .Errorf ("compile rego: %w" , err ))
168
170
}
171
+
172
+ partialQuery , err = rego .New (
173
+ rego .Unknowns ([]string {
174
+ "input.object.id" ,
175
+ "input.object.owner" ,
176
+ "input.object.org_owner" ,
177
+ "input.object.acl_user_list" ,
178
+ "input.object.acl_group_list" ,
179
+ }),
180
+ rego .Query ("data.authz.allow = true" ),
181
+ rego .Module ("policy.rego" , policy ),
182
+ ).PrepareForPartial (context .Background ())
183
+ if err != nil {
184
+ panic (xerrors .Errorf ("compile partial rego: %w" , err ))
185
+ }
169
186
})
170
187
171
188
// Register metrics to prometheus.
@@ -207,7 +224,8 @@ func NewAuthorizer(registry prometheus.Registerer) *RegoAuthorizer {
207
224
})
208
225
209
226
return & RegoAuthorizer {
210
- query : query ,
227
+ query : query ,
228
+ partialQuery : partialQuery ,
211
229
212
230
authorizeHist : authorizeHistogram ,
213
231
prepareHist : prepareHistogram ,
@@ -289,7 +307,7 @@ func (a RegoAuthorizer) Prepare(ctx context.Context, subject Subject, action Act
289
307
)
290
308
defer span .End ()
291
309
292
- prepared , err := newPartialAuthorizer (ctx , subject , action , objectType )
310
+ prepared , err := a . newPartialAuthorizer (ctx , subject , action , objectType )
293
311
if err != nil {
294
312
return nil , xerrors .Errorf ("new partial authorizer: %w" , err )
295
313
}
0 commit comments