16. 保护流
对于任何应用程序来说,安全性都是一个重要的概念。最终用户不应通过简单地猜测 URL 来访问站点的任何部分。站点的敏感区域必须确保仅处理授权请求。Spring Security 是一个经过验证的安全平台,可以在多个级别与您的应用程序集成。本节重点介绍保护流执行。
16.1. 如何保护流?
保护流是一个三步过程:
-
使用身份验证和授权规则配置 Spring Security。
-
使用安全元素注释流定义以定义安全规则。
-
添加
SecurityFlowExecutionListener
以处理安全规则。
必须完成其中每个步骤,否则不应用流安全规则。
16.2.secured
元素
这secured
元素指定其包含的元素在完全进入之前应应用授权检查。这在受保护的流执行的每个阶段不得超过一次。
可以保护流的三个阶段:流、状态和转换。在每种情况下,secured
元素是相同的。 这secured
元素位于它保护的元素内。例如,为了保护状态,请secured
元素直接出现在该状态中,如下所示:
<view-state id="secured-view">
<secured attributes="ROLE_USER" />
...
</view-state>
16.3.SecurityFlowExecutionListener
在流中单独定义安全规则不会保护流。您还必须定义一个SecurityFlowExecutionListener
并将其应用于 Flow 执行器,如下所示:
<webflow:flow-executor id="flowExecutor" flow-registry="flowRegistry">
<webflow:flow-execution-listeners>
<webflow:listener ref="securityFlowExecutionListener" />
</webflow:flow-execution-listeners>
</webflow:flow-executor>
<bean id="securityFlowExecutionListener"
class="org.springframework.webflow.security.SecurityFlowExecutionListener" />
如果拒绝访问应用程序的一部分,则AccessDeniedException
被抛出。此异常稍后被 Spring Security 捕获并用于提示用户进行身份验证。允许此异常不受限制地向上移动非常重要。否则,可能不会提示最终用户进行身份验证。
16.3.1. 自定义授权管理器
如果您的应用程序使用非基于角色的权限,则需要配置自定义AuthorizaitonManager
. 您可以覆盖AuthorityAuthorizationManager
默认通过 这authorizationManagerInitializer
安全侦听器上的属性。 例如:
@Bean
SecurityFlowExecutionListener securityFlowExecutionListener() {
SecurityFlowExecutionListener listener = new SecurityFlowExecutionListener();
listener.setAuthorizationManagerInitializer(securityRule -> {
// ...
});
return listener;
}
16.3.2. 自定义访问决策管理器
Spring Security 的AccessDecisionManager
已弃用,并将在将来的版本中删除。因此,建议配置AuthorizationManager
相反。 但是,如果您必须使用AccessDecisionManager
,您可以将accessDecisionManager
安全监听器的属性,或覆盖createAccessDecisionManager(SecurityRule)
protected 方法。
要了解有关 Spring Security 的更多信息AuthorizationManager
API,请参阅 Spring Security 参考文档。
16.4. 配置 Spring Security
Spring Security 具有强大的配置选项。 由于每个应用程序和环境都有自己的安全要求,因此 Spring Security 参考文档是了解可用选项的最佳场所。
两个booking-faces
和booking-mvc
示例应用程序配置为使用 Spring Security。
Spring 和web.xml
水平。
16.4.1. 弹簧配置
Spring 配置定义http
细节(例如受保护的 URL 和登录/注销机制)和authentication-provider
.
对于示例应用程序,配置了本地身份验证提供程序。
以下示例为 Web 流配置 Spring Security:
<security:http auto-config="true">
<security:form-login login-page="/spring/login"
login-processing-url="/spring/loginProcess"
default-target-url="/spring/main"
authentication-failure-url="/spring/login?login_error=1" />
<security:logout logout-url="/spring/logout" logout-success-url="/spring/logout-success" />
</security:http>
<security:authentication-provider>
<security:password-encoder hash="md5" />
<security:user-service>
<security:user name="keith" password="417c7382b16c395bc25b5da1398cf076"
authorities="ROLE_USER,ROLE_SUPERVISOR" />
<security:user name="erwin" password="12430911a8af075c6f41c6976af22b09"
authorities="ROLE_USER,ROLE_SUPERVISOR" />
<security:user name="jeremy" password="57c6cbff0d421449be820763f03139eb"
authorities="ROLE_USER" />
<security:user name="scott" password="942f2339bf50796de535a384f0d1af3e"
authorities="ROLE_USER" />
</security:user-service>
</security:authentication-provider>
16.4.2.web.xml
配置
在web.xml
文件,一个filter
定义为拦截所有请求。
此过滤器侦听登录和注销请求并相应地处理它们。
它还会抓住AccesDeniedException
实例并将用户重定向到登录页面。
以下示例定义了此类筛选器:
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>