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

Spring的安全-JWT给了我什么?

孙言
2023-03-14

我正在考虑使我的应用程序更安全,并了解正在发生的一切。

我在Spring Boot有一个登录名。该登录调用UserDetailsService实现,如下所示:

   public UserDetails loadUserByUsername(String username)
        throws UsernameNotFoundException {

    User user = userRepository.findByUsername(username);

    if (user.getUsername().isEmpty()) {
        throw new UsernameNotFoundException(
                "No user found with username: "+ username);
    }

    String role;

    if (user.getUserType().contains("Gp")){
        role = "ROLE_GP";
    }

    else if(user.getUserType().contains("Patient")){
        role = "ROLE_PATIENT";
    }

    else {
        role = "ROLE_ADMIN";
    }

    boolean enabled = true;
    boolean accountNonExpired = true;
    boolean credentialsNonExpired = true;
    boolean accountNonLocked = true;
    return  new org.springframework.security.core.userdetails.User
            (user.getUsername(),
                    user.getPassword(), enabled, accountNonExpired,
                    credentialsNonExpired, accountNonLocked,
                    getAuthorities(Arrays.asList(role)));
}

private static List<GrantedAuthority> getAuthorities (List<String> roles) {
    List<GrantedAuthority> authorities = new ArrayList<>();
    for (String role : roles) {
        authorities.add(new SimpleGrantedAuthority(role));
    }
    return authorities;
}

这为我创建了一个具有用户角色的会话,以便我可以配置网络安全配置器适配器等。

所以我的问题是,用JWT添加过滤器到底做了什么?SpringSecurity在默认情况下是否已经这样做了,因为我所做的已经创建了一个经过授权和身份验证的用户。

谢了。

共有1个答案

邵飞白
2023-03-14

在更高层次上:

您实现的是有状态身份验证。虽然 JWT 为您的应用程序提供无状态身份验证(无需创建/销毁任何会话。每个请求都携带一个令牌来访问资源。).虽然,使用 JWT,您也可以进行有状态身份验证。

技术上:

在这两种方法中,最终结果是相同的。主要区别在于,在您的方法中,您有责任对用户进行身份验证并提供权限。在 JWT 中,对用户进行身份验证的责任属于称为授权服务器的第三方。在应用程序中,您只需验证 JWT,并根据权限允许或拒绝对所需资源的访问。

根据您的需求和架构,您可以选择任何一种。在微服务领域,无状态方法更常见,也最适合。

所以我的问题是,用JWT添加过滤器到底做了什么?Spring Security是否默认执行这些操作

取决于您如何实现它。通常JWT过滤器首先通过签名或加密来验证令牌,然后从JWT读取用户权限。所以不需要有任何user详细服务的实现。

 类似资料:
  • 正在尝试使用Spring boot webflux设置基于JWT令牌的身份验证。 Spring boot版本:-2.3.0。生成快照 技术堆栈:-Angular 9,Spring boot 2.3.0。BUILD-SNAPSHOT,Spring Security,Spring Security JWT GUI基于angular 9并使用基于表单的身份验证。 需要JWT来调用来自角,也需要调用直接到

  • 我对Spring和Spring Security都是新手。我在读关于Spring Security的文章,它提出了principal的概念,应该是当前登录的用户。但如果我们有多个当前登录用户呢?那么,我的问题是,在Spring安全中,校长到底是什么? 例如,我已经阅读了本教程: http://www.mkyong.com/spring-security/get-current-logged-in-

  • 在我的应用程序中,我使用coroutine和flow向API发送请求。当请求出现时,我更改了stateFlow的值,以便我的activity中的收集器看到并执行其工作。这是一个简单的场景。在android网站(https://developer.android.com/kotlin/flow/stateflow-and-sharedflow)中,建议了2种方法。在这种情况下,我应该倾向于哪种方法?

  • MongoDB shell v3.4.1连接到:MongoDB://127.0.0.1:27017 2017-12-06T12:16:58.540+0530 W网络[main]连接到127.0.0.1:27017失败,在(轮询后检查套接字错误),原因:连接拒绝2017-12-06T12:16:58.540+0530 E查询[main]错误:无法连接到服务器127.0.0.1:27017,连接尝试失

  • 该IV是否满足“对于给定的密钥,IV不得重复”的要求。来自RFC 4106? 我也非常感谢对我相关问题的任何回答/洞察力(见下文),但第一个问题是最困扰我的。我不知道在哪里可以找到源代码或文档来回答这个问题。 下面是大致的完整代码。如果我在写这篇文章时引入了错误,我深表歉意: > 用cipher.getiv()返回的IV对我来说以这种方式使用安全吗? 它是否避免了在伽罗瓦/计数器模式下重复使用IV

  • 我正在尝试使用Spring Boot RSocket与安全使用JWT令牌。它给我一个拒绝访问的错误,没有其他有用的信息来帮助调试? 拒绝访问 ApplicationErrorException(0x201):app//io.rsocket.exceptions.exceptions.from(exceptions.java:76)处的app//io-rsocket.core.RSocketRequ