django - 为什么我的 Django 密码没有被加密?
问题描述
我正在使用 Django,并添加了视图来创建、更新等我的用户。我正在使用来自 的用户,并且在迁移时from django.contrib.auth.models import User
可以成功看到创建的用户。auth_user
我看到的唯一问题是密码没有被散列。我有另一个项目,在其中我可以看到密码被自动散列,据我调查,这是他们在使用默认 Django 用户时应该具有的默认行为,对吗?我对 Django 比较陌生,所以这可能很简单。
我的创建视图如下所示:
class UserCreateView(LoginRequiredMixin, CreateView):
"""
-----------------------Vista de crear usuarios--------------------------
"""
template_name = 'users/users_form.html'
model = User
fields = ["username", "password", "is_superuser", "is_staff", "first_name", "last_name", "email", "is_active"]
success_url = reverse_lazy("users:list_users")
另一件事(这不是一个问题,但可能是相关信息)是密码字段在视图中本身不是作为密码字段出现,而是作为常规文本字段出现。
任何帮助将不胜感激。
解决方案
我看到的唯一问题是密码没有被散列。
因为你没有在任何地方指定。您可以覆盖该form_valid
方法。如果您使用UserCreationForm
[Django-doc],那么这会自动对密码进行哈希处理,并且还使用两个密码字段来查看密码是否匹配,并将密码显示为密码字段。
因此,您可以通过覆盖form_valid(…)
[Django-doc]来散列它:
class UserCreateView(LoginRequiredMixin, CreateView):
template_name = 'users/users_form.html'
model = User
fields = [
'username', 'password', 'is_superuser', 'is_staff',
'first_name', 'last_name', 'email', 'is_active'
]
success_url = reverse_lazy('users:list_users')
def form_valid(self, form):
form.instance.set_password(form.cleaned_data['password'])
super().form_valid(form)
或者我们可以使用 a UserCreationForm
:
from django.contrib.auth.forms import UserCreationForm
class UserCreateView(LoginRequiredMixin, CreateView):
template_name = 'users/users_form.html'
model = User
form_class = UserCreationForm
success_url = reverse_lazy('users:list_users')
您可以通过覆盖表单并定义额外字段来包含额外字段:
# app/forms.py
from django.contrib.auth.forms import UserCreationForm, UsernameField
from django.contrib.auth.models import User
class CustomUserCreationForm(UserCreationForm):
class Meta:
model = User
fields = (
'username', 'is_superuser', 'is_staff', 'first_name', 'last_name',
'email', 'is_active'
)
field_classes = {'username': UsernameField}
然后在您的视图中使用此表单:
# app/views.py
from app.forms import CustomUserCreationForm
class UserCreateView(LoginRequiredMixin, CreateView):
template_name = 'users/users_form.html'
model = User
form_class = CustomUserCreationForm
success_url = reverse_lazy('users:list_users')
然而,包含字段可能不是一个好主意is_superuser
,因为这可能会导致权限提升[wiki],普通用户可以在其中创建管理员用户(此处您仅将其限制为登录用户),从而最终获得更多权限.
推荐阅读
- r - R中的公式没有在循环中正确更新
- assembly - 多输入按键宏
- python - MLFlow - 在 Windows 10 上运行“mlflow ui”抛出文件未找到错误
- html - 避免不自然的断词
- c# - 从 C# web api 代码访问 Primavera P6 数据
- localization - 在 .NET 5.0 中删除了 ResourceManagerWithCultureStringLocalizer 类和 WithCulture 方法
- reactjs - 当通过钩子更新全局状态时,React 组件按什么顺序重新渲染?
- hive - 从当前行中减去前一行值
- python - Python - 指定要使用的库版本(对于所有这些)
- mongodb - 从不同的 MongoDB 集合中获取读取优化视图的值