标签: django-authentication

Django 用户模型:save() 方法中密码更改的目的是什么

有时我想以编程方式设置密码。我执行以下操作:

https://docs.djangoproject.com/en/2.2/topics/auth/default/#changing-passwords
You can also change a password programmatically, using set_password():

from django.contrib.auth.models import User
u = User.objects.get(username='john')
u.set_password('new pass')
u.save()
Run Code Online (Sandbox Code Playgroud)

我想看看当我们运行时,save() 中的事情是如何实现的u.save()

基本上我想理解 AbstractBaseUser 中使用的 save() 方法

# ./.venv/lib/python3.7/site-packages/django/contrib/auth/base_user.py
class AbstractBaseUser(models.Model):
    password = models.CharField(_('password'), max_length=128)

    ........

    # Stores the raw password if set_password() is called so that it can
    # be passed to password_changed() after the model is saved.
    _password = None


    def save(self, *args, **kwargs):
        super().save(*args, **kwargs)
        if self._password is not None:
            password_validation.password_changed(self._password, self)
            self._password = None …
Run Code Online (Sandbox Code Playgroud)

django django-authentication

4
推荐指数
1
解决办法
912
查看次数

使用自定义 AuthenticationForm 覆盖 Django LoginView 错误消息

我有一个基于类的视图,即子类LoginView.

from django.contrib.auth.views import LoginView

class CustomLoginView(LoginView):

def get_success_url(self):
    url = self.get_redirect_url()
    return url or reverse_lazy('knowledgebase:user_home', kwargs={
        'username':self.request.user.username,
    })
Run Code Online (Sandbox Code Playgroud)

如果用户的电子邮件尚未激活,我想覆盖错误消息,因为他们必须单击发送到其电子邮件地址的链接。当前的默认消息如下所示:

覆盖LoginView错误消息

而不是说:

请输入正确的电子邮件地址和密码。两个地方都要注意大小写。

我想说一句话,大意是:

请确认您的电子邮件,以便您可以登录。

我试过:

账户/表单.py

from django.contrib.auth.forms import AuthenticationForm
from django.utils.translation import gettext as _

class PickyAuthenticationForm(AuthenticationForm):
    def confirm_login_allowed(self, user):
        if not user.is_active:
            raise forms.ValidationError(
                _("Please confirm your email so you can log in."),
                code='inactive',
            )
Run Code Online (Sandbox Code Playgroud)

账户/views.py

class CustomLoginView(LoginView): # 1. <--- note: this is a class-based view

    form_class = PickyAuthenticationForm # 2. <--- note: define form …
Run Code Online (Sandbox Code Playgroud)

forms django django-authentication loginview

4
推荐指数
1
解决办法
2758
查看次数

django用户档案数据库问题

我有一个名为aaa的应用程序,在aaa的models.py中,我喜欢:

from django.db import models
from django.contrib.auth.models import User

class BBB(models.Model):
    user = models.OneToOneField(User)
    newsletter=models.BooleanField(default=False)
Run Code Online (Sandbox Code Playgroud)

我添加到我的setting.py

AUTH_PROFILE_MODULE = 'aaa.BBB'
Run Code Online (Sandbox Code Playgroud)

然后我去django shell并输入

>>> from django.contrib.auth.models import User
>>> a=User.objects.get(id=1)
>>> a.get_profile()
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/local/lib/python2.6/dist-packages/Django-1.2.5-py2.6.egg/django/contrib/auth/models.py", line 373, in get_profile
    self._profile_cache = model._default_manager.using(self._state.db).get(user__id__exact=self.id)
  File "/usr/local/lib/python2.6/dist-packages/Django-1.2.5-py2.6.egg/django/db/models/query.py", line 347, in get
    % self.model._meta.object_name)
DoesNotExist: BBB matching query does not exist.
Run Code Online (Sandbox Code Playgroud)

有些人有想法有什么不对吗?编辑:我做manage.py syncdb

django django-authentication

3
推荐指数
1
解决办法
1464
查看次数

Monkey修补了django auth的登录,现在它的测试失败了

我的应用程序试图用一些基本的审计/日志记录功能包装django.contrib.auth.views登录和注销视图.我遵循django-axes项目中描述的处方,并且在运行服务器和其他一些测试时,它按预期工作,透明地没有问题.

代码如下:

from django.contrib.auth import views as auth_views
from myapp.watchers import watch_login

class WatcherMiddleware(object):
    def __init__(self):
        auth_views.login = watch_login(auth_views.login)
Run Code Online (Sandbox Code Playgroud)

def watch_login(func):
    def decorated_login(request, *args, **kwargs):
        #do some stuff
        response = func(request, *args, **kwargs)
        #more stuff
        return response
    return decorated_login
Run Code Online (Sandbox Code Playgroud)

网址:

#Edit: Added project's urls - just using vanilla django's auth login
(r'^accounts/login/$', 'django.contrib.auth.views.login',{"template_name":settings.LOGIN_TEMPLATE }),
Run Code Online (Sandbox Code Playgroud)

但是,在我们的构建工作流程中,我们遇到了django.contrib.auth.tests.views中的一些问题.

具体来说,这些是django.contrib.auth中失败的测试:

