标签: django-authentication

如何在 Django 管理中允许仅对特定对象进行对象编辑?

我目前正在编写一个网站,它使用django-guardian来分配在整个网站中使用的对象级权限。

这是所需的功能:

我希望用户有权编辑单个对象(或多个对象)。例如,如果有一个名为“Joe”的用户和一个名为“Partyline”的模型,我可以为“Joe”授予 3 个特定“Partyline”对象的“change_partyline”特定权限。

当 Joe 登录 Django 管理面板时,我希望他只能编辑他的 3 个特定的“Partyline”对象,因为这些是他唯一有权编辑的内容。

这是当前的功能:

我可以将 Joe Change_partyline 权限分配给 3 个 Partyline 对象——没问题。乔可以正常登录管理面板。问题是,由于 Joe 没有更改所有派对线的“全局”权限,因此管理面板表示他没有任何权限,并且不允许他编辑任何内容。我想找到一种方法让管理员认识到 Joe 仅具有编辑 3 个特定对象的权限,并让他仅查看和编辑他有权处理的那些对象。

我很想找到一种方法来完成这项工作。我现在广泛使用管理员来让用户管理事务,如果必须将某些功能从管理员中移至网站上的其他区域,确实会破坏演示效果。

如果您有任何建议,请让我知道!

作为参考,以下是一些 shell 输出,证明用户对 Partyline 对象具有 Change_partyline 权限:

>>> from django.contrib.auth.models import User
>>> u = User.objects.get(id=2)
>>> from apps.partylines.models import Partyline
>>> p = Partyline.objects.get(id=3)
>>> u.has_perm('partylines.change_partyline', p)
True
Run Code Online (Sandbox Code Playgroud)

这是我的partylines.admin模块(它显示了 Partyline 模块如何在管理中填充):

from django.contrib import admin
from guardian.admin import GuardedModelAdmin
from apps.partylines.models import Partyline


class PartylineAdmin(GuardedModelAdmin):
    list_display …
Run Code Online (Sandbox Code Playgroud)

python django django-admin django-authentication

2
推荐指数
1
解决办法
3554
查看次数

使用 Django 获取已连接用户的列表

我正在寻找一种方法来跟踪在线/离线用户。因此,如果我在列表中显示所有用户,我可以有一个图标或某种标志来显示这一点。这是内置在 Django 的默认 Auth 系统中吗?

我的第一个想法是在我的个人资料中简单地在模型中添加一个名为 last_logout 的字段,并在每次用户注销时使用日期/时间更新它。

有了这个信息和内置的last_login,我应该能够做出某种函数来确定用户是否登录/在线,对吗?

或者我应该有一个名为“在线”的布尔字段,当用户登录和注销时我可以更改它?

python django django-authentication

2
推荐指数
1
解决办法
4241
查看次数

如何将 Django 身份验证与 Jinja2 模板正确集成?

我正在尝试使用 Django 提供的身份验证和授权系统,因为我可以看到登录/注销的默认内置视图期望 Django 模板,因此我不能使用我的 Jinja2base.html文件来扩展它们,因为我已经集成了 Jinja2 引擎。

我能够通过复制 'base.html' 并将语法更改为 Django 模板来解决这个问题,但这种方法迫使我依赖于不同模板语言的两个相同文件。

但是,现在我有其他问题,我无法访问userJinja2 模板中的对象context,即使我可以在 Django 模板中做到这一点。

通过说“我无法访问”:

File "/home/dir/workspace/project/venv/local/lib/python2.7/site-packages/jinja2/environment.py", line 430, in getattr return getattr(obj, attribute)
UndefinedError: 'user' is undefined 
Run Code Online (Sandbox Code Playgroud)

我的 Jinja2 模板:

{% if user.is_authenticated %}
  <li>User: {{ user.get_username }}</li>
  <li><a href="{% url 'logout'%}?next={{request.path}}">Logout</a></li>
{% else %}
  <li><a href="{% url 'login'%}?next={{request.path}}">Login</a></li>
{% endif %}
Run Code Online (Sandbox Code Playgroud)

我的问题是,我该如何解决这个问题?我是否应该只切换回 Django 模板,因为这变得越来越混乱。

