无法使用OAuth2.0将额外参数传递给Spring-Security

时间:2019-01-25 06:28:53

标签: java spring-boot spring-security oauth

美好的一天。

我需要基于以下URL使用springboot2实现具有弹簧安全性的OAuth2。

URL名称: https://www.devglan.com/spring-security/spring-boot-oauth2-jwt-example

我做到了。

在验证用户身份时,我对上述代码有另一个不同的要求。

我需要在邮递员工具的x-www-form-urlencoded标签中传递companyId以及用户名和密码以及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来获取用户,这会导致单个用户。

在这个问题上可以提供一些帮助。提前谢谢。

3 个答案:

答案 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());
}

答案 1 :(得分:0)

Bhanuprakash,我有一个类似的问题,但是暂时我做到了:

在“ loadUserByUsername”方法中输入以下内容:

  

HttpServletRequest请求=(((ServletRequestAttributes)RequestContextHolder.getRequestAttributes())。getRequest();   System.out.println(“ compnayId:” + request.getParameter(“ companyId”));

我认为有一个更优雅的解决方案,但我暂时使用了这个。

谢谢。

答案 2 :(得分:-1)

这条评论对我很有效!

<块引用>

HttpServletRequest 请求 = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); System.out.println("compnayId:" + request.getParameter("companyId"));