Java 带path变量的Spring引导AuthenticationToken

Java 带path变量的Spring引导AuthenticationToken,java,spring,spring-boot,security,Java,Spring,Spring Boot,Security,我有一个带有自定义身份验证管理器的预身份验证处理筛选器,在那里我进行身份验证并创建一个身份验证令牌。我现在需要访问一个路径变量(例如id为“/foo/{id}”),并将其用于身份验证。如何访问变量?如果我使用.antMatchers(“/foo/{id}”).access(@demo.check(authentication,#id)”)例如,我无法创建自己的令牌 我目前的代码是: MyAuthFilter filter = MyAuthFilter(); filter.setA

我有一个带有自定义
身份验证管理器的
预身份验证处理筛选器
,在那里我进行身份验证并创建一个
身份验证令牌
。我现在需要访问一个路径变量(例如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();
更新 我现在正在检查access表达式中的所有内容(您可以在那里访问HttpServletRequest,并将路径变量作为参数)。我不希望控制器中有逻辑或检查原始路径。所以这对我来说很好:

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构建为一个过滤器链,这意味着在自定义过滤器或
AuthenticationManager
中,您没有与控制器方法本身完全相同的上下文。事实上,您的自定义过滤器被认为是为了增加控制器将要使用的上下文

您确实可以访问
ServletRequest
ServletResponse
对象,因此如果必须,您可以从中提取原始路径。但是,这并没有给您一个很好地分开的请求参数


如果path参数仅用于确定某人是否获得授权,则您可以简化身份验证逻辑,然后通过附加的安全检查来增强控制器,以验证域级安全问题(资源是否属于当前用户)。

谢谢。我现在使用一个表达式,不创建我自己的标记