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.
However, due to an issue in the underlying grpc
gem, it's not possible to use the client before and after process forks.
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) ⇒ Boolean
Check if a principal is allowed to perform an action on a resource.
-
#check_resource(principal:, resource:, actions:, aux_data: nil, include_metadata: false, request_id: SecureRandom.uuid) ⇒ 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) ⇒ Output::CheckResources
Check a principal's permissions on a set of resources.
-
#initialize(target, tls:, grpc_channel_args: {}, 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:, aux_data: nil, include_metadata: false, request_id: SecureRandom.uuid) ⇒ 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 ⇒ Output::ServerInfo
Retrieve information about the Cerbos PDP server.
Constructor Details
#initialize(target, tls:, grpc_channel_args: {}, on_validation_error: :return, playground_instance: nil, timeout: nil) ⇒ Client
Create a client for interacting with the Cerbos PDP server over gRPC.
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
# File 'lib/cerbos/client.rb', line 33 def initialize(target, tls:, grpc_channel_args: {}, on_validation_error: :return, playground_instance: nil, timeout: nil) @on_validation_error = on_validation_error handle_errors 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 channel_args = grpc_channel_args.merge({ "grpc.primary_user_agent" => [grpc_channel_args["grpc.primary_user_agent"], "cerbos-sdk-ruby/#{VERSION}"].compact.join(" ") }) @cerbos_service = Protobuf::Cerbos::Svc::V1::CerbosService::Stub.new( target, credentials, channel_args: channel_args, timeout: timeout ) end end |
Instance Method Details
#allow?(principal:, resource:, action:, aux_data: nil, request_id: SecureRandom.uuid) ⇒ Boolean
Check if a principal is allowed to perform an action on a resource.
72 73 74 75 76 77 78 79 80 |
# File 'lib/cerbos/client.rb', line 72 def allow?(principal:, resource:, action:, aux_data: nil, request_id: SecureRandom.uuid) check_resource( principal: principal, resource: resource, actions: [action], aux_data: aux_data, request_id: request_id ).allow?(action) end |
#check_resource(principal:, resource:, actions:, aux_data: nil, include_metadata: false, request_id: SecureRandom.uuid) ⇒ Output::CheckResources::Result
Check a principal's permissions on a resource.
101 102 103 104 105 106 107 108 109 110 111 |
# File 'lib/cerbos/client.rb', line 101 def check_resource(principal:, resource:, actions:, aux_data: nil, include_metadata: false, request_id: SecureRandom.uuid) handle_errors do check_resources( principal: principal, resources: [Input::ResourceCheck.new(resource: resource, actions: actions)], aux_data: aux_data, include_metadata: , request_id: request_id ).find_result(resource) end end |
#check_resources(principal:, resources:, aux_data: nil, include_metadata: false, request_id: SecureRandom.uuid) ⇒ Output::CheckResources
Check a principal's permissions on a set of resources.
139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 |
# File 'lib/cerbos/client.rb', line 139 def check_resources(principal:, resources:, aux_data: nil, include_metadata: false, request_id: SecureRandom.uuid) handle_errors 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 ) response = perform_request(@cerbos_service, :check_resources, request) Output::CheckResources.from_protobuf(response).tap do |output| handle_validation_errors output end end end |
#plan_resources(principal:, resource:, action:, aux_data: nil, include_metadata: false, request_id: SecureRandom.uuid) ⇒ 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.
177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 |
# File 'lib/cerbos/client.rb', line 177 def plan_resources(principal:, resource:, action:, aux_data: nil, include_metadata: false, request_id: SecureRandom.uuid) handle_errors 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, aux_data: Input.coerce_optional(aux_data, Input::AuxData)&.to_protobuf, include_meta: , request_id: request_id ) response = perform_request(@cerbos_service, :plan_resources, request) Output::PlanResources.from_protobuf(response).tap do |output| handle_validation_errors output end end end |
#server_info ⇒ Output::ServerInfo
Retrieve information about the Cerbos PDP server.
199 200 201 202 203 204 205 206 207 |
# File 'lib/cerbos/client.rb', line 199 def server_info handle_errors do request = Protobuf::Cerbos::Request::V1::ServerInfoRequest.new response = perform_request(@cerbos_service, :server_info, request) Output::ServerInfo.from_protobuf(response) end end |