我正在基于下面的链接使用springboot2在spring-security中实现oauth2。
https://www.devglan.com/spring-security/spring-boot-oauth2-jwt-example
我成功地实现了它。
在这里,上述代码在验证用户身份时有不同的用例。
我需要在邮递员的“ x-www-form-urlencoded”标签中传递公司ID以及用户名和密码以及grant_type(password)。 而且我必须根据用户名和companyId获取用户。
因此,请帮助我确定我需要在上面的链接代码中进行哪些更改,以便我可以实现我的要求。
我在这里只收到电子邮件。我需要电子邮件以及companyId。
@Override
@Transactional
public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
User user = userRepository.findByEmail(email).orElseThrow(
() -> new UsernameNotFoundException("User Not Found with -> username or email : " + email));
return UserPrinciple.build(user);
}
Expected:
@Override
@Transactional
public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
User user = userRepository.findByEmailAndCompanyId(email,companyId).orElseThrow(
() -> new UsernameNotFoundException("User Not Found with -> username or email : " + email));
return UserPrinciple.build(user);
}
目前使用用户名和密码可以正常工作。
但是在我的系统中,我有相同的用户映射到不同的公司。如果同一用户映射到多个公司,则发现出现如下错误。
{ “错误”:“未经授权”, “ error_description”:“查询未返回唯一结果:2;嵌套异常为javax.persistence.NonUniqueResultException:查询未返回唯一结果:2” }
我需要根据用户名和密码以及companyId来获取用户,这会导致单个用户。
答案 0 :(得分:0)
如果您想要访问令牌的其他信息,可以使用TokenEnhancer类来实现。
CustomTokenEnhancer.java
public class CustomTokenEnhancer implements TokenEnhancer {
@Override
public OAuth2AccessToken enhance(OAuth2AccessToken accessToken, OAuth2Authentication authentication) {
User user = (User) authentication.getPrincipal();
final Map<String, Object> additionalInfo = new HashMap<>();
additionalInfo.put("id", user.getCompanyId());
additionalInfo.put("authorities", user.getAuthorities());
((DefaultOAuth2AccessToken) accessToken).setAdditionalInformation(additionalInfo);
return accessToken;
}
}
然后将此类的实例的用户用作该类的configure(AuthorizationServerEndpointsConfigurer端点)方法
AuthorizationServerConfig.java
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints.authenticationManager(authenticationManager)
.allowedTokenEndpointRequestMethods(HttpMethod.GET, HttpMethod.POST)
.tokenEnhancer(new CustomTokenEnhancer());
}