def write_login_log(self, data): """ 写入登录历史 """ login_ip = get_login_ip(self.request) user_agent = self.request.META.get('HTTP_USER_AGENT', '') tmp_data = {'ip': login_ip, 'type': 'W', 'user_agent': user_agent} data.update(tmp_data) write_login_log_async.delay(**data)
def get_form_class(self): """ 获取表单类,查看缓存是否有需要使用验证码的key """ ip = get_login_ip(self.request) if cache.get(self.key_prefix_captcha.format(ip)): return self.form_class_captcha else: return self.form_class
def cookie_check(request): """ Get user info by cookie. If cookie or user_info is None, redirect to login page. :param request: :return: """ print('*' * 40 + 'Cookie check' + '*' * 40) _cookie = request.COOKIES.get(settings.LOPS_AUTH_COOKIE) if _cookie: if not request.user.is_authenticated: _, user_info = auth(_cookie) if user_info: user = authenticate(request, **user_info) print("User authenticate: %s" % user) login(request, user) # write login log login_ip = get_login_ip(request) user_agent = request.META.get('HTTP_USER_AGENT', '') write_login_log_async.delay( username=user.username, type='W', ip=login_ip, user_agent=user_agent ) else: print('Can not get user info by ticket: %s' % _cookie) return False print('User login...') return True
def form_invalid(self, form): ip = get_login_ip(self.request) cache.set(self.key_prefix.format(ip), 1, 3600) old_form = form form = self.form_class_captcha(data=form.data) form._errors = old_form.errors return super().form_invalid(form)
def post(self, request, *args, **kwargs): """ post请求,进行登录验证 """ ip = get_login_ip(request) username = self.request.POST.get('username') key_limit = self.key_prefix_limit.format(username, ip) if is_block_login(key_limit): return self.render_to_response( self.get_context_data(block_login=True)) return super().post(request, *args, **kwargs)
def get_context_data(self, **kwargs): captcha = False ip = get_login_ip(self.request) if cache.get(self.key_prefix_captcha.format(ip)): captcha = True context = { 'demo_mode': os.environ.get("DEMO_MODE"), 'block_login': False, # 默认限制登录为False 'captcha': captcha, } context.update(kwargs) return super().get_context_data(**context)
def form_invalid(self, form): """ 表单验证不通过 """ username = form.cleaned_data.get('username') data = {'username': username, 'status': False} self.write_login_log(data) # limit user login failed count ip = get_login_ip(self.request) key_limit = self.key_prefix_limit.format(username, ip) key_block = self.key_prefix_block.format(username) set_user_login_failed_count_to_cache(key_limit, key_block) # 设置需要使用验证码的缓存key,然后切换表单为验证码表单 cache.set(self.key_prefix_captcha.format(ip), 1, 3600) old_form = form form = self.form_class_captcha(data=form.data) form._errors = old_form.errors return super().form_invalid(form)
def get_form_class(self): ip = get_login_ip(self.request) if cache.get(self.key_prefix.format(ip)): return self.form_class_captcha else: return self.form_class