我整合了一个使用 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方法。我想在这个方法上处理一些验证(必需的文件等)并抛出异常(必填字段消息)。
如果我评论设置我的自定义登录页面的行,则会调用所需的方法。
此article和this other是我尝试做的事例。请注意,显然,正在调用在托管bean上声明的方法。
问题是:我忘记了一些配置吗?怎么做Spring让JSF执行我的验证,显示必填字段消息等?
答案 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。
要避免此问题,您可以
.loginProcessingUrl("/j_spring_security_check")
选项2的示例配置如下所示:
@Override
protected void configure(HttpSecurity http) throws Exception
{
http
.formLogin()
.loginPage("/login")
.loginProcessingUrl("/j_spring_security_check")
...
}
我将一个工作示例应用程序附加到前面提到的JIRA。您可以下载here。