public class CustomHeaderAuthFilter extends AbstractAuthenticationProcessingFilter{
@Override
public Authentication attemptAuthentication(
HttpServletRequest request, HttpServletResponse response){
// Get all the headers from request, throw exception if your header not found
Enumeration<String> reqHeaders = request.getHeaderNames();
Assert.notNull(reqHeaders, "No headers found. Abort operation!");
Collections.list(reqHeaders)
.stream()
.filter(header_ -> header_.equals("TARGET_HEADER_NAME"))
.findAny().ifPresent(header_ -> {
// header found, would go for success-andler
});
// Here it means request has no target header
SecurityContextHolder.clearContext();
failureHandler.onAuthenticationFailure(request, response, new CustomException(""));
}
}
3条答案
按热度按时间rsl1atfo1#
这可能是最快的方法,如果你只在几个地方使用它。
OR
2 -这可能是最好的方法,如果你会在许多地方使用它。
SecurityService
中,您可以添加多种不同的检查方法。)*3 -你可以为自己选择一个特殊的方法
A Custom Security Expression with Spring Security
j8ag8udp2#
由于您打算为每个控制器方法检查特定的头/cookie/request-attribute,因此应该选择Filter,因为这将是一个标准,并且您可以通过从
OncePerRequestFilter
扩展来保证它对每个方法执行一次,并且只执行一次话虽如此,有两种方法可以实现这一点:
AbstractAuthenticationProcessingFilter
或OncePerRequestFilter
为此,你可以参考spring-security jwt token validation流程,这是所有人都提倡的:
@PreAuthorize("hasAuthority('USER_ROLE')")
UsernamePasswordAuthenticationFilter
之前的请求,从请求中提取Authentication
报头或cookies
,并验证声明的令牌值。通过这种方式,您需要使用
WebSecurityConfigurerAdapter
注册您的过滤器,如果您从AbstractAuthenticationProcessingFilter
扩展,则还可以提供AuthenticationProvider
。1.通过使用
@RequestHeader
访问rest控制器中的HTTP Headers
,如dm-tr所提到的。dsf9zpds3#
也许你可以试试这个