601.34cfecd2.js 5.9 KB
Newer Older
茶陵後's avatar
茶陵後 已提交
1
(window.webpackJsonp=window.webpackJsonp||[]).push([[601],{1032:function(e,t,n){"use strict";n.r(t);var _=n(56),o=Object(_.a)({},(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[n("h1",{attrs:{id:"run-as-身份验证替换"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#run-as-身份验证替换"}},[e._v("#")]),e._v(" run-as 身份验证替换")]),e._v(" "),n("h2",{attrs:{id:"概述"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#概述"}},[e._v("#")]),e._v(" 概述")]),e._v(" "),n("p",[e._v("在安全对象回调阶段,"),n("code",[e._v("AbstractSecurityInterceptor")]),e._v("可以在"),n("code",[e._v("SecurityContext")]),e._v(""),n("code",[e._v("SecurityContextHolder")]),e._v("中临时替换"),n("code",[e._v("Authentication")]),e._v("对象。只有当原始"),n("code",[e._v("Authentication")]),e._v("对象被"),n("code",[e._v("AuthenticationManager")]),e._v(""),n("code",[e._v("AccessDecisionManager")]),e._v("成功处理时,才会发生这种情况。"),n("code",[e._v("RunAsManager")]),e._v("将指示在"),n("code",[e._v("SecurityInterceptorCallback")]),e._v("期间应该使用的替换"),n("code",[e._v("Authentication")]),e._v("对象(如果有的话)。")]),e._v(" "),n("p",[e._v("通过在安全对象回调阶段临时替换"),n("code",[e._v("Authentication")]),e._v("对象,安全调用将能够调用需要不同身份验证和授权凭据的其他对象。它还能够对特定的"),n("code",[e._v("GrantedAuthority")]),e._v("对象执行任何内部安全检查。因为 Spring Security 提供了许多帮助器类,这些帮助器类根据"),n("code",[e._v("SecurityContextHolder")]),e._v("的内容自动配置远程协议,所以在调用远程 Web 服务时,这些 run-as 替换特别有用。")]),e._v(" "),n("h2",{attrs:{id:"配置"}},[n("a",{staticClass:"header-anchor",attrs:{href:"#配置"}},[e._v("#")]),e._v(" 配置")]),e._v(" "),n("p",[e._v("一个"),n("code",[e._v("RunAsManager")]),e._v("接口由 Spring Security 提供:")]),e._v(" "),n("div",{staticClass:"language- extra-class"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[e._v("Authentication buildRunAs(Authentication authentication, Object object,\n\tList<ConfigAttribute> config);\n\nboolean supports(ConfigAttribute attribute);\n\nboolean supports(Class clazz);\n")])])]),n("p",[e._v("第一个方法返回"),n("code",[e._v("Authentication")]),e._v("对象,该对象应该在方法调用的持续时间内替换现有的"),n("code",[e._v("Authentication")]),e._v("对象。如果该方法返回"),n("code",[e._v("null")]),e._v(",则表示不应进行替换。第二种方法由"),n("code",[e._v("AbstractSecurityInterceptor")]),e._v("使用,作为其配置属性的启动验证的一部分。安全拦截器实现调用"),n("code",[e._v("supports(Class)")]),e._v("方法,以确保配置的"),n("code",[e._v("RunAsManager")]),e._v("支持安全拦截器将呈现的安全对象类型。")]),e._v(" "),n("p",[e._v("一个"),n("code",[e._v("RunAsManager")]),e._v("的具体实现提供了 Spring 安全性。"),n("code",[e._v("RunAsManagerImpl")]),e._v("类返回一个替换"),n("code",[e._v("RunAsUserToken")]),e._v(",如果有"),n("code",[e._v("ConfigAttribute")]),e._v(""),n("code",[e._v("RUN_AS_")]),e._v("开头。如果找到任何这样的"),n("code",[e._v("ConfigAttribute")]),e._v(",则替换的"),n("code",[e._v("RunAsUserToken")]),e._v("将包含与原始"),n("code",[e._v("Authentication")]),e._v("对象相同的主体、凭据和授予的权限,以及每个"),n("code",[e._v("RUN_AS_``ConfigAttribute")]),e._v("的新"),n("code",[e._v("SimpleGrantedAuthority")]),e._v("。每个新的"),n("code",[e._v("SimpleGrantedAuthority")]),e._v("都将被前缀为"),n("code",[e._v("ROLE_")]),e._v(",然后是"),n("code",[e._v("RUN_AS``ConfigAttribute")]),e._v("。例如,一个"),n("code",[e._v("RUN_AS_SERVER")]),e._v("将导致替换"),n("code",[e._v("RunAsUserToken")]),e._v("中包含一个"),n("code",[e._v("ROLE_RUN_AS_SERVER")]),e._v("授予的权限。")]),e._v(" "),n("p",[e._v("替换"),n("code",[e._v("RunAsUserToken")]),e._v("就像任何其他"),n("code",[e._v("Authentication")]),e._v("对象一样。它需要通过"),n("code",[e._v("AuthenticationManager")]),e._v("进行身份验证,很可能是通过将其委托给合适的"),n("code",[e._v("AuthenticationProvider")]),e._v(""),n("code",[e._v("RunAsImplAuthenticationProvider")]),e._v("执行这种身份验证。它只是接受任何"),n("code",[e._v("RunAsUserToken")]),e._v("呈现为有效。")]),e._v(" "),n("p",[e._v("为了确保恶意代码不会创建"),n("code",[e._v("RunAsUserToken")]),e._v(",并将其呈现给"),n("code",[e._v("RunAsImplAuthenticationProvider")]),e._v(",密钥的散列存储在所有生成的令牌中。在 Bean 上下文中使用相同的键创建"),n("code",[e._v("RunAsManagerImpl")]),e._v(""),n("code",[e._v("RunAsImplAuthenticationProvider")]),e._v(":")]),e._v(" "),n("div",{staticClass:"language- extra-class"},[n("pre",{pre:!0,attrs:{class:"language-text"}},[n("code",[e._v('<bean id="runAsManager"\n\tclass="org.springframework.security.access.intercept.RunAsManagerImpl">\n<property name="key" value="my_run_as_password"/>\n</bean>\n\n<bean id="runAsAuthenticationProvider"\n\tclass="org.springframework.security.access.intercept.RunAsImplAuthenticationProvider">\n<property name="key" value="my_run_as_password"/>\n</bean>\n')])])]),n("p",[e._v("通过使用相同的键,每个"),n("code",[e._v("RunAsUserToken")]),e._v("都可以验证它是由批准的"),n("code",[e._v("RunAsManagerImpl")]),e._v("创建的。出于安全原因,"),n("code",[e._v("RunAsUserToken")]),e._v("在创建后是不可变的")]),e._v(" "),n("p",[n("RouterLink",{attrs:{to:"/spring-security/x509.html"}},[e._v("X509")]),n("RouterLink",{attrs:{to:"/spring-security/logout.html"}},[e._v("Logout")])],1)])}),[],!1,null,null,null);t.default=o.exports}}]);