Компоненты PrimeFaces и простые компоненты JSF с f: ajax перестали работать с помощью Spring-Security - PullRequest
0 голосов
/ 11 июля 2019

Я пытаюсь интегрировать Spring-Security 5.1.4.RELEASE в уже работающее JSF 2.2 - Primefaces 6.1 APP для обеспечения его безопасности , Когда я пытаюсь получить доступ к защищенной странице «logged.xhtml», Spring запускает меня и переходит на страницу входа «login.xhtml», поэтому Spring, кажется, работает нормально.

Проблема в том, что после того, как я настроил Spring, все Primefaces p:commandLink перестают работать (и некоторые методы "Action" в других компонентах Primefaces). Компоненты JSF Sun ( xmlns: h = "http://java.sun.com/jsf/html"), такие как" h: outputLink ", продолжают работать, но h:commmandButton с f:ajax тоже дает сбой.

Не понимаю, почему компоненты Primefaces или JSF с f:ajax не работают ...

Это мои лица-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 POST localhost: 8080 / springtest / index.xhtml [HTTP / 1.1 403 Запрещено 2 мс]

Я считаю, что проблема связана с разрешениями, но после просмотра файла SecurityConfig я не вижу проблемы.

Следующая строка должна ограничивать доступ к защищенной странице:

.antMatchers ("/ logged.xhtml"). Authenticated ()

И эта строка должна разрешать ВСЕ трафик на остальных страницах:

.anyRequest (). AllowAll ()

Что я делаю не так?

Есть предложения?

Заранее спасибо!

PS: дайте мне знать, нужна ли вам дополнительная информация о проекте

1 Ответ

1 голос
/ 12 июля 2019

Я хочу ответить на этот вопрос в случае, если это кому-то еще нужно:

При использовании ШАБЛОНОВ для создания страницы JSF ВСЕГДА ставьте маркер "csrf" в каждой отдельной форме.Недостаточно положить токен в одном месте.

<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
...