当前位置: 首页 > 知识库问答 >
问题:

使用f:ajax的PrimeFaces组件和普通JSF组件停止使用SpringSecurity

滕项明
2023-03-14

我正试图将SpringSecurity5.1.4.RELEASE集成到一个已经在运行的JSF2.2-PrimeFaces6.1应用程序中,以实现安全性。当我尝试访问受保护的页面“logged.xhtml”时,spring会触发并将我带到登录页面“login.xhtml”,因此spring似乎工作正常。

问题是,一旦我配置了Spring,所有Primefacep:命令链接都停止工作(以及其他Primeface组件中的一些“操作”方法)。JSF Sun组件(xmlns: h="http://java.sun.com/jsf/html"),如"h: outputLink"继续工作,但是带有f: ajaxh: commandButton也会失败。

我不明白为什么Primeface组件或带有f: ajax的JSF组件被破坏了...

这是我的faces-config.xml:

<application>
    <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>

    <resource-bundle>
        <base-name>messages</base-name>
        <var>msg</var>
    </resource-bundle>

    <message-bundle>messages</message-bundle>

    <locale-config>
        <default-locale>en</default-locale>
        <supported-locale>en</supported-locale>
        <supported-locale>es</supported-locale>
    </locale-config>
</application>

这是我的WEB. XML:

<servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>

<context-param>
    <description>State saving method: 'client' or 'server' (=default). See JSF Specification 2.5.2</description>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>client</param-value>
</context-param>

<context-param>
    <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
    <param-value>resources.application</param-value>
</context-param>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<context-param>
    <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
    <param-value>.xhtml</param-value>
</context-param>

<context-param>
    <param-name>javax.faces.PROJECT_STAGE</param-name>
    <param-value>Production</param-value>
</context-param>

<session-config>
    <session-timeout>30</session-timeout>
</session-config>

<welcome-file-list>
    <welcome-file>index.xhtml</welcome-file>
</welcome-file-list>

这是我的安全初始值设定项:

public class SecurityWebInitializer extends AbstractSecurityWebApplicationInitializer{

}

这是我的安全配置:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {

    auth.inMemoryAuthentication().withUser(User.withDefaultPasswordEncoder().username("admin").password("1234").roles("ADMIN").build());
    auth.inMemoryAuthentication().withUser(User.withDefaultPasswordEncoder().username("usu").password("1234").roles("NORMAL").build());
}

@Override
protected void configure(HttpSecurity http) throws Exception {

    http
    .authorizeRequests()
        .antMatchers("/logged.xhtml").authenticated()
        .anyRequest().permitAll()
        .and()
    .formLogin()
        .loginPage("/login.xhtml").defaultSuccessUrl("/logged.xhtml").failureUrl("/error.xhtml")
        .permitAll()
        .and()
    .logout().logoutUrl("/logout")
        .permitAll(); 

}

}

编辑:

检查浏览器控制台后,我发现每次按下任何Primefaces链接/按钮时,都会出现以下错误:

XHR POSTlocalhost:8080/springtest/index.xhtml[HTTP/1.1 403禁止2ms]

我认为权限有问题,但在查看了我的SecurityConfig文件后,我没有看到问题。

以下行应限制对受保护页面的访问:

.antMatchers(“/logged.xhtml”).authenticated()

该行应允许页面其余部分的所有交通:

. anyask(). permitAll()

我做错了什么?

有什么建议吗?

提前感谢!

附言:让我知道你是否需要关于这个项目的任何进一步的信息

共有1个答案

束俊英
2023-03-14

我想回答这个问题,以防其他人需要它:

当使用模板编写JSF页面时,始终将“csrf”令牌放在上面的每一个表单中。把代币放在一个地方是不够的。

<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
 类似资料:
  • 我使用jsf和primefaces组件,我想通过jquery为h:outputText设置一个值 我用chrome工具检查标签(id相同) 但是这个值没有设置为元素,这里是jsf代码: 以下是我的h:outputText标记的html代码: 下面是jQuery脚本: 我做了测试。text()和val()以及html()方法,但未设置值 提前谢谢你

  • 上图显示了数据表中图像的id。当用户单击download时,应该下载对应于该id的图像。然而,我不确定如何做到这一点。有人能给我链接到教程或给我一些如何实现这一点的指针吗?

  • 葡萄牙语:java.lang.IllegalArgumentException jsf composite componente composto jsf com dataTable do primefaces tabela-padrao.xhtml 使用组件/Usando o组件 我有一个例外/Ocorreu esta Exceção! 葡萄牙人:Oque estou fazendo de er

  • 问题内容: 如何使用JSF显示/隐藏组件?我目前正尝试在javascript的帮助下做同样的事情,但没有成功。我不能使用任何第三方库。 谢谢| 阿比 问题答案: 通常,您需要通过其clientId获得该控件的句柄。本示例使用带有请求范围绑定的JSF2 Facelets视图来获取另一个控件的句柄: 确切的操作方式取决于您正在使用的JSF版本。有关较早的JSF版本,请参见此博客文章:JSF:使用组件标

  • ActiveX 组件是建立强大的 Web 应用程序的关键。组件提供了用在脚本中执行任务的对象。ASP 同样提供了可在脚本中使用的内建对象。本主题将讨论如何使用组件提供的对象以及由 Active Server Pages 直接提供的内建对象。 关于组件 ActiveX 组件是一个文件,该文件包含执行某项或一组任务的代码。组件可以执行公用任务,这样就不必自己去创建执行这些任务的代码。例如,股票行情收报

  • 6. 组件的使用和定制 在第一章里,我们提到了WebMagic的组件。WebMagic的一大特色就是可以灵活的定制组件功能,实现你自己想要的功能。 在Spider类里,PageProcessor、Downloader、Scheduler和Pipeline四个组件都是Spider的字段。除了PageProcessor是在Spider创建的时候已经指定,Downloader、Scheduler和Pip