简体   繁体   English

调用auth.login()后,Django用户仍然是AnonymousUser

[英]Django user is still AnonymousUser after calling auth.login()

I'm trying to log in a user after they scan an RFID tag on their ID badge, however after calling auth.login() , the user is not logged in, and request.user is still AnonymousUser . 我尝试在用户扫描其ID徽章上的RFID标签之后登录用户,但是在调用auth.login() ,该用户未登录,并且request.user仍然是AnonymousUser

I'm using the following view to authenticate the user: 我正在使用以下视图来验证用户身份:

def login(request):
    if request.method == 'POST':
        form = LoginForm(request.POST)
        if form.is_valid():
            try:
                Models.People.objects.get(id_badge=form.cleaned_data['badge_number'], deleted=False, system_user=True)
            except Models.People.DoesNotExist:
                form.add_error('badge_number', 'Badge number not recognised')
                return render(request, 'login.html', {'form':form})
            user = user.authenticate(id_badge=form.cleaned_data['badge_number'])
            if user is not None:
                auth.login(request, user)
                return redirect(reverse('main-menu'))
            else:
                form.add_error('badge_number', 'Badge number not recognised')
    else:
        form = LoginForm()
    return render(request, 'login.html', {'form': form})

I also have a custom authentication backend to check the badge numbers: 我也有一个自定义的身份验证后端来检查徽章编号:

class RFIDBackend(object):
    def authenticate(id_badge=None):
        try:
            person = Models.People.objects.get(info1=id_badge, deleted=False, system_user=True)
        except Models.People.DoesNotExist, Models.People.MultipleValuesReturned:
            return None
        try:
            user = User.objects.get(username=person.login)
        except User.DoesNotExist:
            return None
        if user.is_active:
            return user
        return None

    def get_user(id_badge=None):
        try:
            person = Models.People.objects.get(info1=id_badge, deleted=False, system_user=True)
        except Models.People.DoesNotExist, Models.People.MultipleValuesReturned:
            return None
        try:
            user = User.objects.get(username=person.login)
        except User.DoesNotExist:
            return None
        return user

When trying to log in, the user is successfully redirected to the menu page, but then the template raises an error when it tries to put their name on the page: 尝试登录时,用户已成功重定向到菜单页面,但是模板在尝试将其名称放在页面上时引发错误:

'AnonymousUser' object has no attribute 'first_name'

它应该是cleaned_data而不是cleaned_date吗?

Models.People.objects.get(id_badge=form.cleaned_data['badge_number'], deleted=False, system_user=True)

Your get_user method should take the primary key of the user, not the id_badge . 您的get_user方法应使用用户的主键,而不是id_badge Since you are using the built in user, you could use the same implementation as Django's ModelBackend . 由于您使用的是内置用户,因此可以使用与Django的ModelBackend相同的实现。

from django.contrib.auth import get_user_model

class RFIDBackend(object):
    ...
    def get_user(self, user_id):
        UserModel = get_user_model()
        try:
            return UserModel._default_manager.get(pk=user_id)
        except UserModel.DoesNotExist:
            return None

You try extending this to do the checks on the deleted and system_user fields. 你试试这个扩展上做了支票deletedsystem_user领域。 If you do this, test to make sure it works as expected when a user is deleted, I'm not 100% sure it will lead to the user being logged out. 如果执行此操作,请进行测试以确保删除用户后它可以按预期运行,但我不是100%确定它将导致用户注销。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 在Django中使用all-auth接收到user_logged_in信号后,将用户设置为AnonymousUser - User is set to AnonymousUser after a user_logged_in signal is received in Django with all-auth 登录门户后,在我的 Django 门户中,我的 request.user 始终提供值 AnonymousUser - In my Django portal after login to the portal my request.user is always giving the value AnonymousUser django rest auth 返回 AnonymousUser - django rest auth returns AnonymousUser Django request.user在第三方重定向后成为AnonymousUser - Django request.user become AnonymousUser after third party redirect 注册账号后Django无法识别用户*AnonymousUser* - Django can't identify the user after registering an account *AnonymousUser* 获取用户在Django上返回“ AnonymousUser” - get user returns “AnonymousUser” on django Django-为什么内置的auth登录功能在成功登录URL后没有将有关用户的信息传递给 - Django- why inbuilt auth login function not passing info about user to after successful login url 用户在Django中的哪个位置成为AnonymousUser? - Where in Django does a user become an AnonymousUser? Django,登录成功,但还是匿名用户 - Django, successful login, but still anonymous user 在 Django 中,登录后如何检测哪个身份验证后端对用户进行了身份验证? - In Django, after a login how can I detect which auth backend authenticated the user?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM