为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

不负相思意 2022-05-20 18:35:58
再会。我需要根据以下 URL 使用 springboot2 实现 OAuth2 和 spring-security。网址名称: https ://www.devglan.com/spring-security/spring-boot-oauth2-jwt-example我做到了。在这里,我在验证用户时对上述代码有另一个不同的要求。我需要在邮递员工具的 x-www-form-urlencoded 选项卡中传递 companyId 以及用户名和密码以及 grant_type(password)。我必须根据用户名和 companyId 获取用户。所以请帮我看看我需要在上面的链接代码中做些什么改变,这样我才能达到我的要求。在这里我只收到电子邮件。我需要电子邮件和 companyId。@Override@Transactionalpublic 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@Transactionalpublic 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": "unauthorized", "error_description": "查询没有返回唯一结果:2;嵌套异常是 javax.persistence.NonUniqueResultException:查询没有返回唯一结果:2" }我需要根据用户名和密码以及导致单个用户的 companyId 获取用户。有人可以帮助解决这个问题。提前非常感谢。
查看完整描述

3 回答

?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

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

在“loadUserByUsername”方法中写下:

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

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

谢谢。


查看完整回答
反对 回复 2022-05-20
?
慕工程0101907

TA贡献1887条经验 获得超5个赞

如果您想要访问令牌的其他信息,您可以使用 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;

    }


}

然后使用此类的实例来 void configure(AuthorizationServerEndpointsConfigurer endpoints) 像这样的方法


AuthorizationServerConfig.java


@Override

public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {

    endpoints.authenticationManager(authenticationManager)

            .allowedTokenEndpointRequestMethods(HttpMethod.GET, HttpMethod.POST)

            .tokenEnhancer(new CustomTokenEnhancer());

}


查看完整回答
反对 回复 2022-05-20
?
HUWWW

TA贡献1874条经验 获得超12个赞

这条评论对我来说非常有用!

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


查看完整回答
反对 回复 2022-05-20
  • 3 回答
  • 0 关注
  • 167 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信