python django django-templates jinja2 django-authentication

2
推荐指数
1
解决办法
1686
查看次数

Django 身份验证和密码学 - 它是如何工作的?

我是 django 的新手,我想知道 django 中的身份验证系统和散列密码是如何工作的?为什么无法知道用户密码?(即使我知道算法和盐)

在我看来,我看到的身份验证有点像 python 条件:如果输入 == 密码:已验证 =True(显然我知道它不是那样编码的)

但我无法弄清楚它是如何散列和未散列的,以及是否有办法知道用户密码是什么?

django django-authentication

2
推荐指数
1
解决办法
654
查看次数

为注册表单创建和使用自定义用户名验证器

目前我正在尝试创建一个自定义验证器来验证用户名。Django 只提供了两个验证器:ASCIIUsernameValidatorUnicodeUsernameValidator. 但是它们都接受像@ 这样的特殊字符,但我只想接受字母数字字符 (A-Za-z0-9) 和下划线。

我确实阅读了验证器文档,我相信这样的事情应该可行:

# project_name/validators.py
from django.core import validators
from django.utils.deconstruct import deconstructible
from django.utils.translation import gettext_lazy as _
@deconstructible
class AlphanumericUsernameValidator(validators.RegexValidator):
    regex = r'^[\w]+$'
    message = _(
        'Enter a valid username. This value may contain only English letters, '
        'numbers and underscores.'
    )
    flags = re.ASCII
Run Code Online (Sandbox Code Playgroud)

但我将如何实际使用它?我检查和AbstractUser有这样一行:username_validator = UnicodeUsernameValidator()。我是否必须创建一个如下所示的 AbstractUser (不确定我是否可以创建一个,因为我已经注册了一些用户)?

from django.db import models
from django.contrib.auth.models import AbstractUser
from project_name.validators import AlphaNumericUsernameValidator
class User(AbstractUser):
    username_validator = …
Run Code Online (Sandbox Code Playgroud)

python django django-authentication

2
推荐指数
1
解决办法
1522
查看次数

我可以在该用户登录后检查该用户是否第一次登录吗?- 姜戈

我正在尝试捕捉某人第一次登录的信息,以便我可以将他/她重定向到另一个页面,然后正常进行。

我正在与团体合作。管理员可以创建一个包含多个用户的组(使用生成的用户名和密码)。所以可能在用户登录之前已经创建了一个用户(没有一个用户的注册表)

这是我想要的代码:

def index(request):
    if request.user:
        user = request.user
        if user.last_login is None:
            return redirect('profile')
        else:
            return redirect('home')
    else:
        return redirect('/login')
Run Code Online (Sandbox Code Playgroud)

我已经阅读了有关检查 user.last_login 的内容,但是对于这种情况,它不起作用,因为它在用户登录后检查此方法。这意味着 user.last_login 永远不会是 None。

有人可以帮助我如何查看用户第一次登录的时间吗?

django login django-authentication python-2.7

2
推荐指数
1
解决办法
2587
查看次数

Django 1.11 身份验证 set_unusable_password 与将密码设置为 None

我的团队多年前覆盖了用户的身份验证方法,以针对 LDAP 而不是 djangos 模型后端进行身份验证。

此方法查看用户的 LDAP。如果用户存在正确的用户名和密码,它会获取或创建用户(这意味着用户不必作为模型对象存在于 Django 数据库中供某人登录)。

该方法将新创建的密码保留为无。然后设置所有其他信息。

我注意到,在验证用户后,如果它们有效,则调用用户的 set_unusable_password。在评论中,他们写道它覆盖了 Django 的内置密码处理......这显然是有道理的。但是我不知道为什么他们需要这样做,因为我们已经覆盖了身份验证方法。

我通过删除 set_unusable_password 来测试这一点,以便密码保留为 None 并且验证有效。他们仍然能够使用存储在 LDAP 上的密码登录。您仍然无法将模型中的密码覆盖为与 LDAP 不同的密码并使用该密码登录。

所以基本上 set_unusable_password 调用除了创建一个密码之外没有任何影响......无论如何都没有使用。

