(window.webpackJsonp=window.webpackJsonp||[]).push([[582],{1013:function(t,e,n){"use strict";n.r(e);var i=n(56),a=Object(i.a)({},(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[n("h1",{attrs:{id:"认证事件"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#认证事件"}},[t._v("#")]),t._v(" 认证事件")]),t._v(" "),n("p",[t._v("对于每个成功或失败的身份验证,将分别触发"),n("code",[t._v("AuthenticationSuccessEvent")]),t._v("或"),n("code",[t._v("AbstractAuthenticationFailureEvent")]),t._v("。")]),t._v(" "),n("p",[t._v("要侦听这些事件,你必须首先发布"),n("code",[t._v("AuthenticationEventPublisher")]),t._v("。 Spring 安全性的"),n("code",[t._v("DefaultAuthenticationEventPublisher")]),t._v("可能做得很好:")]),t._v(" "),n("p",[t._v("爪哇")]),t._v(" "),n("div",{staticClass:"language- extra-class"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("@Bean\npublic AuthenticationEventPublisher authenticationEventPublisher\n (ApplicationEventPublisher applicationEventPublisher) {\n return new DefaultAuthenticationEventPublisher(applicationEventPublisher);\n}\n")])])]),n("p",[t._v("Kotlin")]),t._v(" "),n("div",{staticClass:"language- extra-class"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("@Bean\nfun authenticationEventPublisher\n (applicationEventPublisher: ApplicationEventPublisher?): AuthenticationEventPublisher {\n return DefaultAuthenticationEventPublisher(applicationEventPublisher)\n}\n")])])]),n("p",[t._v("然后,你可以使用 Spring 的"),n("code",[t._v("@EventListener")]),t._v("支持:")]),t._v(" "),n("p",[t._v("爪哇")]),t._v(" "),n("div",{staticClass:"language- extra-class"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("@Component\npublic class AuthenticationEvents {\n\t@EventListener\n public void onSuccess(AuthenticationSuccessEvent success) {\n\t\t// ...\n }\n\n @EventListener\n public void onFailure(AbstractAuthenticationFailureEvent failures) {\n\t\t// ...\n }\n}\n")])])]),n("p",[t._v("Kotlin")]),t._v(" "),n("div",{staticClass:"language- extra-class"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("@Component\nclass AuthenticationEvents {\n @EventListener\n fun onSuccess(success: AuthenticationSuccessEvent?) {\n // ...\n }\n\n @EventListener\n fun onFailure(failures: AbstractAuthenticationFailureEvent?) {\n // ...\n }\n}\n")])])]),n("p",[t._v("虽然类似于"),n("code",[t._v("AuthenticationSuccessHandler")]),t._v("和"),n("code",[t._v("AuthenticationFailureHandler")]),t._v(",但它们很好,因为它们可以独立于 Servlet API 使用。")]),t._v(" "),n("h2",{attrs:{id:"添加异常映射"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#添加异常映射"}},[t._v("#")]),t._v(" 添加异常映射")]),t._v(" "),n("p",[t._v("默认情况下,"),n("code",[t._v("DefaultAuthenticationEventPublisher")]),t._v("将为以下事件发布"),n("code",[t._v("AbstractAuthenticationFailureEvent")]),t._v(":")]),t._v(" "),n("table",[n("thead",[n("tr",[n("th",[t._v("Exception")]),t._v(" "),n("th",[t._v("事件")])])]),t._v(" "),n("tbody",[n("tr",[n("td",[n("code",[t._v("BadCredentialsException")])]),t._v(" "),n("td",[n("code",[t._v("AuthenticationFailureBadCredentialsEvent")])])]),t._v(" "),n("tr",[n("td",[n("code",[t._v("UsernameNotFoundException")])]),t._v(" "),n("td",[n("code",[t._v("AuthenticationFailureBadCredentialsEvent")])])]),t._v(" "),n("tr",[n("td",[n("code",[t._v("AccountExpiredException")])]),t._v(" "),n("td",[n("code",[t._v("AuthenticationFailureExpiredEvent")])])]),t._v(" "),n("tr",[n("td",[n("code",[t._v("ProviderNotFoundException")])]),t._v(" "),n("td",[n("code",[t._v("AuthenticationFailureProviderNotFoundEvent")])])]),t._v(" "),n("tr",[n("td",[n("code",[t._v("DisabledException")])]),t._v(" "),n("td",[n("code",[t._v("AuthenticationFailureDisabledEvent")])])]),t._v(" "),n("tr",[n("td",[n("code",[t._v("LockedException")])]),t._v(" "),n("td",[n("code",[t._v("AuthenticationFailureLockedEvent")])])]),t._v(" "),n("tr",[n("td",[n("code",[t._v("AuthenticationServiceException")])]),t._v(" "),n("td",[n("code",[t._v("AuthenticationFailureServiceExceptionEvent")])])]),t._v(" "),n("tr",[n("td",[n("code",[t._v("CredentialsExpiredException")])]),t._v(" "),n("td",[n("code",[t._v("AuthenticationFailureCredentialsExpiredEvent")])])]),t._v(" "),n("tr",[n("td",[n("code",[t._v("InvalidBearerTokenException")])]),t._v(" "),n("td",[n("code",[t._v("AuthenticationFailureBadCredentialsEvent")])])])])]),t._v(" "),n("p",[t._v("发布者进行完全的"),n("code",[t._v("Exception")]),t._v("匹配,这意味着这些异常的子类也不会产生事件。")]),t._v(" "),n("p",[t._v("为此,你可能希望通过"),n("code",[t._v("setAdditionalExceptionMappings")]),t._v("方法向发布服务器提供额外的映射:")]),t._v(" "),n("p",[t._v("爪哇")]),t._v(" "),n("div",{staticClass:"language- extra-class"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("@Bean\npublic AuthenticationEventPublisher authenticationEventPublisher\n (ApplicationEventPublisher applicationEventPublisher) {\n Map,\n Class> mapping =\n Collections.singletonMap(FooException.class, FooEvent.class);\n AuthenticationEventPublisher authenticationEventPublisher =\n new DefaultAuthenticationEventPublisher(applicationEventPublisher);\n authenticationEventPublisher.setAdditionalExceptionMappings(mapping);\n return authenticationEventPublisher;\n}\n")])])]),n("p",[t._v("Kotlin")]),t._v(" "),n("div",{staticClass:"language- extra-class"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("@Bean\nfun authenticationEventPublisher\n (applicationEventPublisher: ApplicationEventPublisher?): AuthenticationEventPublisher {\n val mapping: Map, Class> =\n mapOf(Pair(FooException::class.java, FooEvent::class.java))\n val authenticationEventPublisher = DefaultAuthenticationEventPublisher(applicationEventPublisher)\n authenticationEventPublisher.setAdditionalExceptionMappings(mapping)\n return authenticationEventPublisher\n}\n")])])]),n("h2",{attrs:{id:"默认事件"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#默认事件"}},[t._v("#")]),t._v(" 默认事件")]),t._v(" "),n("p",[t._v("并且,你可以在任何"),n("code",[t._v("AuthenticationException")]),t._v("的情况下提供一个包罗万象的事件:")]),t._v(" "),n("p",[t._v("爪哇")]),t._v(" "),n("div",{staticClass:"language- extra-class"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("@Bean\npublic AuthenticationEventPublisher authenticationEventPublisher\n (ApplicationEventPublisher applicationEventPublisher) {\n AuthenticationEventPublisher authenticationEventPublisher =\n new DefaultAuthenticationEventPublisher(applicationEventPublisher);\n authenticationEventPublisher.setDefaultAuthenticationFailureEvent\n (GenericAuthenticationFailureEvent.class);\n return authenticationEventPublisher;\n}\n")])])]),n("p",[t._v("Kotlin")]),t._v(" "),n("div",{staticClass:"language- extra-class"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[t._v("@Bean\nfun authenticationEventPublisher\n (applicationEventPublisher: ApplicationEventPublisher?): AuthenticationEventPublisher {\n val authenticationEventPublisher = DefaultAuthenticationEventPublisher(applicationEventPublisher)\n authenticationEventPublisher.setDefaultAuthenticationFailureEvent(GenericAuthenticationFailureEvent::class.java)\n return authenticationEventPublisher\n}\n")])])]),n("p",[n("RouterLink",{attrs:{to:"/spring-security/logout.html"}},[t._v("Logout")]),n("RouterLink",{attrs:{to:"/authorization/index.html"}},[t._v("授权")])],1)])}),[],!1,null,null,null);e.default=a.exports}}]);