How to have an error message in django custom authentication backend

佐手、 提交于 2019-12-11 04:07:29

问题


I have write a new authentication backend for my django project but i cannot show error messages in output when username or password is incorrect.

Here is my authenticate function code :

def authenticate(self,username=None,password=None ):
    try:
        authService = AuthenticationLocator().getAuthenticationHttpSoap11Endpoint()
        authRequest = authenticateRequest()
        authRequest._Username = username
        authRequest._Password = password
        authResult = authService.authenticate(authRequest)

        if authResult._return[0] == 'true':

            try:
                user = User.objects.filter(username=username)
                if len(user) > 0:
                    usr = user[0]
                else:
                    usr = self.addUser(username)

#               Correct Login
                return usr

            except User.DoesNotExist:
                return None

        elif authResult._return[0] == 'error':
#           Connection Error
            return None
        elif authResult._return[0] == 'false':
#           InCorrect User
            return None
    except :
        return None

def get_user(self, user_id):
    try:
        return User.objects.get(pk=user_id)
    except User.DoesNotExist:
        return None

I don't know what should I code when I have an incorrect username and password.

and my login template is like this :

{% block content %}
{% if error_message %}
<p class="errornote">{{ error_message }}</p>
{% endif %}
<div id="content-main">
    <form action="{{ app_path }}" method="post" id="login-form">
        {{ form.non_field_error }}
        {% csrf_token %}
        <div>
            {{ message }}
        </div>
        <div class="form-row">
            <div class="form_cell"><label for="id_username">{% trans 'Username:' %}</label></div>
            <div class="form_cell"><input type="text" name="username" id="id_username" /></div>
        </div>
        <div class="form-row">
            <div class="form_cell"><label for="id_password">{% trans 'Password:' %}</label></div>
            <div class="form_cell"><input type="password" name="password" id="id_password" /></div>
            <input type="hidden" name="this_is_the_login_form" value="1" />
        </div>
        <div class="submit-row">
            <label>&nbsp;</label><input type="submit" value="{% trans 'Log in' %}" />
        </div>
    </form>
<script type="text/javascript">
document.getElementById('id_username').focus()
</script>
</div>
{% endblock %}

Please help me as soon as possible ;-)

THNX Mohammad


回答1:


You need to save error in your authentication backend:

def authenticate(self,username=None,password=None,errors=[]):
    ... 
    errors.append('Connection error.')

And write your AuthenticationForm as in django.contrib.auth.forms with modification of clean method:

def clean(self):
    ...
    errors = []
    self.user_cache = authenticate(username=username, password=password, errors=errors)
    ...
    raise form.ValidationError(" ".join(errors))


来源:https://stackoverflow.com/questions/14002173/how-to-have-an-error-message-in-django-custom-authentication-backend

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!