当前位置: 首页 > 知识库问答 >
问题:

使用Spring Security,我如何确定当前的api请求是否应该进行身份验证?

晏和风
2023-03-14

使用spring security,您可以拥有每个人都可以访问的公共apiendpoint,以及在获得响应之前需要进行身份验证的endpoint。在我的应用程序中,用户通过jwt令牌进行身份验证。对于目前登录的用户,始终检查令牌,无论公共apiendpoint是否获得请求。

我想知道如何检查当前endpoint是公共endpoint还是经过身份验证的endpoint,这样我可以修改代码,使令牌检查仅在endpoint需要身份验证时进行。

我可以在哈希集中添加所有公共endpoint并将当前请求endpoint与公共endpoint进行比较,但这并不高效,而且一些公共endpoint包含通配符(**),因此比较会有点麻烦。

这是我能找到的唯一信息:

Spring Security-检查web url是否安全/受保护

但它是关于JSP的。

我也无法从SecurityContextHolder.getContext()获取请求信息。我的猜测是我应该从org.springframework.security.config.annotation.web.builders.HttpSecurity获取信息,因为这是用于定义哪些endpoint不需要身份验证的相同类。(使用ant Matcher(). permitall())。但是我不知道调用哪个方法,我不确定HttpSecurity是否可以自动安装到另一个类中。有人能给我一些提示吗?

非常感谢。

共有1个答案

魏澄邈
2023-03-14

假设您使用单独的过滤器进行令牌检查,那么可以通过重写JwtTokenFilter中OncePerRequestFilter的受保护布尔shouldNotFilter(HttpServletRequest-request)方法来避免对公共endpoint进行令牌检查。默认情况下,此方法将始终返回false。因此,所有请求都将被过滤。为公共endpoint重写此方法以返回true将提供所需的功能。要使用通配符(**)检查请求,可以使用AntPathRequestMatcher。所以,你可以做如下的事情。

public class JwtTokenFilter extends OncePerRequestFilter {
    private static RequestMatcher requestMatcher;

    public static void ignorePatterns(String... antPatterns) {
        List<RequestMatcher> matchers = new ArrayList<>();
        for (String pattern : antPatterns) {
            matchers.add(new AntPathRequestMatcher(pattern, null));
        }
        requestMatcher = new OrRequestMatcher(matchers);
    }

    static {
        final String[] publicEndPoints = {"/public-api/**","/resources/**"};
        ignorePatterns(publicEndPoints);
    }

    @Override
    protected boolean shouldNotFilter(HttpServletRequest request) throws ServletException {
        return requestMatcher.matches(request);
    }

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
            throws ServletException, IOException {
    ....
    }
}

希望这有帮助!!

 类似资料:
  • 我正在构建一个有角度的应用程序。我正在检查用户的角色,然后在用户登录后进行身份验证。我在angular中使用web API。web API调用是否也需要对每个用户进行身份验证,或者是否仅为该url启用CORS?

  • 我有一个客户端anger-js应用程序。我有一个服务器端nodejs应用程序接口。客户端和服务器端应用程序位于不同的域上。客户端使用API获取或发布一些数据。客户端还需要从服务器端获取图像并在浏览器中显示它们。 我使用护照nodejs模块进行身份验证。我不知道哪种身份验证策略更适合我。我认为有两种类型的身份验证策略:基于令牌的和基于cookie的。我认为这两种类型在我的情况下都没用: > < li

  • 问题内容: 我正在使用Django和django-rest-framework构建RESTful API 。 作为身份验证机制,我们选择了“令牌身份验证”,而我已经按照Django-REST-Framework的文档实施了它,问题是,应用程序应该定期更新/更改令牌吗?是应该续签令牌的移动应用程序,还是应该由网络应用程序自主执行? 最佳做法是什么? 有人在Django REST Framework方

  • 假设我们有以下部分的web安全配置:

  • 我有一个节点项目 我试过的密码- 运行此命令时,当secret_password错误时,它会正确显示,但当它正确时,它只显示一个单词swagger,表示swagger。io链接。 我搜索了一下,但是没有得到任何关于这个的信息或者例子。我错过了什么吗?

  • 早些时候,我使用Spotify的搜索API,而没有进行任何形式的身份验证。但就在上周左右,他们只使用了身份验证的API。因此,在过去的2-3天里,我一直不知道这种授权是如何适用于搜索API的,因为我作为一个开发人员可以允许用户访问搜索API的响应,而不需要他们使用Spotify帐户登录。 有人能帮我做一下授权的事情吗(Spotify的文档不能解决我的问题:<) 这是我之前使用的python代码-