我参与了一个使用 Spring Security 4.x 和 JSF 2.2 和 Facelets 的项目。我刚刚注意到这个版本中的spring security默认启用了使用请求 token 的跨站点请求伪造保护,这种情况是你必须放置标签<sec:csrfMetaTags>
在许多页面中(如果没有,spring 拒绝请求),lib spring-faces
在 2.4.1 中没有这些用于 Facelets (XHTML) 的标签。
我试图找到一个实现,以便使用这些框架来运行我的项目,但我找不到任何实现,你知道有什么适应吗?
就我而言,我只改编了我需要的部分(此时),如果没有公开改编,我很乐意将其放入开源项目并尝试改编所有库。
谢谢。
更新
我创建了一篇博文来解释我的解决方案:
http://halexv.blogspot.mx/2015/07/spring-security-4x-csrf-protection-for.html
最佳答案
您有 JSF 的 spring 标记库,您可以从此链接访问。
http://docs.spring.io/spring-webflow/docs/current/reference/html/spring-faces.html#spring-faces-security-taglib
我相信你已经知道这一点。但您的实际问题与 有关CRSF 您必须将其添加到所有页面中。 这具体可以通过将 token 自动添加到您的表单中来实现,如下所示
创建一个 util 类并添加一个 token 生成器
static String getTokenForSession (HttpSession session) {
String token = null;
synchronized (session) {
token = (String) session.getAttribute(CSRF_TOKEN_FOR_SESSION_ATTR_NAME);
if (null==token) {
token=UUID.randomUUID().toString();
session.setAttribute(CSRF_TOKEN_FOR_SESSION_ATTR_NAME, token);
}
}
return token;
}
实现
RequestDataValueProcessor
public class CSRFRequestDataValueProcessor implements RequestDataValueProcessor {
...
@Override
public Map<String,String> getExtraHiddenFields(HttpServletRequest request) {
Map<String,String> hiddenFields = new HashMap<String,String>();
hiddenFields.put(CSRFTokenManager.CSRF_PARAM_NAME, CSRFTokenManager.getTokenForSession(request.getSession()));
return hiddenFields;
}
}
然后定义bean
<bean name="requestDataValueProcessor" class="com...CSRFRequestDataValueProcessor"/>
信用引用 - http://blog.eyallupu.com/2012/04/csrf-defense-in-spring-mvc-31.html
关于spring - 是否有用于 Facelets 的 Spring Security 4.x 标签库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30293574/