我创建了一个配置为我的授权服务器oauth2的Spring Boot应用程序,让其他应用程序Spring启动,配置为Client oauth2。
在我的服务器中,我实现了CustomUserDetailsService,我想在loadUserByUsername方法中检索正在验证的项目的client_id。
我不知道这是否可行,但我想恢复它以验证client_id,因为我有几个使用相同授权器的应用程序,而client_id我将检查用户是否有权访问该应用程序。
有谁知道怎么做?
application.yml 客户端
security:
basic:
enabled: false
oauth2:
sso:
loginPath: /login
client:
clientId: web_app
clientSecret: secret
accessTokenUri: https://localhost/uaa/oauth/token
userAuthorizationUri: https://localhost/uaa/oauth/authorize
CustomUserDetailsService
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
try {
//I would like to recover the client_id in this location
User domainUser = userRepository.findByUsername(username);
必须验证任何服务器,因为我只有一个登录所有应用程序:
Auth服务器身份验证由用户和密码以及应用程序完成。
想象一下,您正在登录" https://accounts.google.com/"谷歌检查用户和密码,并显示您的帐户的快捷方式"产品"。
现在,如果您访问" https://mail.google.com"谷歌检查用户和密码并显示Gmail界面。在我的情况下,它可以来自网址https://application.domain.com,https://application2.domain.com,https://application3.domain.com或" https://accounts.domain.com。
它使用用户名和密码的所有网址,但它可以访问application1或全部或不访问。
我想做服务器端,因为它仅为具有权限(信用)的应用程序返回访问令牌。如果用户和密码正确,则并不意味着用户可以访问所有应用程序。
答案 0 :(得分:0)
要访问client_id,您需要实现不同的接口。 CustomUserDetailsService
只会授予您访问User对象的权限。
我没有在Spring Boot
中执行此操作的确切方法,但在基于XML的配置中,您必须执行以下操作
public class CustomJdbcClientDetailsService implements
ClientDetailsService, ClientRegistrationService {
@Override
public CustomClientDetails loadClientByClientId(String clientId)
throws InvalidClientException {
//Do something with clientId
}
}
简而言之,方法loadClientByClientId
可让您访问客户端ID。还有其他方法可以拦截不同的Spring OAuth2类并访问client_id
,但这是最干净和推荐的方法。
您也可以通过添加client_id
来拦截请求并检查正文,从而访问Filter
。
您需要对如何在ClientDetailsService
中实施ClientRegistrationService
和Spring Boot
进行一些研究。有很多关于它的教程。
最好从谷歌搜索如何使用ClientDetailsServiceConfigurer
设置Spring Boot
ClientDetailsServiceConfigurer
的更多信息,请参阅Spring OAuth Java Doc 答案 1 :(得分:0)
final SavedRequest savedRequest = new HttpSessionRequestCache().getRequest(request, response); if (null != savedRequest) { final String redirectUrl = savedRequest.getRedirectUrl(); final MultiValueMap parameters = UriComponentsBuilder.fromUriString(redirectUrl).build().getQueryParams(); if (parameters.containsKey("client_id")) { final String clientId = parameters.get("client_id").get(0); } }