Как войти в систему уже созданному пользователю без пароля? - PullRequest
0 голосов
/ 25 апреля 2020

У меня есть веб-страница, разработанная в django, которая использует систему аутентификации django. Чтобы войти в систему пользователю, мне нужны его имя пользователя и пароль, но я хотел бы создать учетную запись, которая позволяет мне входить только путем ввода имени пользователя без необходимости использования пароля, это возможно?

Django Вид

class LoginView(SuccessURLAllowedHostsMixin, FormView):
"""
Display the login form and handle the login action.
"""
form_class = AuthenticationForm
authentication_form = None
redirect_field_name = REDIRECT_FIELD_NAME
template_name = 'registration/login.html'
redirect_authenticated_user = False
extra_context = None

@method_decorator(sensitive_post_parameters())
@method_decorator(csrf_protect)
@method_decorator(never_cache)
def dispatch(self, request, *args, **kwargs):
    if self.redirect_authenticated_user and self.request.user.is_authenticated:
        redirect_to = self.get_success_url()
        if redirect_to == self.request.path:
            raise ValueError(
                "Redirection loop for authenticated user detected. Check that "
                "your LOGIN_REDIRECT_URL doesn't point to a login page."
            )
        return HttpResponseRedirect(redirect_to)
    return super().dispatch(request, *args, **kwargs)

def get_success_url(self):
    url = self.get_redirect_url()
    return url or resolve_url(settings.LOGIN_REDIRECT_URL)

def get_redirect_url(self):
    """Return the user-originating redirect URL if it's safe."""
    redirect_to = self.request.POST.get(
        self.redirect_field_name,
        self.request.GET.get(self.redirect_field_name, '')
    )
    url_is_safe = is_safe_url(
        url=redirect_to,
        allowed_hosts=self.get_success_url_allowed_hosts(),
        require_https=self.request.is_secure(),
    )
    return redirect_to if url_is_safe else ''

def get_form_class(self):
    return self.authentication_form or self.form_class

def get_form_kwargs(self):
    kwargs = super().get_form_kwargs()
    kwargs['request'] = self.request
    return kwargs

def form_valid(self, form):
    """Security check complete. Log the user in."""
    auth_login(self.request, form.get_user())
    return HttpResponseRedirect(self.get_success_url())

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    current_site = get_current_site(self.request)
    context.update({
        self.redirect_field_name: self.get_redirect_url(),
        'site': current_site,
        'site_name': current_site.name,
        **(self.extra_context or {})
    })
    return context

Django Форма

class AuthenticationForm(forms.Form):
username = UsernameField(widget=forms.TextInput(attrs={'autofocus': True}))
password = forms.CharField(
    label=_("Password"),
    strip=False,
    widget=forms.PasswordInput,
)

error_messages = {
    'invalid_login': _(
        "Please enter a correct %(username)s and password. Note that both "
        "fields may be case-sensitive."
    ),
    'inactive': _("This account is inactive."),
}

def __init__(self, request=None, *args, **kwargs):
    self.request = request
    self.user_cache = None
    super().__init__(*args, **kwargs)

    # Set the max length and label for the "username" field.
    self.username_field = UserModel._meta.get_field(UserModel.USERNAME_FIELD)
    self.fields['username'].max_length = self.username_field.max_length or 254
    if self.fields['username'].label is None:
        self.fields['username'].label = capfirst(self.username_field.verbose_name)

def clean(self):
    username = self.cleaned_data.get('username')
    password = self.cleaned_data.get('password')

    if username is not None and password:
        self.user_cache = authenticate(self.request, username=username, password=password)
        if self.user_cache is None:
            raise self.get_invalid_login_error()
        else:
            self.confirm_login_allowed(self.user_cache)

    return self.cleaned_data

def confirm_login_allowed(self, user):
    if not user.is_active:
        raise forms.ValidationError(
            self.error_messages['inactive'],
            code='inactive',
        )

def get_user(self):
    return self.user_cache

def get_invalid_login_error(self):
    return forms.ValidationError(
        self.error_messages['invalid_login'],
        code='invalid_login',
        params={'username': self.username_field.verbose_name},
    )

С уважением.

1 Ответ

0 голосов
/ 25 апреля 2020

Я не понимаю, зачем вам входить в систему без пароля, но да c вы можете (однако это не имеет никакого смысла). вам нужно настроить систему аутентификации django. вот официальные документы для топи c

я предлагаю вам написать свою собственную аутентификацию бэкэнд как документы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...