无法将额外的参数传递到弹簧安全性的OAuth2.0

问题描述 投票:-1回答:2

美好的一天。

我和春天有个安全使用springboot2立足于以下网址实现了OAuth2要求。

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

而我做到了。

在这里,我得到了在认证用户上面代码中的另一个不同的要求。

我需要通过companyId与邮差工具的X WWW的形式,进行了urlencoded选项卡用户名和密码grant_type(密码)一起。我有基于用户名和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);
}

目前使用用户名和密码,这是工作的罚款。

但是,在我的系统是映射到映射到多个不同的公司一样companies.if用户相同的用户发现,我收到错误,如下面。

{“错误”:“未经授权”,“ERROR_DESCRIPTION”:“查询没有返回唯一结果是:2;嵌套的例外是javax.persistence.NonUniqueResultException:查询未返回唯一结果是:2”}

我需要基于用户名和密码,companyId导致单个用户获取用户。

能否在这个问题上有一个人帮助。非常感谢提前。

java spring-boot spring-security oauth
2个回答
0
投票

Bhanuprakash,我也有类似的问题,但暂时我这样做:

在“loadUserByUsername”的方法写:

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

我觉得还有一个更优雅的解决方案,但暂时我用这个。

谢谢。


0
投票

如果你想要更多的信息与访问令牌可以使用TokenEnhancer类来做到这一点。

custom token enhancer.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;
    }

}

然后用户这个类的实例中的孔隙配置(AuthorizationServerEndpointsConfigurer端点)方法是这样

authorization server config.Java

@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
    endpoints.authenticationManager(authenticationManager)
            .allowedTokenEndpointRequestMethods(HttpMethod.GET, HttpMethod.POST)
            .tokenEnhancer(new CustomTokenEnhancer());
}
© www.soinside.com 2019 - 2024. All rights reserved.