I assume you are familiar with accessControl standard filter. It allows you to separate privileges to run some action from action code itself. There is however one problem with most common usage - you cannot use bizRules, at least based on some parameters passed to 'checkAccess' just because it is hard to pass them in accessRules() result.
This wiki shows how to get the geolocation info of the client using another server API
It could be write also as extension but there are a lots of APIs that change the below code
So, I wrote the below code that works for one of them (using www.geoplugin.net)