Spring OAuth2技术咨询:如何获取所有clientId?
一、获取系统中所有已注册的 ClientId
在Spring OAuth2里,客户端信息的管理核心是ClientDetailsService接口——不管你用内存、数据库还是自定义存储,都可以通过这个接口来获取所有clientId:
内存存储场景
如果你用的是默认的InMemoryClientDetailsService,直接注入这个bean并调用getClientDetailsIds()就行:@Autowired private InMemoryClientDetailsService clientDetailsService; public Set<String> getAllClientIds() { return clientDetailsService.getClientDetailsIds(); }JDBC存储场景
用数据库存客户端信息的话,JdbcClientDetailsService同样提供了getClientDetailsIds()方法:@Autowired private JdbcClientDetailsService clientDetailsService; public Set<String> getAllClientIds() { return clientDetailsService.getClientDetailsIds(); }当然你也可以直接查默认的
oauth_client_details表,执行SELECT client_id FROM oauth_client_details;,但更推荐用Service方法,避免和底层存储耦合。自定义存储场景
要是你自己实现了ClientDetailsService,那就得在你的实现类里加个获取所有clientId的方法,比如从MongoDB、Redis这类数据源里查询所有客户端的clientId字段。
二、从OAuth2Authentication里拿所有ClientId?做不到!
你现在用的auth.getOAuth2Request().getClientId()只能拿到当前这次认证请求对应的那个clientId。原因很简单:OAuth2Authentication是和单次认证会话绑定的,它记录的是某个客户端(或者用户通过某个客户端)发起的一次认证信息,所以它的OAuth2Request里只会包含当前请求的客户端数据,根本不会存储所有客户端的列表。
想要获取所有clientId,还是得靠前面说的ClientDetailsService,别在OAuth2Authentication上浪费时间啦。
内容的提问来源于stack exchange,提问作者Cataclysm

