1

我使用 Spring Boot 和 Spring Security 构建了一个 REST 服务进行身份验证。我对 Spring Boot 和 Spring Security 都很陌生。我在一个 JAR 文件中创建了一个身份验证模块。前端客户端向身份验证模块发送带有用户名和密码的请求。身份验证模块然后根据数据库对用户的详细信息进行身份验证。如果身份验证成功,则会创建一个 JWT,然后将其发送回客户端。用户名和角色被编码到 JWT 中。然后,当从单独的 JAR 文件中构建的其他 REST 服务端点请求资源时,JWT 用于验证用户。有几件事我不确定。

在 Spring Security 中,是否为每个用户创建了一个身份验证对象,以便可以同时对多个用户进行身份验证,或者每次进行一次身份验证并且只能登录一个用户?

认证对象的有效期是多久?在身份验证模块中创建 JWT 后,我应该“注销”/删除身份验证成功,还是在请求完成后它会自行处理?对于资源端点(不是身份验证端点),一旦我验证了 JWT,有没有办法在身份验证对象中设置身份验证成功?同样,一旦验证了 JWT,我可以在身份验证对象中设置角色吗?

我的代码基于此示例https://auth0.com/blog/securing-spring-boot-with-jwts/。我已将其拆分为不同的 JAR 以对 JWT 进行身份验证和验证(我正在资源端点中进行验证)。我还添加了 JDBC 身份验证,而不是内存身份验证。

4

1 回答 1

1

在 Spring Security 中,是否为每个用户创建了一个身份验证对象,以便可以同时对多个用户进行身份验证,或者每次进行一次身份验证并且只能登录一个用户?

当然可以同时验证多个用户!

认证对象的有效期是多久?在身份验证模块中创建 JWT 后,我应该“注销”/删除身份验证成功,还是在请求完成后它会自行处理?

您编写的服务是 REST,如果您想保持“清教徒”REST,您应该将身份验证配置为stateless,这意味着Authentication在处理请求时删除对象。这不会影响 JWT 令牌的有效性,您可以根据需要设置 JWT 令牌的到期时间。

如何使用“Java config”使 REST 无状态:

@Configuration
public static class RestHttpConfig extends WebSecurityConfigurerAdapter
{
    @Override
    protected void configure(HttpSecurity http) throws Exception
    {
        http
            .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS);
        // and the rest of security config after this

对于资源端点(不是身份验证端点),一旦我验证了 JWT,有没有办法在身份验证对象中设置身份验证成功?同样,一旦验证了 JWT,我可以在身份验证对象中设置角色吗?

验证令牌,我使用类似于以下的代码:

Collection<? extends GrantedAuthority> authorities = Collections.singleton(new SimpleGrantedAuthority("ROLE_JWT"));
Authentication authentication = new PreAuthenticatedAuthenticationToken(subject, token, authorities);
SecurityContextHolder.getContext().setAuthentication(authentication);

通过构造具有至少一个角色(权限)的认证对象,将其标记为“成功”(已认证)。

于 2017-04-24T07:42:52.863 回答