2012-12-22 41 views
1

我已经为我的django项目编写了新的身份验证后端,但当输入用户名或密码不正确时,我无法在输出中显示错误消息。如何在django自定义身份验证后端中有错误消息

这里是我的身份验证功能代码:

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 

我不知道什么时候我有一个不正确的用户名和密码,我应该怎么编码。

和我的登录模板是这样的:

{% 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 %} 

请尽快;-)

日Thnx 穆罕默德帮我

回答

3

您需要保存的错误在你的认证后端:

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

然后写你的AuthenticationForm如在django.contrib.auth.forms中修改了清理方法:

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