首页 文章

Spring Security - JWT为我提供什么?

提问于
浏览
0

我正在寻找使我的应用程序更安全,并让我了解正在发生的一切 .

我有一个登录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;
}

这创建了一个具有用户角色的会话,因此我可以配置WebSecurityConfigurerAdapter等 .

所以我的问题是用JWT添加过滤器究竟是做什么的? Spring Security是否已默认执行这些操作,因为我所做的已经创建了经过授权和验证的用户 .

谢谢 .

1 回答

  • 1

    在更高层次上:

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

    技术上:

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

    根据您的要求和架构,您可以选择任何 . 在微服务领域,无状态方法更为常见且最适合 .

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

    取决于您如何实现它 . 通常,JWT过滤器首先通过签名或加密验证令牌,然后从JWT读取用户权限 . 因此不需要任何userDetails服务的实现 .

相关问题