Spring OAuth2 自定义授权类型自动装配 class returns null

Spring OAuth2 custom grant type autowiring a class returns null

我对 Spring 安全 OAuth2 有疑问。有一个信息亭系统,其中所有信息亭都需要在启动期间向中央 OAuth2 提供商授权。凭证有两个商店——一个用于实际用户(例如技术人员),另一个用于信息亭。自助服务终端的集合存储自助服务终端配置文件信息,这些信息基本上是自助服务终端中使用的所有设备(纸币接受器、自动提款机、热敏打印机等)的序列号。

所以,这是我要实现的流程。

现在,我为信息亭授权创建了一个新的授权类型。但我需要一种方法来访问我的 Kiosk 配置文件数据映射器,这是一项 Spring 服务。因此,在我的 class 中添加以下内容:

class KioskTokenGranter extends AbstractTokenGranter {
    @Autowire
    KioskProfileService kioskProfile;

    protected OAuth2Authentication getOAuth2Authentication(ClientDetails client, TokenRequest tokenRequest) {
          // request parsing stuff
          kioskProfile.findByAttributes(...);
    }
}

上面的 snipper 给了我一个 kioskProfile 不存在的 NullPointerException。如果我在 AuthorizationServerConfigurerAdapter 中做同样的事情,自动装配工作。所以,我的问题是如何在 TokenGranter 中自动装配服务。

看来您只是 运行 遇到了您正在实例化的对象不受 Spring 控制的老问题。您还没有将 class 注释为 @Component 或类似的东西(在这种情况下我不建议您这样做)。 Spring 不知道您的@Autowire 注释。

另一个人实现AbstractTokenGranter的例子,拿OBOTokenGranter.java.

 public class OBOTokenGranter extends AbstractTokenGranter {

    ...

    private UserDetailsService uds;

    public OBOTokenGranter(UserDetailsService uds, AuthorizationServerTokenServices tokenServices, ClientDetailsService clientDetailsService,
        OAuth2RequestFactory requestFactory) {
       super(tokenServices, clientDetailsService, requestFactory, GRANT_TYPE);

       this.uds = uds;
   }

   ...
 }

请注意,UserDetailsService uds 是通过构造函数传入的,而不是自动装配的。您可以在 OBOTokenGenerator.java 中看到 OBOTokenGranter 的用法,这是一个 @RestController并将 UserDetailService 自动连接到其中,以便它可以用于构建 Granter。

 @RestController
 public class OBOTokenGenerator {

 ...

    @Autowired
    private UserDetailsService uds;

 ...
    @RequestMapping("/obo/{user}")
    public ResponseEntity<OAuth2AccessToken> getOBOToken(Principal principal, @PathVariable("user") String user) {

 ...

        OBOTokenGranter granter = new OBOTokenGranter(uds, tokenServices, clientDetailsService, requestFactory);

 ...
 }

所以剩下的问题是:您的代码是否遵循这种使用模式?你有构造 KioskTokenGranter 的 Controller/Service/Component/etc 吗?

KioskTokenGranter需要注解为@Component。还要确保为 KioskTokenGranter 所在的包启用了组件扫描。