我有2个Web2Py应用程序,让我称之为Provider和Receiver。 Provider提供基本身份验证功能,Receiver使用它来登录。用户已在Provider和Receiver的本地数据库中创建使用这些用户凭据成功登录。但是当我在我的控制器中使用RESTful方法时,如果我使用相同的用户名通过相同的浏览器会话手动登录到Provider,则jQuery-Ajax调用只能起作用。如果我不这样做并且只从Receiver登录,则表示已成功登录,但未成功执行Ajax GET调用。如果我使用一个用户名登录Reciever,使用其他用户名登录Provider,则Ajax GET会提取登录到Provider的用户的信息。我把它作为脚本放在Receiver的index.html中:
var gBaseUrl="http://127.0.0.1:8000/Provider/sites/";
$(document).ready(function(){
$.ajax({
type: "GET",
async: true,
url: gBaseUrl+"get_username",
dataType: "text",
success: function(data){
$('#ContentView').append('
succeeded '+data+'
');}
failure: function(data){
$('#ContentView').append('
failed '+data+'
');}
});
});
如果我未在本地登录Provider,则不会向ContentView添加任何内容。这就是Provider的db.py的样子:
## configure auth policy
auth.settings.registration_requires_verification = True
auth.settings.registration_requires_approval = True
auth.settings.reset_password_requires_verification = True
auth.settings.allow_basic_login = True
auth.settings.controller = 'default'
auth.settings.hmac_key = None
auth.settings.mailer = None
auth.settings.login_after_registration = False
要实现基本身份验证,提供商的default.py具有以下功能:
def basic_auth():
"""
checks if the user is logged in and returns True/False.
if so user is in auth.user as well as in session.auth.user
"""
auth.basic()
if auth.user:
print("login success!")
print(auth.user.username, " is logging in!")
session.forget()
return True
else:
print("login failed!")
return False
然后返回用户名,在Provider的site控制器中,我有:
@request.restful()
@auth.requires_login()
def get_username():
def GET():
return str(auth.user.username)
return locals()
ContentView只是我在div中的空index.html。
我还在requires中稍微修改了gluon/tools.py装饰器的实现:
if current.request.ajax:
raise HTTP(401)
...
elif self.settings.allow_basic_login_only or \
basic_accepted or current.request.is_restful:
raise HTTP(401, **{'WWW-Authenticate': 'Basic realm="My Realm"'})
...