def user_logged_in(self, sender, request, user, **kwargs): # pylint: disable=unused-argument """ When user logs in, update the AccessLog related to the user. """ username = user.get_username() credentials = get_credentials(username) ip_address = get_client_ip(request) user_agent = request.META.get('HTTP_USER_AGENT', '<unknown>')[:255] path_info = request.META.get('PATH_INFO', '<unknown>')[:255] http_accept = request.META.get('HTTP_ACCEPT', '<unknown>')[:1025] log.info( 'AXES: Successful login by %s.', get_client_str(username, ip_address, user_agent, path_info), ) if not settings.AXES_DISABLE_SUCCESS_ACCESS_LOG: AccessLog.objects.create( user_agent=user_agent, ip_address=ip_address, username=username, http_accept=http_accept, path_info=path_info, trusted=True, ) if settings.AXES_RESET_ON_SUCCESS: count = reset_user_attempts(request, credentials) log.info( 'AXES: Deleted %d failed login attempts by %s.', count, get_client_str(username, ip_address, user_agent, path_info), )
def authenticate(self, request, username=None, password=None, **kwargs): """Checks user lock out status and raises PermissionDenied if user is not allowed to log in. Inserts errors directly to `return_context` that is supplied as a keyword argument. Use this on top of your AUTHENTICATION_BACKENDS list to prevent locked out users from being authenticated in the standard Django authentication flow. Note that this method does not log your user in and delegates login to other backends. :param request: see ModelBackend.authenticate :param kwargs: see ModelBackend.authenticate :keyword response_context: context dict that will be updated with error information :raises PermissionDenied: if user is already locked out :return: None """ if request is None: raise AxesModelBackend.RequestParameterRequired() credentials = get_credentials(username=username, password=password, **kwargs) if is_already_locked(request, credentials): # locked out, don't try to authenticate, just update return_context and return # Its a bit weird to pass a context and expect a response value but its nice to get a "why" back. error_msg = get_lockout_message() response_context = kwargs.get('response_context', {}) response_context['error'] = error_msg raise PermissionDenied(error_msg)
def log_user_logged_in(sender, request, user, **kwargs): # pylint: disable=unused-argument """ When a user logs in, update the access log """ username = user.get_username() credentials = get_credentials(username) ip_address = get_client_ip(request) user_agent = request.META.get('HTTP_USER_AGENT', '<unknown>')[:255] path_info = request.META.get('PATH_INFO', '<unknown>')[:255] http_accept = request.META.get('HTTP_ACCEPT', '<unknown>')[:1025] log.info('AXES: Successful login by %s.', get_client_str(username, ip_address, user_agent, path_info)) if not settings.AXES_DISABLE_SUCCESS_ACCESS_LOG: AccessLog.objects.create( user_agent=user_agent, ip_address=ip_address, username=username, http_accept=http_accept, path_info=path_info, trusted=True, ) if settings.AXES_RESET_ON_SUCCESS: count = reset_user_attempts(request, credentials) log.info('AXES: Deleted %d failed login attempts by %s.', count, get_client_str(username, ip_address, user_agent, path_info))
def authenticate(self, request, username=None, password=None, **kwargs): if request is None: raise AxesModelBackend.RequestParameterRequired() try: user = User.objects.get(email__iexact=username) if user.check_password(password): return except User.DoesNotExist: if config.ELGG_URL: elgg_urls = config.ELGG_URL.splitlines() for url in elgg_urls: # Verify username/password combination valid_user_request = requests.post( url + "/services/api/rest/json/", data={ 'method': 'pleio.verifyuser', 'user': username, 'password': password } ) valid_user_json = json.loads(valid_user_request.text) valid_user_result = valid_user_json["result"] if 'result' in valid_user_json else [] valid_user = valid_user_result["valid"] if 'valid' in valid_user_result else False name = valid_user_result["name"] if 'name' in valid_user_result else username admin = valid_user_result["admin"] if 'admin' in valid_user_result else False # If valid, create new user with Elgg attributes if valid_user is True: user = User.objects.create_user( name=name, email=username.lower(), password=password, accepted_terms=True, receives_newsletter=True ) user.is_active = True user.is_admin = admin user.save() service_mesh_message('user.new', json.dumps({ 'name': user.name, 'email': user.email, 'gcID': user.id, 'isAdmin': user.is_admin })) break credentials = get_credentials(username=username, password=password, **kwargs) if is_already_locked(request, credentials): error_msg = get_lockout_message() response_context = kwargs.get('response_context', {}) response_context['error'] = error_msg raise PermissionDenied(error_msg) return
def authenticate(self, request, username=None, password=None, **kwargs): """ Check user lock out status and raises PermissionDenied if user is not allowed to log in. Inserts errors directly to `return_context` that is supplied as a keyword argument. Use this on top of your AUTHENTICATION_BACKENDS list to prevent locked out users from being authenticated in the standard Django authentication flow. Note that this method does not log your user in and delegates login to other backends. :param request: see django.contrib.auth.backends.ModelBackend.authenticate :param username: see django.contrib.auth.backends.ModelBackend.authenticate :param password: see django.contrib.auth.backends.ModelBackend.authenticate :param kwargs: see django.contrib.auth.backends.ModelBackend.authenticate :keyword response_context: context dict that will be updated with error information :raises AxesBackendRequestParameterRequired: if request parameter is not given correctly :raises AxesBackendPermissionDenied: if user is already locked out :return: None """ if request is None: raise AxesBackendRequestParameterRequired( 'AxesBackend requires a request as an argument to authenticate' ) credentials = get_credentials(username=username, password=password, **kwargs) if is_already_locked(request, credentials): # locked out, don't try to authenticate, just update return_context and return # Its a bit weird to pass a context and expect a response value but its nice to get a "why" back. error_msg = get_lockout_message() response_context = kwargs.get('response_context', {}) response_context['error'] = error_msg # Raise an error that stops the authentication flows at django.contrib.auth.authenticate. # This error stops bubbling up at the authenticate call which catches backend PermissionDenied errors. # After this error is caught by authenticate it emits a signal indicating user login failed, # which is processed by axes.signals.log_user_login_failed which logs the attempt and raises # a second exception which bubbles up the middleware stack and produces a HTTP 403 Forbidden reply # in the axes.middleware.AxesMiddleware.process_exception middleware exception handler. raise AxesBackendPermissionDenied( 'AxesBackend detected that the given user is locked out')
def authenticate(self, request, username=None, password=None, **kwargs): """ Check user lock out status and raises PermissionDenied if user is not allowed to log in. Inserts errors directly to `return_context` that is supplied as a keyword argument. Use this on top of your AUTHENTICATION_BACKENDS list to prevent locked out users from being authenticated in the standard Django authentication flow. Note that this method does not log your user in and delegates login to other backends. :param request: see django.contrib.auth.backends.ModelBackend.authenticate :param username: see django.contrib.auth.backends.ModelBackend.authenticate :param password: see django.contrib.auth.backends.ModelBackend.authenticate :param kwargs: see django.contrib.auth.backends.ModelBackend.authenticate :keyword response_context: context dict that will be updated with error information :raises AxesBackendRequestParameterRequired: if request parameter is not given correctly :raises AxesBackendPermissionDenied: if user is already locked out :return: None """ if request is None: raise AxesBackendRequestParameterRequired('AxesBackend requires a request as an argument to authenticate') credentials = get_credentials(username=username, password=password, **kwargs) if is_already_locked(request, credentials): # locked out, don't try to authenticate, just update return_context and return # Its a bit weird to pass a context and expect a response value but its nice to get a "why" back. error_msg = get_lockout_message() response_context = kwargs.get('response_context', {}) response_context['error'] = error_msg # Raise an error that stops the authentication flows at django.contrib.auth.authenticate. # This error stops bubbling up at the authenticate call which catches backend PermissionDenied errors. # After this error is caught by authenticate it emits a signal indicating user login failed, # which is processed by axes.signals.log_user_login_failed which logs the attempt and raises # a second exception which bubbles up the middleware stack and produces a HTTP 403 Forbidden reply # in the axes.middleware.AxesMiddleware.process_exception middleware exception handler. raise AxesBackendPermissionDenied('AxesBackend detected that the given user is locked out')