我在REST服务中禁用了会话管理,因为我使用Oauth2来验证客户端+用户。所以我有这些配置:
资源服务器
@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
@Override
public void configure( HttpSecurity http ) throws Exception {
http.sessionManagement().sessionCreationPolicy( SessionCreationPolicy.STATELESS );
//....
}
}
基本身份验证:
@Configuration
@EnableWebSecurity
public class SecurityWebConfig extends WebSecurityConfigurerAdapter {
@Override
public void configure( HttpSecurity http ) throws Exception {
http.sessionManagement().sessionCreationPolicy( SessionCreationPolicy.STATELESS );
//....
}
}
我不知道在这两种配置中是否与此相关。
现在,当我使用经过身份验证的客户端(包括访问令牌)向受保护路径发送请求时。响应标头包含JSESSIONID
之类的内容,如
set-cookie:JSESSIONID=A3E6E26C28916C5D95795E934F15C8F1
这是正常的行为吗?
为了进一步完成我的测试,我做了这个(以获得当前连接的用户):
@RestController
@RequestMapping( "/protected" )
@Slf4j
@AllArgsConstructor
public class ChicoweursToUIController {
private UIService service;
@GetMapping
public UserDTO findUser( OAuth2Authentication authentication, HttpSession session ) {
log.info( "Connected user: {}", authentication.getUserAuthentication().getName() );
log.info( "Is session null: {}", session==null );
return service.findUser(authentication.getUserAuthentication().getName() );
}
}
日志结果为:
Connected user: username@mail.com
Is session null: false
为什么HttpSession
不为空?
在我看来,我认为Spring Security Context依赖于会话来获取经过身份验证的用户,例如,如果会话被禁用,则安全上下文无法找到当前用户。我错了吗?有人可以澄清这些问题吗?
最后,我是否可以始终依赖OAuth2Authentication
来查找当前连接的客户端和用户,即使会话被禁用了?
非常感谢