当前位置: 首页 > 知识库问答 >
问题:

为什么UsernamePasswordAuthenticationToken中的授权为空?

司寇高峯
2023-03-14

我被这个JavaSpring Boot问题困住了。我已经在loadUserByUsername方法的返回语句中填写了自动权限:this.get权限(user)。但是当我打印身份验证对象时,它说授予权限为空:

UsernamePasswordAuthenticationToken[Principal=mark,Credentials=PROTECTED],Authenticated=true,Details=null,授予的权限=[]]

有人知道吗?

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = userRepository.findByUsername(username);
        if (user == null) throw new UsernameNotFoundException(username);
        return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), this.getAuthorities(user));
    }

    @GetMapping(path = "authenticated")
    @PreAuthorize("hasAuthority('ROLE_DEFAULT')")
    public User getAuthenticatedUser() {
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        System.out.println(auth);
        User user = this.getUserByUsername(auth.getPrincipal().toString());
        return user;
    }

    private Collection<GrantedAuthority> getAuthorities(User user) {
        Collection<GrantedAuthority> authorities = new ArrayList<>();
        authorities.add(new SimpleGrantedAuthority(user.getRole()));
        return authorities;
    }

共有1个答案

禹昊穹
2023-03-14

我也遇到了这个问题。我有一个自定义的用户凭据实现org.springframework.security.core.userdetails.用户详细信息,其中get授权()实现返回值-但注意到工作授权数组是空的:

o.s.s.w.a.i.FilterSecurityInterceptor:317 - Re-authenticated UsernamePasswordAuthenticationToken [Principal=dto.UserCredentials@585027b7, Credentials=[PROTECTED], Authenticated=true, Details=null, **Granted Authorities=[]**] before authorizing

问题是我的身份验证提供者的实现是错误的,它返回:

new UsernamePasswordAuthenticationToken(userCredentials, authentication, Collections.emptyList());
new UsernamePasswordAuthenticationToken(userCredentials, authentication, **userCredentials.getAuthorities()**);
 类似资料:
  • 我正在构建一个Android应用程序,使用OAuth将用户登录到GitHub。我按照这里的指示这样做。作为过程的第一部分,我将用户发送到URL 但是,当我在我的Android设备上登录时,按钮显示为灰色,我无法点击它。有人知道这是为什么吗?(下方大截图) 我想这个按钮以前可能没有灰色,在我第一次运行应用和登录的时候。不过,因为赶时间,也说不清。

  • 我目前正在处理一组应用程序,这些应用程序运行在两个独立但等效的环境中(称为和)。我一直在使用OAuth 2.0进行授权,当我从OAuth服务请求访问令牌后收到响应时(我正在通过Postman进行请求),我会从和得到如下响应: 据我所知,我相信这个< code >“token _ type”:“Bearer”意味着当我向我的应用程序发送< code>access_token时,我需要这样做: 通过前

  • 例如,当我有一个post方法-登录时,我得到了签名的JSON Web令牌。我在youtube上看了一些教程,当他们检查用户是否被授权时,他们会在授权标头中发送JWT,例如: 不记名令牌 我的问题是:当同样的事情在工作时,如果我们只发送授权标头中的令牌,而没有令牌前面的“持有人”,他们为什么要这样做?

  • 为什么我在Maven中会出现“401未授权”错误? 以下是调用(底部为完整日志)时出现的错误: 根据这个sonatype支持页面: “如果您收到401,那是因为maven发送了错误的登录凭据,或者根本没有凭据。” 下面是我采取的步骤,下面是我完整的和文件,下面是和的完整日志。 我使用中的用户/pass成功地登录和退出了sonatype.org网站。 我尝试使用手动部署工件,使用命令 但出现了以下错

  • 我想向我的节点添加文档。js API,为此,我有一个YAML文件,我把我的定义放在那里,swagger文档位于localhost:5000/API doc,运行良好。 现在,我必须用以下定义添加Bear authorization but Swagger: 在测试请求时(我点击右上角的“授权”按钮并输入我的令牌),我得到以下错误: “错误”:“未找到授权标头”。 为什么请求中不包括标题?

  • 我的问题是:为什么这是流动?我想是出于安全原因,但我想不通。为什么实现是这样的,而不是在第一次调用(“/authorize”)之后立即获得访问令牌? 我们为什么需要这个代码?