我想我没有正确理解工作流程。我正在使用 Apache Shiro 和 Stormpath 在 Scala 中编写 Web 服务。我的用户身份验证过程如下所示:
1) 从 POST 请求中获取用户数据,使用 Stormpath 检查,如果一切正常,重定向到某个页面:
pathPrefix("api") {
path("login") {
post {
AuthToken.fromRequest { (token: AuthToken) =>
stormpathAuth(token) { subj =>
log.info("Subj {}", subj.getPrincipal.toString)
redirect("/some/page", StatusCodes.Found)
}
}
}
}
在日志中没关系,Shiro 用 Stormpath 帐户返回给我一个正确的主题。接下来我想提取主题,在代码中使用它:
pathPrefix("some") {
loggedInUser { subject =>
path("page") {
get {
complete {
html.render(Page.model)
}
}
} ..... other routes
loggedInUser
指令应该提取主题并检查它是否经过身份验证,否则重定向到登录表单。问题是它总是将我重定向到登录表单,尽管在日志SubjectUtils.getSubject.getPrincipal
中显示了正确的帐户。
更新
实际上,Spray 是建立在 Akka 之上的。所以我认为问题出在getSubject
实现背后,目前取决于 ThreadLocal 环境。我搜索了 Shiro + Akka 主题,但没有找到任何有用的信息。