django - 使用 Django 进行自定义身份验证?

标签 django authentication

因为我不想使用 Django 的内置身份验证系统(也许我应该这样做,如果是这种情况,请告诉我),我创建了一个简单的小身份验证类:

import random
import hashlib
from myapp import models

class CustomerAuth:
    key = 'customer'

    def __init__(self, session):
        self.session = session

    def attempt(self, email_address, password):
        password_hash = hashlib.sha1(password).hexdigest()
        try:
            return models.Customer.objects.get(
                email_address=email_address,
                password_hash=password_hash)
        except models.Customer.DoesNotExist:
            return None

    def login(self, customer):
        self.session[self.key] = customer

    def logout(self):
        if self.session.has_key(self.key):
            self.session[self.key] = None

    def is_logged_in(self):
        return self.session.has_key(self.key)
            and self.session[self.key] != None

    def get_active(self):
        if self.is_logged_in():
            return self.session[self.key]
        else:
            raise Exception('No user is logged in.')

    def redirect_to_login(self):
        return HttpResponseRedirect('/login/')

    def redirect_from_login(self):
        return HttpResponseRedirect('/account/')

问题是,当我想用​​它来阻止未经授权的访问时,我必须在每个 View 方法中使用这个代码片段:
def example(req):
    auth = CustomerAuth(req.session)
    if not auth.is_logged_in():
        return auth.redirect_to_login()

可以想象,这会产生相当丑陋和重复的代码。这样做的更好方法是什么?我应该使用 Django 的身份验证框架吗?

最佳答案

首先,是的,您应该使用 Django 的身份验证框架,并构建自己的 custom auth backend .

其次,不管你怎么做,你都需要在 View 中包含一些你想要限制访问的东西。最好的方法是通过 View 上的装饰器。同样,Django 的内置框架允许您访问 @login_required 装饰器,它完全符合您的要求。

关于django - 使用 Django 进行自定义身份验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1782407/

相关文章:

azure - 具有对象 ID 的客户端无权在范围内执行操作 'Microsoft.Web/serverfarms/read'

Java EE 6 登录模块

django - 上传文件中包含的标题和边界 django rest 框架

python - Django JSON 可序列化错误

python - 无法在 django-flatpages 中使用 {{ variable }}

ubuntu - 每当我使用 wget 时出现证书错误消息

JSF 和容器管理的安全性

python - 登录时出现407错误如何解决?

django - 如何在 Django 中提供用户上传的文件?

javascript - 使用 Javascript 发出 HTTP POST 身份验证基本请求