1

我有一个 JSF 2.2 webapp,其中包含一个合同和几个页面,它们直接位于 WebContent 文件夹中。合约由一张图片、一个模板文件template.xhtml和一个 css 文件global.css组成。到目前为止,一切都按预期工作。

现在我想使用 PicketLink 进行用户身份验证和授权,并遵循了一个教程(http://www.ocpsoft.org/security/simple-java-ee-jsf-login-page-with-jboss-picketlink-security/) ,但是当访问我的页面时,无法加载图像和 css 文件,只有模板适用,所以我的页面根本没有应用 CSS 样式,并且在 Firefox Inspector 中有一行显示(翻译自德语):“样式表http://localhost:8080/MyTestProject/login.xhtml未加载,因为它的 MIME 类型是“text/html”而不是“text/css”。

更换后

builder.http().allPaths().authenticateWith().form()... and so on

HttpSecurityConfiguration类中

builder.http().allPaths().unprotected()

可以再次加载图像和 css。

我尝试了以下(以及其他一些路径),但没有解决问题:

.forPath("/contracts/*").unprotected();

如何从 PicketLink 保护中排除合同文件夹?


这是我完整的 HttpSecurityConfiguration 类:

@ApplicationScoped
public class HttpSecurityConfiguration {

    public void onInit(@Observes SecurityConfigurationEvent event) {

    SecurityConfigurationBuilder builder = event.getBuilder();

    builder
    .http()
    .allPaths()
    .authenticateWith()
    .form()
    .loginPage("/login.xhtml")
    .errorPage("/loginError.xhtml")
    .restoreOriginalRequest()
    .forPath("/logout")
    .logout()
    .redirectTo("/index.xhtml")
    .forPath("/index.xhtml")
    .unprotected()
    //      .forPath("/contracts/*")
    //      .unprotected()
    ;
  }
}

编辑 在回复 Kukeltje 的评论时,我在模板中包含了 CSS

<h:head>
   <title><ui:insert name="title">MyTestProject</ui:insert></title>
   <h:outputStylesheet name="global.css" />
</h:head>

和图像

<h:graphicImage class="feature" name="logo-main.png" width="900" height="270" />

我还尝试将javax.faces.resource包含为不受保护,但仍然无法正常工作。

编辑#2 以下也不起作用,我从文档中得到了这个想法(PicketLink 参考第 12.2 章):

.forPath("/*.png").unprotected()
.forPath("/*.css").unprotected()
4

1 回答 1

1

我能够通过以下安全配置解决我的问题:

.forPath("/javax.faces.resource/*.png.xhtml").unprotected()

我在我的 Firefox Inspector 中看到浏览器试图从 加载图像/MyTestProject/javax.faces.resource/logo-main.png.xhtml?con=TemplateBlue,所以尝试上述方法似乎是合乎逻辑的并且有效!

于 2015-02-08T19:21:12.777 回答