完成Spring Security配置后,不调用JSF2 BackingBean方法

时间:2014-09-23 17:58:26

标签: spring jsf-2 spring-security spring-annotations

我整合了一个使用 JSF 2 Spring Security 3.2 Spring 4.0 (兼容,see documentation的webapp,这个thread),使用注释,我有这个配置:

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

    http.authorizeRequests()
            .antMatchers("/my-account", "**/myAccount.**").authenticated()
            .and()
            .formLogin().loginPage("/login").permitAll();

登录页面显示正确,但是当我提交用户名和密码时,从不调用JSF BakcingBean方法。我想在这个方法上处理一些验证(必需的文件等)并抛出异常(必填字段消息)。

如果我评论设置我的自定义登录页面的行,则会调用所需的方法。

articlethis other是我尝试做的事例。请注意,显然,正在调用在托管bean上声明的方法。

问题是:我忘记了一些配置吗?怎么做Spring让JSF执行我的验证,显示必填字段消息等?

2 个答案:

答案 0 :(得分:0)

人们在互联网上搜索了这一天之后,我还没有找到任何使用注释的例子。

我刚迁移到XML文件,现在一切正常。

我不是Spring的专家,但基于我测试的内容,我认为使用注释Spring创建了自动过滤器,由于某种原因,它拦截了来自配置的自定义login的所有请求表单,阻止JSF处理请求。这可能是因为“Spring 4”和Spring“Security 3.2”之间存在一些无证的不兼容性。使用XML时不会发生这种不兼容性。

如果您在web.xml上以经典手动方式创建安全筛选器,并在Spring XML文件上配置自定义登录表单,则可以再次使用login表单上的JSF功能。 / p>

注释的相同安全配置已迁移到XML并且有效。

PS:对不起,我无法共享详细文件,因为这次它不是开源的。

答案 1 :(得分:0)

我在SEC-2761的Spring Security JIRA中回答了这个问题,但我在这里发帖是为了帮助其他任何遇到此问题的人。

问题是Java Configuration默认登录处理URL是登录表单值的POST。这意味着,由于登录页面配置为loginPage("/login"),因此Spring Security将拦截对/login的POST。

要避免此问题,您可以

  • 对不同的URL执行POST,并使LoginController处理该URL。
  • 使用.loginProcessingUrl("/j_spring_security_check")
  • 配置Spring Security以拦截其他网址

选项2的示例配置如下所示:

@Override
protected void configure(HttpSecurity http) throws Exception
{
    http
            .formLogin()
                .loginPage("/login")
                .loginProcessingUrl("/j_spring_security_check")
                ...
}

我将一个工作示例应用程序附加到前面提到的JIRA。您可以下载here