Class: Cerbos::Client
- Inherits:
-
Object
- Object
- Cerbos::Client
- Defined in:
- lib/cerbos/client.rb
Overview
A client for interacting with the Cerbos policy decision point (PDP) server over gRPC.
An instance of the client may be shared between threads.
Due to a limitation in the underlying grpc gem, creating a client instance before a process fork is only (experimentally) supported on Linux and requires you to
- have at least v1.57.0 of the
grpcgem installed, - set the
GRPC_ENABLE_FORK_SUPPORTenvironment variable to1, - call
GRPC.preforkbefore forking, - call
GRPC.postfork_parentin the parent process after forking, and - call
GRPC.postfork_childin the child processes after forking.
Otherwise, if your application runs on a forking webserver (for example, Puma in clustered mode), then you'll need to ensure that you only create client instances in the child (worker) processes.
Instance Method Summary collapse
-
#allow?(principal:, resource:, action:, aux_data: nil, request_id: SecureRandom.uuid, request_context: nil, grpc_metadata: {}) ⇒ Boolean
Check if a principal is allowed to perform an action on a resource.
-
#check_health(service: "cerbos.svc.v1.CerbosService", grpc_metadata: {}) ⇒ Output::HealthCheck
Check the health of a service provided by the policy decision point server.
-
#check_resource(principal:, resource:, actions:, aux_data: nil, include_metadata: false, request_id: SecureRandom.uuid, request_context: nil, grpc_metadata: {}) ⇒ Output::CheckResources::Result
Check a principal's permissions on a resource.
-
#check_resources(principal:, resources:, aux_data: nil, include_metadata: false, request_id: SecureRandom.uuid, request_context: nil, grpc_metadata: {}) ⇒ Output::CheckResources
Check a principal's permissions on a set of resources.
-
#initialize(target, tls:, grpc_channel_args: {}, grpc_metadata: {}, on_validation_error: :return, playground_instance: nil, timeout: nil) ⇒ Client
constructor
Create a client for interacting with the Cerbos PDP server over gRPC.
-
#plan_resources(principal:, resource:, action: "", actions: [], aux_data: nil, include_metadata: false, request_id: SecureRandom.uuid, request_context: nil, grpc_metadata: {}) ⇒ Output::PlanResources
Produce a query plan that can be used to obtain a list of resources on which a principal is allowed to perform a particular action.
-
#server_info(grpc_metadata: {}) ⇒ Output::ServerInfo
Retrieve information about the Cerbos PDP server.
Constructor Details
#initialize(target, tls:, grpc_channel_args: {}, grpc_metadata: {}, on_validation_error: :return, playground_instance: nil, timeout: nil) ⇒ Client
Create a client for interacting with the Cerbos PDP server over gRPC.
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
# File 'lib/cerbos/client.rb', line 41 def initialize(target, tls:, grpc_channel_args: {}, grpc_metadata: {}, on_validation_error: :return, playground_instance: nil, timeout: nil) @on_validation_error = on_validation_error Error.handle do credentials = tls ? tls.to_channel_credentials : :this_channel_is_insecure unless playground_instance.nil? credentials = credentials.compose(GRPC::Core::CallCredentials.new(->(*) { {"playground-instance" => playground_instance} })) end @cerbos_service = Service.new( stub: Protobuf::Cerbos::Svc::V1::CerbosService::Stub, target:, credentials:, grpc_channel_args:, grpc_metadata:, timeout: ) @health_service = Service.new( stub: Protobuf::Grpc::Health::V1::Health::Stub, target:, credentials:, grpc_channel_args:, grpc_metadata:, timeout: ) end end |
Instance Method Details
#allow?(principal:, resource:, action:, aux_data: nil, request_id: SecureRandom.uuid, request_context: nil, grpc_metadata: {}) ⇒ Boolean
Check if a principal is allowed to perform an action on a resource.
89 90 91 92 93 94 95 96 97 98 99 |
# File 'lib/cerbos/client.rb', line 89 def allow?(principal:, resource:, action:, aux_data: nil, request_id: SecureRandom.uuid, request_context: nil, grpc_metadata: {}) check_resource( principal: principal, resource: resource, actions: [action], aux_data: aux_data, request_id: request_id, request_context: request_context, grpc_metadata: ).allow?(action) end |
#check_health(service: "cerbos.svc.v1.CerbosService", grpc_metadata: {}) ⇒ Output::HealthCheck
Check the health of a service provided by the policy decision point server.
114 115 116 117 118 119 120 121 122 123 124 125 126 |
# File 'lib/cerbos/client.rb', line 114 def check_health(service: "cerbos.svc.v1.CerbosService", grpc_metadata: {}) Error.handle do request = Protobuf::Grpc::Health::V1::HealthCheckRequest.new(service: service) response = @health_service.call(:check, request, ) Output::HealthCheck.from_protobuf(response) end rescue Error::NotFound return Output::HealthCheck.new(status: :DISABLED) if service == "cerbos.svc.v1.CerbosAdminService" raise end |
#check_resource(principal:, resource:, actions:, aux_data: nil, include_metadata: false, request_id: SecureRandom.uuid, request_context: nil, grpc_metadata: {}) ⇒ Output::CheckResources::Result
Check a principal's permissions on a resource.
149 150 151 152 153 154 155 156 157 158 159 160 161 |
# File 'lib/cerbos/client.rb', line 149 def check_resource(principal:, resource:, actions:, aux_data: nil, include_metadata: false, request_id: SecureRandom.uuid, request_context: nil, grpc_metadata: {}) Error.handle do check_resources( principal: principal, resources: [Input::ResourceCheck.new(resource: resource, actions: actions)], aux_data: aux_data, include_metadata: , request_id: request_id, request_context: request_context, grpc_metadata: ).find_result(resource) end end |
#check_resources(principal:, resources:, aux_data: nil, include_metadata: false, request_id: SecureRandom.uuid, request_context: nil, grpc_metadata: {}) ⇒ Output::CheckResources
Check a principal's permissions on a set of resources.
191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 |
# File 'lib/cerbos/client.rb', line 191 def check_resources(principal:, resources:, aux_data: nil, include_metadata: false, request_id: SecureRandom.uuid, request_context: nil, grpc_metadata: {}) Error.handle do request = Protobuf::Cerbos::Request::V1::CheckResourcesRequest.new( principal: Input.coerce_required(principal, Input::Principal).to_protobuf, resources: Input.coerce_array(resources, Input::ResourceCheck).map(&:to_protobuf), aux_data: Input.coerce_optional(aux_data, Input::AuxData)&.to_protobuf, include_meta: , request_id: request_id, request_context: Input.coerce_optional(request_context, Input::RequestContext)&.to_protobuf ) response = @cerbos_service.call(:check_resources, request, ) Output::CheckResources.from_protobuf(response).tap do |output| handle_validation_errors output end end end |
#plan_resources(principal:, resource:, action: "", actions: [], aux_data: nil, include_metadata: false, request_id: SecureRandom.uuid, request_context: nil, grpc_metadata: {}) ⇒ Output::PlanResources
Produce a query plan that can be used to obtain a list of resources on which a principal is allowed to perform a particular action.
233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 |
# File 'lib/cerbos/client.rb', line 233 def plan_resources(principal:, resource:, action: "", actions: [], aux_data: nil, include_metadata: false, request_id: SecureRandom.uuid, request_context: nil, grpc_metadata: {}) Error.handle do request = Protobuf::Cerbos::Request::V1::PlanResourcesRequest.new( principal: Input.coerce_required(principal, Input::Principal).to_protobuf, resource: Input.coerce_required(resource, Input::ResourceQuery).to_protobuf, action: action, actions: actions, aux_data: Input.coerce_optional(aux_data, Input::AuxData)&.to_protobuf, include_meta: , request_id: request_id, request_context: Input.coerce_optional(request_context, Input::RequestContext)&.to_protobuf ) response = @cerbos_service.call(:plan_resources, request, ) Output::PlanResources.from_protobuf(response).tap do |output| handle_validation_errors output end end end |
#server_info(grpc_metadata: {}) ⇒ Output::ServerInfo
Retrieve information about the Cerbos PDP server.
259 260 261 262 263 264 265 266 267 |
# File 'lib/cerbos/client.rb', line 259 def server_info(grpc_metadata: {}) Error.handle do request = Protobuf::Cerbos::Request::V1::ServerInfoRequest.new response = @cerbos_service.call(:server_info, request, ) Output::ServerInfo.from_protobuf(response) end end |