ERROR: test_current_site_in_context_after_login (django.contrib.auth.tests.views.LoginTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\Python26\lib\site-packages\django\contrib\auth\tests\views.py", line 192, in test_current_site_in_context_after_login
    response = self.client.get(reverse('django.contrib.auth.views.login'))
  File "C:\Python26\lib\site-packages\django\core\urlresolvers.py", line …
Run Code Online (Sandbox Code Playgroud)

django monkeypatching django-authentication

3
推荐指数
1
解决办法
1101
查看次数

Django的request.POST对象中的数据是否已经过清理,至少足以直接用于ORM查询?

我正在使用Django构建一个Web论坛,包括内置的身份验证模块.

我正在使用内置UserCreationForm来注册用户.但是,由于我决定使用电子邮件地址作为识别用户的唯一方法,因此我在为用户注册之前为其生成用户名.

为了说明已经注册的用户,在生成用户名之前,我检查用户不存在所提供的电子邮件地址.

request.POST在Django ORM的查询中直接使用提供的电子邮件地址而不对其进行任何消毒是否安全?我在文档中看不到有关request.POST被清理数据的任何内容,但ORM可以防止SQL注入.我还缺少其他潜在的攻击吗?

django django-authentication

3
推荐指数
1
解决办法
505
查看次数

Django模型:用户ID

我目前正在建立一个帮助台票务系统作为学校项目.我正在使用内置的django auth系统,我想从auth系统引用用户ID.例如,票证将分配给某个帮助台员工.我模特的一部分:

class Ticket(models.Model):
    category = models.ManyToManyField(Category)
    title = models.CharField(max_length=30)
    submitted = models.DateTimeField(editable=False)
    submitter = #reference to user
    assignedTo = #reference to helpdesk employee
Run Code Online (Sandbox Code Playgroud)

用户在组中user,帮助台员工属于helpdeskemployeedjango auth系统组.

我已经找到了这个这个

所以我尝试了这个:

class Ticket(models.Model):
    category = models.ManyToManyField(Category)
    title = models.CharField(max_length=30)
    submitted = models.DateTimeField(editable=False)
    submitter = models.OneToOneField(User)
    assignedTo = user = models.OneToOneField(User)
Run Code Online (Sandbox Code Playgroud)

但这会在运行时出现以下错误python manage.py syncdb:

CommandError: One or more models did not validate:
deskman.ticket: Accessor for field 'submitter' clashes with related field 'User.ticket'. Add a related_name …
Run Code Online (Sandbox Code Playgroud)

python django django-models django-authentication

3
推荐指数
1
解决办法
2694
查看次数

在子域上提供Django管理站点

我有一个运行Django,uWSGI和Nginx的项目.目前我使用默认的Django管理站点,服务于example.com/admin.我想改变它,以便管理站点仅在admin.example.com.

做这个的最好方式是什么?

我曾经考虑过要开始一个全新的Django项目,admin.example.com但是使用与运行的项目相同的数据库设置example.com,但我希望有更优雅的东西,因为这会涉及在项目之间复制很多设置和应用程序.基本上两者之间的唯一区别是,安装了管理站点和URL模式,而不会安装.

(我的理由是最终想要使用google auth proxy之类的东西来保护管理站点,但是非管理员登录会通过正常的身份验证后端.看起来我可以通过指定Django使用HTTP Basic Auth来实现这一点admin.example.com,但坚持使用默认后端example.com.)

django nginx django-admin django-authentication uwsgi

3
推荐指数
1
解决办法
1857
查看次数

如何在django中为自定义用户添加组?

在Django中使用这个官方文档自定义身份验证创建了用户的自定义模型 但是如何添加组和提交?我的django是版本1.9

python django django-models django-authentication django-custom-user

3
推荐指数
2
解决办法
3274
查看次数

在Django中检测更改的密码

当用户更改密码时,我想发送一个信号,以便我可以在某些型号上做一些事情.

我该如何创建此信号?

我查看post_save了用户的信号:

post_save.connect(user_updated, sender=User)
Run Code Online (Sandbox Code Playgroud)

但是,我似乎没有任何东西可以检查密码是否已更改:

def user_updated(sender, **kwargs):
    print(kwargs) # {'created': False, 'raw': False, 'instance': <User: 100002>, 'update_fields': None, 'signal': <django.db.models.signals.ModelSignal object at 0x7ff8862f03c8>, 'using': 'default'}
Run Code Online (Sandbox Code Playgroud)

我也看到有一个password_change_doneauth视图,但我不确定我是如何使用它的.https://docs.djangoproject.com/en/1.10/topics/auth/default/#built-in-auth-views

有任何想法吗?

python django django-signals django-authentication

3
推荐指数
2
解决办法
1598
查看次数

DJANGO:TemplateDoesNotExist:auth/user_confirm_delete.html

我正在尝试在Django中创建一个"删除帐户"功能.我用DeleteView它来做这个目的.

问题是在调用此视图后,Django引发:

Request Method: GET
Request URL:    http://127.0.0.1:8000/profiles/delete-account/
Django Version: 1.11.7
Exception Type: TemplateDoesNotExist
Exception Value:    
auth/user_confirm_delete.html
Run Code Online (Sandbox Code Playgroud)

我的看法:

class DeleteAccount(LoginRequiredMixin,DeleteView):
    model = User

    def get_object(self, queryset=None):
        user = self.request.user
        userprofile = user.userprofile
        userprofile.prepare_to_delete_account()
        return user
Run Code Online (Sandbox Code Playgroud)

为什么它会尝试渲染这个template以及为什么没有这样的模板,如果它被调用?

你知道怎么解决这个问题吗?

django django-models django-views django-authentication

3
推荐指数
1
解决办法
889
查看次数