我遇到Spring Security OAuth2的问题。有一个自助服务终端系统,所有信息亭都需要在启动期间通过中央OAuth2提供商进行授权。凭证有两个商店 - 一个用于实际用户(例如技术人员),另一个用于信息亭。售货亭的集合存储售货亭资料信息,该信息基本上是售货亭(票据接收器,自动提款机,热敏打印机等)中使用的所有设备的序列号。
所以,这是我想要实现的流程。
grant_type=kiosk
现在,我为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中自动装配服务。
答案 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
?
答案 1 :(得分:1)
KioskTokenGranter
需要使用@Component
进行注释。另外,请确保为KioskTokenGranter
所在的程序包启用了组件扫描。