Ticket #12103: 12103_at_r17205.diff
File 12103_at_r17205.diff, 5.0 KB (added by , 13 years ago) |
---|
-
docs/topics/auth.txt
1210 1210 1211 1211 A form for logging a user in. 1212 1212 1213 The ``AuthenticationForm`` rejects users whose ``is_active`` flag is set to ``False``. 1214 You may override this behavior with a custom policy to determine which users can log in. 1215 Do this with a custom form that subclasses ``AuthenticationForm`` and overrides the 1216 ``confirm_login_allowed(self, user)`` method. This method will raise a ``forms.ValidationError`` 1217 if the given user may not log in. 1218 1219 For example, to allow all users to log in, regardless of activation status:: 1220 1221 .. code-block:: python 1222 1223 class AuthenticationFormWithInactiveUsersOkay(AuthenticationForm): 1224 def confirm_login_allowed(self, user): 1225 pass 1226 1227 Or to allow only some active users to log in: 1228 1229 .. code-block:: python 1230 1231 class PickyAuthenticationForm(AuthenticationForm): 1232 def confirm_login_allowed(self, user): 1233 if not user.is_active: 1234 raise forms.ValidationError(_("This account is inactive.")) 1235 if user.username.startswith('b'): 1236 raise forms.ValidationError(_("Sorry, accounts starting with 'b' aren't welcome here.")) 1237 1213 1238 .. class:: PasswordChangeForm 1214 1239 1215 1240 A form for allowing a user to change their password. -
django/contrib/auth/tests/forms.py
115 115 self.assertEqual(form.non_field_errors(), 116 116 [force_unicode(form.error_messages['inactive'])]) 117 117 118 def test_custom_login_allowed_policy(self): 119 # The user is inactive, but our custom form policy allows him to log in. 120 data = { 121 'username': 'inactive', 122 'password': 'password', 123 } 124 125 class AuthenticationFormWithInactiveUsersOkay(AuthenticationForm): 126 def confirm_login_allowed(self, user): 127 pass 128 129 form = AuthenticationFormWithInactiveUsersOkay(None, data) 130 self.assertTrue(form.is_valid()) 131 132 # If we want to disallow some logins according to custom logic, 133 # we should raise a django.forms.ValidationError in the form. 134 from django.forms import ValidationError 135 from django.utils.translation import ugettext_lazy as _ 136 class PickyAuthenticationForm(AuthenticationForm): 137 def confirm_login_allowed(self, user): 138 if user.username == "inactive": 139 raise ValidationError(_("This user is disallowed.")) 140 raise ValidationError(_("Sorry, nobody's allowed in.")) 141 142 form = PickyAuthenticationForm(None, data) 143 self.assertFalse(form.is_valid()) 144 self.assertEqual(form.non_field_errors(), 145 [u'This user is disallowed.']) 146 147 data = { 148 'username': 'testclient', 149 'password': 'password', 150 } 151 form = PickyAuthenticationForm(None, data) 152 self.assertFalse(form.is_valid()) 153 self.assertEqual(form.non_field_errors(), 154 [u"Sorry, nobody's allowed in."]) 155 118 156 def test_success(self): 119 157 # The success case 120 158 data = { -
django/contrib/auth/forms.py
145 145 self.user_cache = authenticate(username=username, password=password) 146 146 if self.user_cache is None: 147 147 raise forms.ValidationError(self.error_messages['invalid_login']) 148 el if not self.user_cache.is_active:149 raise forms.ValidationError(self.error_messages['inactive'])148 else: 149 self.confirm_login_allowed(self.user_cache) 150 150 self.check_for_test_cookie() 151 151 return self.cleaned_data 152 152 … … 154 154 if self.request and not self.request.session.test_cookie_worked(): 155 155 raise forms.ValidationError(self.error_messages['no_cookies']) 156 156 157 def confirm_login_allowed(self, user): 158 """ 159 Controls whether the given ``auth.User`` object may log in. This is a policy setting, 160 independent of end-user authentication. This default behavior is to allow login by 161 active users, and reject login by inactive users. 162 163 If the given user cannot log in, this method should raise a ``forms.ValidationError``. 164 165 If the given user may log in, this method should return None. 166 """ 167 if not user.is_active: 168 raise forms.ValidationError(self.error_messages['inactive']) 169 157 170 def get_user_id(self): 158 171 if self.user_cache: 159 172 return self.user_cache.id