699.c82907d3.js 9.9 KB
Newer Older
茶陵後's avatar
茶陵後 已提交
1
(window.webpackJsonp=window.webpackJsonp||[]).push([[699],{1129:function(e,t,r){"use strict";r.r(t);var s=r(56),a=Object(s.a)({},(function(){var e=this,t=e.$createElement,r=e._self._c||t;return r("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[r("h1",{attrs:{id:"_8-保障资金流动"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#_8-保障资金流动"}},[e._v("#")]),e._v(" 8. 保障资金流动")]),e._v(" "),r("h2",{attrs:{id:"_8-1-导言"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#_8-1-导言"}},[e._v("#")]),e._v(" 8.1.导言")]),e._v(" "),r("p",[e._v("安全性对于任何应用程序都是一个重要的概念。最终用户不应该仅仅通过猜测 URL 就能够访问网站的任何部分。网站的敏感区域必须确保只处理授权的请求。 Spring 安全性是一种经过验证的安全平台,可以在多个级别上与你的应用程序集成。本节将重点讨论保护流执行的问题。")]),e._v(" "),r("h2",{attrs:{id:"_8-2-我如何确保一个流程"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#_8-2-我如何确保一个流程"}},[e._v("#")]),e._v(" 8.2.我如何确保一个流程?")]),e._v(" "),r("p",[e._v("确保流执行的安全性是一个三步过程:")]),e._v(" "),r("ul",[r("li",[r("p",[e._v("使用身份验证和授权规则配置 Spring 安全性")])]),e._v(" "),r("li",[r("p",[e._v("用受保护的元素注释流定义,以定义安全规则")])]),e._v(" "),r("li",[r("p",[e._v("添加 SecurityFlowExecutionListener 以处理安全规则。")])])]),e._v(" "),r("p",[e._v("这些步骤中的每一个都必须完成,否则将不应用流安全规则。")]),e._v(" "),r("h2",{attrs:{id:"_8-3-安全元件"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#_8-3-安全元件"}},[e._v("#")]),e._v(" 8.3.安全元件")]),e._v(" "),r("p",[e._v("安全元素指定其包含的元素在完全进入之前应用授权检查。这可能不会在每个被保护的流执行阶段中发生一次。")]),e._v(" "),r("p",[e._v("可以保证流执行的三个阶段:流、状态和转换。在每种情况下,安全元素的语法都是相同的。固定元件位于它所固定的元件内部。例如,要保护状态,受保护元素直接发生在该状态内:")]),e._v(" "),r("div",{staticClass:"language- extra-class"},[r("pre",{pre:!0,attrs:{class:"language-text"}},[r("code",[e._v('<view-state id="secured-view">\n    <secured attributes="ROLE_USER" />\n    ...\n</view-state>\n\t\t\n')])])]),r("h3",{attrs:{id:"_8-3-1-安全属性"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#_8-3-1-安全属性"}},[e._v("#")]),e._v(" 8.3.1.安全属性")]),e._v(" "),r("p",[r("code",[e._v("attributes")]),e._v("属性是 Spring 安全授权属性的逗号分隔列表。通常,这些都是特定的安全角色。 Spring 安全访问决策管理器将这些属性与用户授予的属性进行比较。")]),e._v(" "),r("div",{staticClass:"language- extra-class"},[r("pre",{pre:!0,attrs:{class:"language-text"}},[r("code",[e._v('<secured attributes="ROLE_USER" />\n\t\t\t\n')])])]),r("p",[e._v("默认情况下,基于角色的访问决策管理器用于确定是否允许用户访问。如果你的应用程序不使用授权角色,则需要重写此内容。")]),e._v(" "),r("h3",{attrs:{id:"_8-3-2-匹配类型"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#_8-3-2-匹配类型"}},[e._v("#")]),e._v(" 8.3.2.匹配类型")]),e._v(" "),r("p",[e._v("有两种类型的匹配可用:"),r("code",[e._v("any")]),e._v(""),r("code",[e._v("all")]),e._v("。如果至少向用户授予了一个所需的安全属性,则允许访问。All,只有当每个所需的安全属性都被授予给用户时,才允许访问。")]),e._v(" "),r("div",{staticClass:"language- extra-class"},[r("pre",{pre:!0,attrs:{class:"language-text"}},[r("code",[e._v('<secured attributes="ROLE_USER, ROLE_ANONYMOUS" match="any" />\n\t\t\t\n')])])]),r("p",[e._v("这个属性是可选的。如果未定义,默认值为"),r("code",[e._v("any")]),e._v("")]),e._v(" "),r("p",[e._v("只有在使用默认的访问决策管理器时,才会尊重"),r("code",[e._v("match")]),e._v("属性。")]),e._v(" "),r("h2",{attrs:{id:"_8-4-securityflowexecutionlistener"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#_8-4-securityflowexecutionlistener"}},[e._v("#")]),e._v(" 8.4.SecurityFlowExecutionListener")]),e._v(" "),r("p",[e._v("在流中定义安全规则本身并不能保护流的执行。还必须在 WebFlow 配置中定义"),r("code",[e._v("SecurityFlowExecutionListener")]),e._v(",并将其应用于流执行器。")]),e._v(" "),r("div",{staticClass:"language- extra-class"},[r("pre",{pre:!0,attrs:{class:"language-text"}},[r("code",[e._v('<webflow:flow-executor id="flowExecutor" flow-registry="flowRegistry">\n    <webflow:flow-execution-listeners>\n        <webflow:listener ref="securityFlowExecutionListener" />\n    </webflow:flow-execution-listeners>\n</webflow:flow-executor>\n\n<bean id="securityFlowExecutionListener"\n      class="org.springframework.webflow.security.SecurityFlowExecutionListener" />\n\t\t\n')])])]),r("p",[e._v("如果拒绝访问应用程序的一部分,将抛出"),r("code",[e._v("AccessDeniedException")]),e._v("。此异常稍后将被 Spring Security 捕获,并用于提示用户进行身份验证。重要的是,允许此异常在执行堆栈中不受约束地向上移动,否则可能不会提示最终用户进行身份验证。")]),e._v(" "),r("h3",{attrs:{id:"_8-4-1-自定义访问决策管理器"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#_8-4-1-自定义访问决策管理器"}},[e._v("#")]),e._v(" 8.4.1.自定义访问决策管理器")]),e._v(" "),r("p",[e._v("如果你的应用程序使用的是不基于角色的权限,则需要配置一个自定义"),r("code",[e._v("AccessDecisionManager")]),e._v("。通过在安全侦听器上设置"),r("code",[e._v("accessDecisionManager")]),e._v("属性,可以覆盖默认的决策管理器。请咨询"),r("a",{attrs:{href:"http://static.springframework.org/spring-security/site/reference.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Spring Security reference documentation"),r("OutboundLink")],1),e._v("以了解更多有关决策经理的信息。")]),e._v(" "),r("div",{staticClass:"language- extra-class"},[r("pre",{pre:!0,attrs:{class:"language-text"}},[r("code",[e._v('<bean id="securityFlowExecutionListener"\n      class="org.springframework.webflow.security.SecurityFlowExecutionListener">\n    <property name="accessDecisionManager" ref="myCustomAccessDecisionManager" />\n</bean>\n\t\t\t\n')])])]),r("h2",{attrs:{id:"_8-5-配置-spring-安全性"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#_8-5-配置-spring-安全性"}},[e._v("#")]),e._v(" 8.5.配置 Spring 安全性")]),e._v(" "),r("p",[e._v("Spring 安全性具有可供选择的健壮配置。由于每个应用程序和环境都有自己的安全需求,因此"),r("a",{attrs:{href:"http://static.springframework.org/spring-security/site/reference.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Spring Security reference documentation"),r("OutboundLink")],1),e._v("是学习可用选项的最佳位置。")]),e._v(" "),r("p",[r("code",[e._v("booking-faces")]),e._v(""),r("code",[e._v("booking-mvc")]),e._v("示例应用程序都被配置为使用 Spring 安全性。在 Spring 和 web.xml 级别都需要配置。")]),e._v(" "),r("h3",{attrs:{id:"_8-5-1-spring-配置"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#_8-5-1-spring-配置"}},[e._v("#")]),e._v(" 8.5.1. Spring 配置")]),e._v(" "),r("p",[e._v("Spring 配置定义了"),r("code",[e._v("http")]),e._v("细节(例如受保护的 URL 和登录/注销机制)和"),r("code",[e._v("authentication-provider")]),e._v("。对于样例应用程序,配置了本地身份验证提供程序。")]),e._v(" "),r("div",{staticClass:"language- extra-class"},[r("pre",{pre:!0,attrs:{class:"language-text"}},[r("code",[e._v('<security:http auto-config="true">\n    <security:form-login login-page="/spring/login"\n                         login-processing-url="/spring/loginProcess"\n                         default-target-url="/spring/main"\n                         authentication-failure-url="/spring/login?login_error=1" />\n    <security:logout logout-url="/spring/logout" logout-success-url="/spring/logout-success" />\n</security:http>\n\n<security:authentication-provider>\n    <security:password-encoder hash="md5" />\n    <security:user-service>\n        <security:user name="keith" password="417c7382b16c395bc25b5da1398cf076"\n                       authorities="ROLE_USER,ROLE_SUPERVISOR" />\n        <security:user name="erwin" password="12430911a8af075c6f41c6976af22b09"\n                       authorities="ROLE_USER,ROLE_SUPERVISOR" />\n        <security:user name="jeremy" password="57c6cbff0d421449be820763f03139eb"\n                       authorities="ROLE_USER" />\n        <security:user name="scott" password="942f2339bf50796de535a384f0d1af3e"\n                       authorities="ROLE_USER" />\n    </security:user-service>\n</security:authentication-provider>\n\t\t\t\n')])])]),r("h3",{attrs:{id:"_8-5-2-web-xml-配置"}},[r("a",{staticClass:"header-anchor",attrs:{href:"#_8-5-2-web-xml-配置"}},[e._v("#")]),e._v(" 8.5.2.web.xml 配置")]),e._v(" "),r("p",[e._v(""),r("code",[e._v("web.xml")]),e._v("文件中,定义了一个"),r("code",[e._v("filter")]),e._v("来拦截所有请求。此筛选器将监听登录/注销请求,并对其进行相应的处理。它还将捕获"),r("code",[e._v("AccesDeniedException")]),e._v("s 并将用户重定向到登录页面。")]),e._v(" "),r("div",{staticClass:"language- extra-class"},[r("pre",{pre:!0,attrs:{class:"language-text"}},[r("code",[e._v("<filter>\n    <filter-name>springSecurityFilterChain</filter-name>\n    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>\n</filter>\n\n<filter-mapping>\n    <filter-name>springSecurityFilterChain</filter-name>\n    <url-pattern>/*</url-pattern>\n</filter-mapping>\n\t\t\t\n")])])])])}),[],!1,null,null,null);t.default=a.exports}}]);