我目前正在编写一个网站,它使用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) 我正在寻找一种方法来跟踪在线/离线用户。因此,如果我在列表中显示所有用户,我可以有一个图标或某种标志来显示这一点。这是内置在 Django 的默认 Auth 系统中吗?
我的第一个想法是在我的个人资料中简单地在模型中添加一个名为 last_logout 的字段,并在每次用户注销时使用日期/时间更新它。
有了这个信息和内置的last_login,我应该能够做出某种函数来确定用户是否登录/在线,对吗?
或者我应该有一个名为“在线”的布尔字段,当用户登录和注销时我可以更改它?
我正在尝试使用 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 模板,因为这变得越来越混乱。
我是 django 的新手,我想知道 django 中的身份验证系统和散列密码是如何工作的?为什么无法知道用户密码?(即使我知道算法和盐)
在我看来,我看到的身份验证有点像 python 条件:如果输入 == 密码:已验证 =True(显然我知道它不是那样编码的)
但我无法弄清楚它是如何散列和未散列的,以及是否有办法知道用户密码是什么?
目前我正在尝试创建一个自定义验证器来验证用户名。Django 只提供了两个验证器:ASCIIUsernameValidator和UnicodeUsernameValidator. 但是它们都接受像@ 这样的特殊字符,但我只想接受字母数字字符 (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) 我正在尝试捕捉某人第一次登录的信息,以便我可以将他/她重定向到另一个页面,然后正常进行。
我正在与团体合作。管理员可以创建一个包含多个用户的组(使用生成的用户名和密码)。所以可能在用户登录之前已经创建了一个用户(没有一个用户的注册表)
这是我想要的代码:
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。
有人可以帮助我如何查看用户第一次登录的时间吗?
我的团队多年前覆盖了用户的身份验证方法,以针对 LDAP 而不是 djangos 模型后端进行身份验证。
此方法查看用户的 LDAP。如果用户存在正确的用户名和密码,它会获取或创建用户(这意味着用户不必作为模型对象存在于 Django 数据库中供某人登录)。
该方法将新创建的密码保留为无。然后设置所有其他信息。
我注意到,在验证用户后,如果它们有效,则调用用户的 set_unusable_password。在评论中,他们写道它覆盖了 Django 的内置密码处理......这显然是有道理的。但是我不知道为什么他们需要这样做,因为我们已经覆盖了身份验证方法。
我通过删除 set_unusable_password 来测试这一点,以便密码保留为 None 并且验证有效。他们仍然能够使用存储在 LDAP 上的密码登录。您仍然无法将模型中的密码覆盖为与 LDAP 不同的密码并使用该密码登录。
所以基本上 set_unusable_password 调用除了创建一个密码之外没有任何影响......无论如何都没有使用。
我唯一能想到的是,它可能是旧版本 Django 中问题的解决方案(我们现在是 1.11)。
在源代码和文档中花了很多时间之后,我不明白我们为什么需要它。
为什么会在那里?写它的人现在已经离开了,所以我无法解释他们为什么这样做。如果我删除它,会不会有任何不需要的副作用?
我使用 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 派生的自己的自定义用户
我正在尝试使用令牌身份验证,但由于我的创建用户序列化程序没有对密码进行散列,因此它不起作用。我可以使用具有散列密码的超级用户登录。使用 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
我正在使用 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)