Spring OAuth2 自定义授权类型自动装配 class returns null
Spring OAuth2 custom grant type autowiring a class returns null
我对 Spring 安全 OAuth2 有疑问。有一个信息亭系统,其中所有信息亭都需要在启动期间向中央 OAuth2 提供商授权。凭证有两个商店——一个用于实际用户(例如技术人员),另一个用于信息亭。自助服务终端的集合存储自助服务终端配置文件信息,这些信息基本上是自助服务终端中使用的所有设备(纸币接受器、自动提款机、热敏打印机等)的序列号。
所以,这是我要实现的流程。
- Kiosk 使用
grant_type=kiosk
将其配置文件信息发送到 /oauth/token
- 如果配置文件存在,OAuth2 会给出令牌,一切都很好
- 如果配置文件不存在,kiosk 配置文件将添加到状态为 "off" 的 kiosks 集合中,OAuth2 给出 401 Unauthorized
现在,我为信息亭授权创建了一个新的授权类型。但我需要一种方法来访问我的 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
所在的包启用了组件扫描。
我对 Spring 安全 OAuth2 有疑问。有一个信息亭系统,其中所有信息亭都需要在启动期间向中央 OAuth2 提供商授权。凭证有两个商店——一个用于实际用户(例如技术人员),另一个用于信息亭。自助服务终端的集合存储自助服务终端配置文件信息,这些信息基本上是自助服务终端中使用的所有设备(纸币接受器、自动提款机、热敏打印机等)的序列号。
所以,这是我要实现的流程。
- Kiosk 使用
grant_type=kiosk
将其配置文件信息发送到 /oauth/token
- 如果配置文件存在,OAuth2 会给出令牌,一切都很好
- 如果配置文件不存在,kiosk 配置文件将添加到状态为 "off" 的 kiosks 集合中,OAuth2 给出 401 Unauthorized
现在,我为信息亭授权创建了一个新的授权类型。但我需要一种方法来访问我的 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
所在的包启用了组件扫描。