You can use a modified call() action:
def call_w_auth():
    """
    exposes services. for example:
    http://..../[app]/default/call/jsonrpc
    decorate with @services.jsonrpc the functions to expose
    supports xml, json, xmlrpc, jsonrpc, amfrpc, rss, csv
    """
    auth.settings.allow_basic_login = True
    auth.basic(basic_auth_realm='any realm is fine')
    return service()
@service.soap('MyFunction',returns={'result':int},args={'a':int,'b':int,})
            def myfunction(a, b):
                return a + b
            def call():
                return service()
Call it with:
            from gluon.contrib.pysimplesoap.client import SoapClient
            client = SoapClient(wsdl="http://..../app/mycontroller/call_w_auth/soap?WSDL")
            response = client.MyFunction(a=1,b=2)
            return response['result']