我正在尝试使用自定义注释创建一个独立的可打包jar,它包含在控制器映射函数中(并将userToken作为标头中的输入),返回一个布尔值,无论用户是经过身份验证还是现在。
// Expected way of inclusion
public @ResponseBody boolean isAuthenticated(@Authenticator(@RequestHeader("userToken")) Boolean isUserAuthenticated) {
return isUserAuthenticated;
}
我知道这不是正确的语法,因为使用此代码会产生错误,即RequestMapping无法转换为String(并且注释只接受原始值)。
我也对其他方法持开放态度,但它应该只有在需要时才能灵活地返回认证布尔值,而不是通过全局拦截。
重要:请注意@Authenticator来自一个独立的软件包,通过Maven在当前软件包中导入。 HTTPServletRequest是否会传递ConstraintValidator。
答案 0 :(得分:0)
使用spring security BasicAuthenticationFilter:
public class MyBasicAuthenticationFilter extends BasicAuthenticationFilter {
private AuthenticationManager authenticationManager;
public MyBasicAuthenticationFilter(AuthenticationManager authenticationManager) {
super(authenticationManager);
this.authenticationManager=authenticationManager;
}
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
// do you checks here
super.doFilterInternal(request, response, chain);
}
}
然后将此添加到您的安全配置中,例如:
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/home").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.permitAll();
http.addFilterBefore(new MyBasicAuthenticationFilter(authenticationManager());
}
@Bean
public AuthenticationManager authenticationManager() {
return new MyAuthenticationManager();
}