2017-09-12 29 views
0

我正在使用spring引导创建无状态的REST API。 因此,我正在使用基于令牌的身份验证。Spring Security从无状态服务器注销

当前注销功能只在客户端实现。 我只是清除所有的饼干。

问题是用户对象似乎在请求中生存下来,所以它仍然存在于下一个请求中。 我的服务来获得当前用户很简单:

@Service 
public class UserService { 
    private User user; 

    @Autowired 
    private UserRepository; 

    public User get() { 
    if (user != null) { 
     return user; 
    } 
    Integer id = (Integer) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 
    user = userRepository.findById(id); 
    return user; 
    } 
} 

我希望用户变量为空每个请求?有趣的是,在安全上下文中设置了正确的用户标识。但是服务返回用户对象,因为它已经存在。

回答

1

您不应该将用户用作类属性。

UserService是一个单例,当有来自不同用户的并发请求时会发生什么? 在get方法内移动这个变量。

此外,如果您使用JWT作为基于令牌的身份验证,请查看此project

使用JWT,您可以直接从令牌检索用户所需的信息,而无需执行任何查询。

+0

但即使服务是一个单身人士,我期望单身人士的生命期只是请求约束。春天似乎在缓存单身人士的服务?否则我无法想象下一个请求中用户属性的存在方式。 – user3481997

+0

默认情况下,如果仅指定注释** Service **,则每次只能有一个UserService类(该类只有一个实例)。您可以通过注释** Scope **指定bean的范围,但我不推荐此解决方案。 – desoss

+0

但是这是通过多个请求共享的一个实例吗? – user3481997