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

Spring Security@Security拒绝访问,即使授予了正确的权限

戚弘和
2023-03-14

配置:

@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true, jsr250Enabled = true)

我正在使用JWT,所以我有一个过滤器来创建基于它的用户:

@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
        throws ServletException, IOException {
    try {
        String jwt = parseJwt(request);
        if (jwt != null && jwtUtils.validateJwtToken(jwt)) {
            String username = jwtUtils.getUserNameFromJwtToken(jwt);

            UserDetails userDetails = userDetailsService.loadUserByUsername(username);

            UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(
                    userDetails, null, userDetails.getAuthorities());
            authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));

            SecurityContextHolder.getContext().setAuthentication(authentication);
        }
    } catch (Exception e) {
        logger.error("Cannot set user authentication: {}", e);
    }

    filterChain.doFilter(request, response);
}

我的userDetailsService填充GrantedAuthorities:

User user = userRepository.findByUsername(username)
            .orElseThrow(() -> new UsernameNotFoundException("User Not Found with username: " + username));

    Collection<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
    authorities.add(new SimpleGrantedAuthority(user.getStatus().name()));
    
    return UserDetailsImpl.builder().username(user.getUsername()).guid(user.getGuid()).name(user.getName())
            .password(user.getPassword()).status(user.getStatus()).authorities(authorities).build();
@PutMapping("/auth/activate")
@Secured("ROLE_VALIDATING")
public ResponseEntity<?> activateAccount(Authentication authentication) {
    accountService.activateAccount(authentication.getName());
    return ResponseEntity.ok().body(new MessageResponse("Account Activated"));
}
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (auth != null && auth.getAuthorities().stream().anyMatch(a -> a.getAuthority().equals("VALIDATING"))) {
    LOG.info("I has the role!");
}

共有1个答案

郭璞
2023-03-14

参见Ken S.的评论。

您正在测试的GrantedAuthority“validating”只是一个权威,但是您正在测试注释中的“role_validating”。我不确定@Security是否接受授权,我发现的所有示例都是角色。如果要使用角色,您可能希望测试@preauthorize(“hasauthority('validating')”),或者将该权限重命名为“role_validating”。-肯24分钟前

对于后面的人,我所做的更改是切换到hasAuthority和@PreAuthorize注释。或者我更改了我的UserDetailsService:

Collection<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
    authorities.add(new SimpleGrantedAuthority(String.format("ROLE_%s", user.getStatus())));
 类似资料:
  • 因此,如果我以角色的身份登录,我就可以很好地访问这个视图。 但是,让我们做一个小的改变,重写一个方法... 这会给我一个...我不明白为什么。 为什么?!! 希望能得到一些帮助来解决这个问题。

  • 我正在heroku上做一个新项目,使用mysql(他们有一个名为JawsDB的插件,它给我一个mysql主机、用户名和密码)。(更新:我也试过使用他们的其他mysql插件ClearDB,我也遇到了同样的问题) 我可以像这样连接到数据库(并且我可以“show databases”来查看其中的内容): 问题:当我创建数据库时,我得到: 我已尝试授予所有特权,如下所示: 但这给了我: 我也尝试过创建用户

  • 我分配一个角色权限来创建数据库。相同的角色被分配给登录用户,但是当我试图使用分配角色的登录用户创建新数据库时,我得到权限拒绝错误。 无法执行语句。权限拒绝,数据库主,所有者dbo。运行此命令需要以下权限:CREATE DATABASE。赛贝斯错误代码=10331严重级别=14,状态=3,事务状态=0第1行 我用15.5分和16分试了一下。我做错什么了吗?我们需要考虑其他参数吗?我经历了这次讨论 h

  • 问题内容: 我看过许多类似的问题,因此表明我已经检查了基础知识。当然,这并不意味着我没有错过任何显而易见的东西。:-) 我的问题是:为什么我拒绝具有特权的用户访问权限,而我却已经在其中输入密码并被授予访问权限?(为了完整起见,我尝试输入错误的密码只是为了确保MySQL客户端在程序启动时拒绝我访问。) 背景: 通过ssh登录到运行MySQL服务器的计算机的外壳,我以root用户身份登录: 太棒了 我

  • 我对spring security&oauth2相当陌生。作为学习的一部分,我试图设置一个OAuth2授权服务器,并保护RESTendpoint免受未经授权的访问。 代码 资源服务器 ProductController.java 未经授权API可以正常工作 如果我们只使用权限(@preauthorize(“hasauthorize('...')”))进行授权,它可以正常工作 作用域在到达oauth

  • 我有一个针对SDK28的Android应用程序,所以我有处理的权限。我检查是否设置了,但当Exoplayer尝试读取文件(我验证该文件确实存在)时,我看到 com.google.android.exoplayer2.upstream.filedatasource$filedatasourceException:java.io.fileNotfoundexception:/storage/emula