If you can confirm that this works, I'll add it to the book.

On Thursday, May 31, 2012 10:48:21 PM UTC-4, Anthony wrote:
>
> Looks like you can do:
>
> auth.settings.allow_basic_login = True
> auth.user = auth.basic()[2]
> if auth.user:
>     etc.
>
> But this doesn't appear to be documented. Perhaps auth.basic() should 
> automatically populate auth.user rather than simply returning it as part of 
> a tuple.
>
> Anthony
>
> On Thursday, May 31, 2012 10:12:14 PM UTC-4, G. Clifford Williams wrote:
>>
>> Given the following code snippet in a controller (default or any other): 
>>
>> auth.settings.allow_basic_login = True
>> def howdy():
>>     auth.settings.allow_basic_login = True
>>     response.view = 'generic.json'
>>     if auth.user:
>>         this_user = auth.user.id
>>     else:
>>         this_user = "unset"
>>     return dict(user=this_user)
>> if the controller action is called as such:
>> % curl --user 't...@somewhere.com:supersecretpassword' 
>> http://127.0.0.1:8000/myapp/controller/howdy                      
>>
>> this response you'll get it this: 
>> {"user": "unset"} 
>>
>> The same goes for using auth.is_logged_in(): 
>>
>> The result is different, however, when you use one of the 'requires' 
>> decorators:                                                             
>>
>> auth.settings.allow_basic_login = True
>>
>> def howdy():
>>     auth.settings.allow_basic_login = True
>>     @auth.requires_login()
>>     def proforma():
>>         pass #empty function just to invoke auth.requires
>>     proforma() #call empty function
>>     response.view = 'generic.json'
>>     if auth.user:
>>         this_user = auth.user.id
>>     else:
>>         this_user = "unset"
>>     return dict(user=this_user)
>> this results in:
>> % curl --user 't...@somewhere.com:supersecretpassword' 
>> http://127.0.0.1:8000/myapp/controller/howdy                      
>> {"user": 1}  
>>
>> After some digging I discovered that in tools.py auth.requires_* ends up 
>> calling login_bare which is why the second one works. I realize that 
>> according to the book (
>> http://web2py.com/books/default/chapter/29/9?search=login_bare) 
>>  login_bare() can be called to login the user "manually". Unfortunately the 
>> examples for auth.settings.allow_basic_login in the manual/book (
>> http://web2py.com/books/default/chapter/29/9#Access-Control-and-Basic-Authentication,
>>  
>> http://web2py.com/books/default/chapter/29/9#Settings-and-messages , & 
>> http://web2py.com/books/default/chapter/29/10#Access-Control) don't 
>> address the fact that no login is actually executed without the decorators. 
>> With the last example if someone wanted to use that as a guide they might 
>> think that changing: 
>>
>> @auth.requires_login()
>> @request.restful()
>> def api():
>>    def GET(s):
>>        return 'access granted, you said %s' % s
>>    return locals()
>>
>> to: 
>>
>>
>> @request.restful()
>> def api():
>>    def GET(s):
>>
>>        if auth.is_logged_in():
>>            return 'access granted, you said %s' % s
>>
>>        else:
>>
>>            return 'access denied'
>>    return locals()
>>
>>
>> Should work, but they would be mistaken (and likely to spend much time 
>> trying to figure out why one worked and the other did not). I don't know 
>> whether it was the intention that using basic auth prevent a call to log 
>> the user in by default. It seems that either the code should be fixed or we 
>> should update the documentation to clarify that login_bare() should be 
>> called explicitly (directly or indirectly) to actually execute the login 
>> process. 
>>
>>

Reply via email to