有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java无法通过OAuth2将额外参数传递给SpringSecurity。0

你好

我需要基于下面的URL使用springboot2实现OAuth2和spring安全性

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

我做到了

在这里,我在验证用户身份时对上述代码提出了另一个不同的要求

我需要在邮递员工具的x-www-form-urlencoded选项卡中传递companyId以及用户名和密码,并授予_类型(密码)。 我必须根据用户名和公司ID获取用户

所以,请帮助我,我需要在上面的链接代码做什么样的更改,以便我可以达到我的要求

这里我只收到一封电子邮件。我需要带公司ID的电子邮件

@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);
}

目前,用户名和密码都可以正常工作

但在我的系统中,相同的用户映射到不同的公司。如果同一个用户映射到多个公司发现我得到如下错误

{ “错误”:“未经授权”, “错误描述”:“查询未返回唯一结果:2;嵌套异常为javax.persistence.ununiqueresultexception:查询未返回唯一结果:2” }

我需要获取用户,基于用户名和密码以及公司ID,这将导致单个用户

有人能在这个问题上帮忙吗。先谢谢你


共 (3) 个答案

  1. # 1 楼答案

    如果您想要访问令牌的附加信息,可以使用TokenEnhancer类来实现

    自定义标记增强程序。爪哇

    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 endpoints)方法

    授权服务器配置。爪哇

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints.authenticationManager(authenticationManager)
                .allowedTokenEndpointRequestMethods(HttpMethod.GET, HttpMethod.POST)
                .tokenEnhancer(new CustomTokenEnhancer());
    }
    
  2. # 2 楼答案

    这句话对我很管用

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

  3. # 3 楼答案

    巴努普拉卡什,我也有类似的问题,但我暂时做到了:

    在“loadUserByUsername”方法中写下:

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

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

    谢谢