我有一个Django应用程序,其中有2个用例,我希望用户能够在没有密码的情况下登录.
链接包括我验证的一次性密钥,然后我想在不使用凭据的情况下登录用户.
# This raises an exception unless
# I call user.authenticate 1st.
auth.login(request, user)
Run Code Online (Sandbox Code Playgroud)
我怎么做到这一点?
sup*_*ghs 17
您可以使用所描述的方法在这里 Django文档.您根据提供的一次性密钥获取用户并调用login(request,user).这里的问题是你需要手动指定身份验证后端,因为你不是先调用authenticate().
from django.contrib.auth import login
def my_view(request):
// your user retrieval code
...
user.backend='django.contrib.auth.backends.ModelBackend'
login(request, user)
Run Code Online (Sandbox Code Playgroud)
您可以编写自己的身份验证后端来处理您的两个用例。请参阅有关编写和使用自定义身份验证后端的文档: http://docs.djangoproject.com/en/1.2/topics/auth/#other-authentication-sources
编辑:似乎对于编写自己的身份验证后端有多困难可能存在一些误解。来自文档:
身份验证后端是一个实现两个方法的类:get_user(user_id) 和authenticate(**credentials)。
这是正确的。它是实现两个都返回User对象的函数的任何类。
get_user 方法接受一个 user_id —— 可以是用户名、数据库 ID 或其他任何东西 —— 并返回一个 User 对象。
...authenticate 应该检查它获取的凭据,如果凭据有效,它应该返回与这些凭据匹配的 User 对象。如果它们无效,则应返回 None。
OP 已经声明这些链接包含他验证的一次性密钥(并且可能与他希望登录的用户关联)。换句话说,他已经编写了后端的业务逻辑,他只需要将其转换为适当的类即可。
自定义身份验证后端可以在 Django 1.2 中执行许多很棒的操作,例如对象级权限,但它们不必那么复杂。另外,它们可以堆叠,因此您可以将基于令牌的身份验证与默认模型后端或 OpenID 或 Facebook 混合在一起。但最终,身份验证后端只是具有两种方法的类,我不明白你怎么能称之为过度杀伤力。
| 归档时间: |
|
| 查看次数: |
8021 次 |
| 最近记录: |