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

在Spring实施授权

韶宏邈
2023-03-14

我有一个用例,在这个用例中,我必须只执行授权部分。JWT令牌是由另一个服务生成的。我的服务只会消耗那个令牌,它的自定义声明中会有数据。在我的Spring启动应用程序中,我只想在允许用户访问任何应用编程接口之前验证该令牌是否有效。在所有答案中,我可以看到一个身份验证对象是从当前的安全上下文中创建的。在Spring,有没有什么方法可以让我不需要在自定义过滤器中编写这么多不必要的代码,只需编写解析JWT令牌的逻辑,如果它是有效的,那么允许用户使用应用编程接口或发送未经授权的响应?

Auth0 Java JWT提供了几种验证JWT令牌的方法。我想使用下面的代码进行验证和解析

Algorithm algorithm = Algorithm.HMAC256(secret);
JWTVerifier verifier = JWT.require(algorithm).withIssuer(issuer).build();
DecodedJWT decoded = verifier.verify(token);

共有1个答案

娄鹤轩
2023-03-14

如果想使用Spring Security性,就必须使用这些东西(过滤器、身份验证对象、上下文等)。必须设置身份验证才能访问受保护的资源。这一点都不复杂,你不必写“无用”的代码,只需告诉spring security你想做什么。

在你的情况下,你只需要提供一个符合你标准的自定义过滤器。

我们可以想象一下:

@Component
public class TokenAuthenticationFilter extends UsernamePasswordAuthenticationFilter {
    
    
  @Override
  public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
      throws IOException, ServletException {

    HttpServletRequest httpRequest = (HttpServletRequest) req;
    // Here, I get the token from authorization header, change if you get it from anywhere else
    String token = httpRequest.getHeader("Authorization");
    
    // here i'm just doing a dummy check. if my token equals "mysupersecrettoken" the authentication is validated
    // change this test by yours (using Auth0 etc.)
    if ("mysupersecrettoken".equals(token)) {
      // dummy authentication object. You can set a real username / credentials / role based on the claims of your token if you want to.
      UsernamePasswordAuthenticationToken user = new UsernamePasswordAuthenticationToken("username", "credentials",
          Arrays.asList(new SimpleGrantedAuthority("ROLE")));
      SecurityContextHolder.getContext().setAuthentication(user);
    }
    // call next filters, if authentication is not valid, no authentication will be set so user will not be authenticated
    chain.doFilter(req, res);
  }

}

这不是使用Spring安全的最佳方式,但这是实现您的用途的一种“最小”方式。你可能也需要设置一些安全上下文,但这不是一件大事。

 类似资料:
  • AuthorizationServer: 该问题可能是由于WebSecurity类的某些配置不正确造成的。但是,我尝试了多种配置,但都没有运气。

  • 在Perl中,使用Moo,可以围绕sub实现sub,它将围绕类中的其他方法。 如何在Raku中实现这种行为,最好使用角色?

  • 问题内容: 我尝试实现冒泡排序,但是不确定它是否正确。如果您可以看一下它,并且它是气泡式的,并且可以通过更好的方式完成,请不要害羞。这是代码: 问题答案: 这是冒泡排序的正常实现,似乎还可以。可以进行几种优化,但是总体思路是相同的。这里有一些想法: 如果在内循环中未执行任何交换时,外循环有一个迭代,则中断,无用继续 在外循环的每次迭代中,交换内循环的方向-从左至右执行一次,然后从右至左执行一次(这

  • 问题内容: 我正在创建一些轻松的Web服务,并使用Spring-Boot创建嵌入式的tomcat容器。 要求之一就是要实现2路SSL。我一直在看HttpSecurity对象,可以使用以下方法使它仅通过SSL通道运行Web服务: 我似乎找不到一种使Web服务仅对提供有效客户端证书的应用程序可访问的方法。 我只有SSL的基本知识,因此即使是正确方向的通用指针也将不胜感激。 部署到该服务器上的服务器将具

  • 问题内容: 我正在尝试在C中实现管道-例如- 我写了以下代码- 使用两个参数可以很好地工作,例如- 但是,当我尝试两个以上的参数时,它将不起作用。 有人可以告诉我我的代码有什么问题吗,或者有其他方法可以做到这一点? 问题答案: 这实际上没有进行错误检查,但是为什么这么复杂?

  • 问题内容: 海 我想建立一个包含聊天的网站。我正在使用PHP,我想要一个代码来实现与php的聊天。有人可以帮助我做到这一点吗?我知道阿贾克斯。我不懂其他语言… 问题答案: 我们目前正在与LiveZilla合作,这非常好,这是公司唯一必须拥有Windows PC的东西。操作员界面位于“ .NET”上 livezilla