我们必须在使用 spring 和 wicket 作为前端框架的遗留应用程序中实现 csrf。为了实现 csrf,我们尝试了两种方法:
方法一:将spring security升级到版本4,默认启用csrf,我们在所有wicket表单中添加了隐藏字段。 但不幸的是,我们在登录后收到 403 错误:
这是html页面:
<form wicket:id="Form" id="Form" method="post">
<input type="hidden" wicket:name="${_csrf.parameterName}" wicket:value="${_csrf.token}"/>
<span id="feedback" wicket:id="feedback"/>
<h2 align="left">Test Text</h2>
<table border="0" cellspacing="2" cellpadding="0" class="form">
<tr>
<td>
<h4>Test</h4>
</td>
<td>
<span class="required">*</span>
</td>
<td class="FieldName">
<select wicket:id="Test"/>
</td>
</tr>
<tr>
<td colspan="3"> </td>
</tr>
</table>
<div class="buttonpannel">
<div class="right">
<input wicket:id="submit" type="submit" value=" OK " readonly="readonly" style="width:80px;"/>
</div>
</form>
方法 2:我们也尝试像使用 java 一样生成令牌并遵循此link。但是拦截器和数据值处理器没有被调用,我们在实施后的应用程序中看不出有什么不同。这是我们的 web.xml:
<security:http entry-point-ref="http403EntryPoint">
<security:intercept-url pattern="/**" access="IS_AUTHENTICATED_FULLY"/>
<security:custom-filter ref="preAuthFilter" position="PRE_AUTH_FILTER"/>
<!-- security:access-denied-handler error-page="/error/403" /-->
</security:http>
<bean id="http403EntryPoint" class="org.springframework.security.web.authentication.Http403ForbiddenEntryPoint"/>
<bean id="preAuthFilter" class="com.c.w.security.PreAuthFilter">
<property name="authenticationManager" ref="authenticationManager"/>
<property name="checkForPrincipalChanges" value="true"/>
</bean>
<bean id="preauthAuthProvider" class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider">
<property name="preAuthenticatedUserDetailsService">
<bean class="com.c.w.security.UserDetailsService"/>
</property>
</bean>
<security:authentication-manager alias="authenticationManager">
<security:authentication-provider ref='preauthAuthProvider'/>
</security:authentication-manager>
<security:global-method-security secured-annotations="enabled"/>
<!-- Data Value Processor -->
<bean name="requestDataValueProcessor" class="com.c.w.csrf.CSRFRequestDataValueProcessor"/>
<!-- Interceptor handlers -->
<mvc:interceptors>
<bean class="com.c.w.csrf.CSRFHandlerInterceptor"/>
</mvc:interceptors>
现在我们有办法让 csrf 在我们的应用程序中工作。我们使用 wicket 1.5.10 版本