使用sessionId或用户名+密码的java Shiro身份验证
我在Java身份验证框架和身份验证工作流方面没有太多经验(只有一些理论知识),因此出于教育目的,我尝试为我的HTTP应用程序创建这种类型的身份验证:
- 客户端将登录+密码发布到
/login
李> - Shiro通过给定的凭据登录用户。服务器返回客户端his
sessionId
李> - 客户端请求某种资源
/myresource?sessionId=1234567
李> - Shiro通过给定的
sessionId
登录主题。然后服务器执行获取/myresource
的常规工作流(使用Shiro管理方法级访问权限)李>
基本上,我有以下问题:
- 我想我不需要HTTP会话或Servlet会话。Shiro有自己的会话管理器,足以满足我的需要。我错了吗李>
- 给客户端真正的sessionId是一种好的做法,还是应该发送某种sessionToken(在服务器端解析为sessionId)李>
- 如何使用sessionId(客户端应在本地存储sessionId)登录主题李>
- 在进行这种身份验证之前,我还需要知道其他事情吗李>
提前谢谢
# 1 楼答案
我想我不需要HTTP会话或Servlet会话。Shiro有自己的会话管理器,足以满足我的需要。我错了吗强>
不,你说得对。这就是为什么Shiro很棒。从documentation:
例如
引用自the doc:
getSession calls work in any application, even non-web applications
给客户端真正的sessionId是一种好做法,还是应该发送某种sessionToken(在服务器端解析为sessionId)强>
发送普通sessionId是个坏主意。特别是,如果您通过未加密的网络发送数据。要么使用HTTPS
之类的东西,要么使用第NONCE行的东西另外,如果通过http/s发布数据,而不是将其放在URL中,请注意
如何使用sessionId(客户端应在本地存储sessionId)登录主题强>
你的意思是,一旦你有了会话ID,你怎么能对主题进行身份验证?你可以简单地, 从医生那里
在进行这种身份验证之前,我还需要知道其他事情吗强>
对
更新
关于主题验证部分-它会使新创建的主题成为当前已验证的主题吗?如果不是,我如何使其成为“当前”主题强>
如果你说的是
new Subject.Builder().sessionId(sessionId).buildSubject()
,它不会。我不知道如何将线程设置为currentUser。Shiro的JavaDoc说因此,如何在当前线程或进一步使用中绑定主题取决于您
如果您担心
SecurityUtils.getSubject();
thingy如何工作,那么,在web容器上下文中,它使用简单的cookie来存储会话数据。当您的请求通过Shiro过滤器到达时,它会将当前主题附加到其生命周期(当前线程)的请求中。当您作为getSubject()
时,它只从请求中获取Subject
。我发现了一条有趣的线索here关于nonce部分:如果他给我发送了某种散列而不是sessionId,我将无法解码它以获得真正的sessionId(授权给他)。我是不是遗漏了什么强>
现在,这是一件令人头痛的事。现在重新考虑一下,我认为暂时停止只是过火了。不管怎样,让我解释一下
用户第一次使用其用户名和密码登录。在客户端设置
userid
、nonce
(比如UUID)和HASH(sessionID+nonce)
,称之为hash1。比如说,在饼干里。将此nonce
存储在服务器端,可以在数据库中,也可以作为user_id < > nonce,session_id
在随后的请求中,请确保返回
userid
、nonce
和HASH
在服务器端,您要做的第一件事是验证请求。基于客户端发送的
user_id
获取存储在hashmap或DB中的sessionId
和nonce
。创建一个hash,hash(sessionId_from_db+nonce_from_db),称之为hash2现在,如果hash1与hash2匹配,您可以验证请求,并且因为您已经在服务器端存储了当前sessionId,所以可以使用它。请求完成后,在cookie和服务器端设置新的nonce
如果你通过14,你会意识到你不需要Shiro进行身份验证。(: 所以,我收回我的话,NONCE不适用于这种情况,除非你对安全性过于担心
为什么MITM攻击对我很重要?我的客户机(javascript ajax代码)通过ajax从其服务器获取数据。因此,我认为我不应该以任何方式关心MITM强>
我想这对你应该很重要。MITM攻击意味着您的请求/响应通过机器(MITM)链接到您的路由器。如果是未加密的请求,则对MITM来说都是纯文本。他能看到你所有的请求。。。并可能伪造请求并可能劫持会话。让我找一些例子http://michael-coates.blogspot.com/2010/03/man-in-middle-attack-explained.html