Cancan is a good choice but lately I've been looking at Pundit as a better alternative. In your case you would have something like this:
# app/policies/reservation_policy.rb
ReservationPolicy = Struct.new(:user, :reservation) do
def create?
user.service_rep? || user.doorman?
end
end
Then in your controller:
# app/controllers/reservations_controller.rb
class ReservationsController < ApplicationController
def create
@reservation = Reservation.new(reservation_params)
authorize @reservation
@reservation.save
respond_with(@reservation)
end
end
This isn't tested and will need to be adapted to your exact situation but I hope it's a starting point.