Spring OAuth2自定义授权类型自动装配一个类返回null

时间:2017-02-18 20:04:10

标签: java spring spring-security oauth-2.0 spring-oauth2

我遇到Spring Security OAuth2的问题。有一个自助服务终端系统,所有信息亭都需要在启动期间通过中央OAuth2提供商进行授权。凭证有两个商店 - 一个用于实际用户(例如技术人员),另一个用于信息亭。售货亭的集合存储售货亭资料信息,该信息基本上是售货亭(票据接收器,自动提款机,热敏打印机等)中使用的所有设备的序列号。

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

  • Kiosk使用grant_type=kiosk
  • 将其个人资料信息发送到/ oauth / token
  • 如果个人资料存在,OAuth2会提供令牌,一切都很棒
  • 如果配置文件不存在,则自助服务终端配置文件将添加到信息亭集合中,其状态为“#34; off"和OAuth2提供401 Unauthorized

现在,我为kiosk授权创建了一个新的授权类型。但我需要一种方法来访问我的Kiosk Profile Data Mapper,这是一个Spring服务。所以,在我的班上我添加以下内容:

class KioskTokenGranter extends AbstractTokenGranter {
    @Autowire
    KioskProfileService kioskProfile;

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

上面的snipper给了我一个kioskProfile不存在的NullPointerException。如果我在AuthorizationServerConfigurerAdapter中执行相同的操作,则autowire可以正常工作。所以,我的问题是如何在TokenGranter中自动装配服务。

2 个答案:

答案 0 :(得分:1)

看来你刚刚遇到普通的老问题,你实例化的对象不受Spring的控制。您没有将您的班级注释为@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

答案 1 :(得分:1)

KioskTokenGranter需要使用@Component进行注释。另外,请确保为KioskTokenGranter所在的程序包启用了组件扫描。