Ploneでログインの失敗を取得するには、イベントで取得することができない。代わりにPython Scriptを用いる。
login_form_validate.py を修正することで取得することが可能となる。
以下コードは、Datadogにカスタムメトリクスを送信するコード
from Products.CMFCore.utils import getToolByName from Products.CMFPlone import PloneMessageFactory as _ from ngi.notify.datadog.dd import metric_datadog request = context.REQUEST js_enabled = request.get('js_enabled', 0) # is javascript enabled? js_enabled = js_enabled == '1' or js_enabled == 1 cookies_enabled = request.get('cookies_enabled', 0) # are cookies enabled? cookies_enabled = cookies_enabled == '1' or cookies_enabled == 1 if js_enabled and not cookies_enabled: context.plone_utils.addPortalMessage( _(u'You must enable cookies before you can log in.'), 'error') state.set(status='enable_cookies') return state mt=context.portal_membership if mt.isAnonymousUser(): props = getToolByName(context, 'portal_properties').site_properties email_login = props.getProperty('use_email_as_login') if js_enabled: # javascript is enabled - we can diagnose the failure # using cookie authentication? auth = getattr(context, 'cookie_authentication', None) if auth: user_name = request.get('login_name', None) password_empty = request.get('pwd_empty', None) == '1' ac_name = auth.name_cookie ac_password = auth.pw_cookie if not user_name: # no user name if email_login: state.setError( ac_name, _(u'Please enter your email address.'), 'email_address_required') else: state.setError( ac_name, _(u'Please enter your login name.'), 'login_name_required') if password_empty: state.setError( ac_password, _(u'Please enter your password.'), 'password_required') verify_login_name = props.getProperty('verify_login_name', 0) if user_name and verify_login_name: # XXX mixing up username and loginname here if mt.getMemberById(user_name) is None: if email_login: state.setError( ac_name, _(u'Email address not known.'), 'email_address_not_known') else: state.setError( ac_name, _(u'Login name not found.'), 'login_name_not_found') elif not password_empty: state.setError( ac_password, _(u'Password incorrect.'), 'password_incorrect') if email_login: context.plone_utils.addPortalMessage( _(u'Login failed. Both email address and password are case ' u'sensitive, check that caps lock is not enabled.'), 'error') else: context.plone_utils.addPortalMessage( _(u'Login failed. Both login name and password are case ' u'sensitive, check that caps lock is not enabled.'), 'error') state.set(status='failure') else: # no javascript - do low tech login failure if email_login: context.plone_utils.addPortalMessage( _(u'Login failed. Both email address and password are case ' u'sensitive, check that caps lock is not enabled.'), 'error') else: context.plone_utils.addPortalMessage( _(u'Login failed. Both login name and password are case ' u'sensitive, check that caps lock is not enabled.'), 'error') state.set(status='failure_page') metric_datadog('plone.login_failed', tags={'user': request.form.get('__ac_name', '')}) return state