Java 将自定义筛选器添加到Spring Security后用于验证的空web表单
我有一个Spring4Web应用程序,具有标准身份验证-用户名和密码。对于验证,我使用表单烘焙bean javax.validation和Hibernate validator:Java 将自定义筛选器添加到Spring Security后用于验证的空web表单,java,spring,validation,spring-mvc,authentication,Java,Spring,Validation,Spring Mvc,Authentication,我有一个Spring4Web应用程序,具有标准身份验证-用户名和密码。对于验证,我使用表单烘焙bean javax.validation和Hibernate validator: import org.hibernate.validator.constraints.NotEmpty; import javax.validation.constraints.Size; public class SignupForm { @Size(min = 6, message = "must be
import org.hibernate.validator.constraints.NotEmpty;
import javax.validation.constraints.Size;
public class SignupForm {
@Size(min = 6, message = "must be at least 6 characters")
private String password;
@NotEmpty
private String email;
// get / set methods
}
然后在SpringSecurity中,我有了一个标准配置,这对我来说很有用
以下是我如何在控制器中使用它,以及它的工作原理:
@RequestMapping(value = "/signup", method = RequestMethod.POST)
public String createRecruiter(@ModelAttribute("signUpForm") @Valid SignupForm signupForm,
BindingResult formBinding, HttpServletRequest request) {
if (formBinding.hasErrors()) {
UiUtil.addError(request, EntryError.SINGUP_VALIDATION_ERROR);
return DEFAULT_REDIRECT;
}
// rest of the method is not important
}
现在我想使用HMAC身份验证打开我的API供公众使用。为了这个目的,我跟随。在本文中,它简化了,因此没有关于如何处理多个身份验证提供者之类的示例
您可以看到,您需要将REST身份验证的自定义过滤器添加到Spring配置的过滤器链中
在Spring上下文配置类中:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
// standard configuration
.and()
.addFilterBefore(new RestSecurityFilter(authenticationManager()), UsernamePasswordAuthenticationFilter.class);
我还将身份验证提供程序添加到身份验证管理器中,如下所示:
@Autowired
private RestAuthenticationProvider restAuthProvider;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService()).passwordEncoder(passwordEncoder());
auth.authenticationProvider(restAuthProvider);
}
问题是,现在在控制器中,SignupForm
对象的字段只设置了null
值,但请求参数设置正确。如果我从配置中删除RestSecurityFilter
,它就会工作
如何使用链中的RestSecurityFilter
进行验证
我已经试过了,但没有成功(显然):
- 已删除自定义身份验证提供程序-
auth.authenticationProvider(重新授权提供程序)代码>。我认为这可能是一个多
身份验证提供者的问题
- 将
添加到RestSecurityFilter
之前和之后UsernamePasswordAuthenticationFilter
- 使
的doFilter方法只执行RestSecurityFilter
chain.doFilter(请求、响应)
- 我会使用SpringMVC拦截器,而不是
过滤器。这是一款更高级的spring mvc natvie
- 对于RESTful服务,不应该使用“表单”术语,也不应该在出现错误时重定向(应该返回正确的错误响应)
- 签名中不需要
ModelAttribute
- 以下几点意见可能会有所帮助: