路径变量为的Spring Boot AuthenticationToken



我有一个带有自定义AuthenticationManagerPreAuthenticatedProcessingFilter,我在其中进行身份验证并创建一个AuthenticationToken。我现在需要访问一个路径变量(例如id为"/foo/{id}"(,并将其用于身份验证。如何访问变量?例如,如果我使用.antMatchers("/foo/{id}").access("@demo.check(authentication,#id)");,我就无法创建自己的令牌。

我当前的代码是:

MyAuthFilter filter = MyAuthFilter();
filter.setAuthenticationManager(new AuthenticationManager() {
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
// ... authentication stuff
// here i want to access the path variable
return new MyAuthenticationToken(foo);
}
});
httpSecurity.antMatcher("/foo/**").csrf().disable().sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and().addFilter(filter).authorizeRequests().anyRequest().authenticated();

更新

我现在正在检查访问表达式中的所有内容(您可以在那里访问HttpServlet请求,并将路径变量作为参数(。我不想在控制器中有逻辑,也不想检查原始路径。所以这对我来说很好:

httpSecurity.antMatcher("/foo/**").csrf().disable().sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS).and().authorizeRequests()
.antMatchers("/foo/test/{testId}/**")
.access("@fooApiGuard.check(authentication, #testId)");
@Service
public class FooApiGuard {
@Autowired
private HttpServletRequest request;
public boolean check(Authentication authentication, Long testId) throws AuthenticationException {
// check stuff
return true;
}
}

Spring Security是作为Filter链构建的,这意味着在您的自定义筛选器或AuthenticationManager中,您没有与控制器方法本身完全相同的上下文。事实上,您的自定义过滤器应该增强上下文,该上下文将由您的控制器使用。

您可以访问的是ServletRequestServletResponse对象,因此如果必须,您可以从中提取原始路径。然而,这并不能为您提供良好分离的请求参数。

如果路径参数仅用于确定某人是否被授权,那么您可以简化身份验证逻辑,然后通过额外的安全检查来增强控制器,以验证例如域级别的安全问题(资源是否属于当前用户(。

相关内容

  • 没有找到相关文章

最新更新