我唯一能想到的是,它可能是旧版本 Django 中问题的解决方案(我们现在是 1.11)。

在源代码和文档中花了很多时间之后,我不明白我们为什么需要它。

为什么会在那里?写它的人现在已经离开了,所以我无法解释他们为什么这样做。如果我删除它,会不会有任何不需要的副作用?

python django ldap django-authentication

2
推荐指数
1
解决办法
2339
查看次数

当用户关闭基于 django2.0 的网站上的选项卡或浏览器时,如何强制注销用户

我使用 Django 使用 Django 身份验证使用了内置的登录注销功能,这是用于登录 urls.py 的以下 url 模式:

from django.contrib import admin
from django.urls import path, include
from . import views


urlpatterns = [
    path('',views.home),
    path('admin/', admin.site.urls),
    path('users/', include('users.urls')),
    path('users/', include('django.contrib.auth.urls')),
    path('dashboard/', include('dashboard.urls')),

]
Run Code Online (Sandbox Code Playgroud)

我在我的 setting.py settings.py 中添加了以下内容:

LOGIN_REDIRECT_URL = 'dashboard:home'
LOGOUT_REDIRECT_URL = 'dashboard:home'
Run Code Online (Sandbox Code Playgroud)

现在我如何检查用户是否关闭了他的浏览器并且他应该被注销?PS:我制作了自己的登录和注册 HTML 页面,并制作了从 AbstractUser 派生的自己的自定义用户

authentication django django-authentication

2
推荐指数
1
解决办法
3200
查看次数

Django-Rest-Framework 自定义用户不散列密码(序列化程序问题)

我正在尝试使用令牌身份验证,但由于我的创建用户序列化程序没有对密码进行散列,因此它不起作用。我可以使用具有散列密码的超级用户登录。使用 rest_auth 和 rest_framework.authtoken。user.set_password 命令应该散列密码,那么之前的代码有问题吗?

class CreateUserSerializer(serializers.HyperlinkedModelSerializer):
    username = serializers.CharField()
    password = serializers.CharField(write_only = True, style = {'input_type': 'password'})

    class Meta:
        model = get_user_model()
        fields = (
            'id','username', 'password', 
            'email', 'first_name', 'last_name'
        )
        write_only_fields = ('password')
        read_only_fields = ('is_staff', 'is_superuser', 'is_active')

        def create(self, validated_data):
            password = validated_data.pop('password')
            user = super().create(validated_data)
            user.set_password(validated_data['password'])
            user.save()
            return user
Run Code Online (Sandbox Code Playgroud)
class CreateUserAPIView(CreateAPIView):
    """
    Create a new user.
    """
    serializer_class = CreateUserSerializer
    permission_classes = [AllowAny]

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data = request.data)
        serializer.is_valid(raise_exception = …
Run Code Online (Sandbox Code Playgroud)

django django-authentication django-serializer django-rest-framework

2
推荐指数
1
解决办法
1330
查看次数

django 自定义身份验证后端未被调用

我正在使用 Django 3.1,并试图找出为什么我的自定义身份验证后端没有被调用。

在我的 settings.py 文件中,我有:

AUTHENTICATION_BACKENDS = (
    'sizzy.backends.EmailBackend',
)
Run Code Online (Sandbox Code Playgroud)

在我的 sizzy.backends.py 文件中,我有:

from django.core.exceptions import ObjectDoesNotExist
from django.contrib.auth.backends import ModelBackend
from .models import User

class EmailBackend(ModelBackend):
    def authenticate(self, username=None, password=None):
        try:
            print("Trying the email backend!")
            user = User.objects.get(email=username)
            print("Got the user")
            if user.check_password(password): # check valid password
                return user
            print("password didn't work")
        except ObjectDoesNotExist:
            return None

    def get_user(self, user_id):
        try:
            print("Getting the user of the Email Bkacned")
            return User.objects.get(pk=user_id)
        except ObjectDoesNotExist:
            return None
Run Code Online (Sandbox Code Playgroud)

然后我打开manage.py shell并输入:

from …
Run Code Online (Sandbox Code Playgroud)

django django-authentication

2
推荐指数
1
解决办法
1008
查看次数