有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用sessionId或用户名+密码的java Shiro身份验证

我在Java身份验证框架和身份验证工作流方面没有太多经验(只有一些理论知识),因此出于教育目的,我尝试为我的HTTP应用程序创建这种类型的身份验证:

  1. 客户端将登录+密码发布到/login
  2. Shiro通过给定的凭据登录用户。服务器返回客户端hissessionId
  3. 客户端请求某种资源/myresource?sessionId=1234567
  4. Shiro通过给定的sessionId登录主题。然后服务器执行获取/myresource的常规工作流(使用Shiro管理方法级访问权限)

基本上,我有以下问题:

  1. 我想我不需要HTTP会话或Servlet会话。Shiro有自己的会话管理器,足以满足我的需要。我错了吗
  2. 给客户端真正的sessionId是一种好的做法,还是应该发送某种sessionToken(在服务器端解析为sessionId)
  3. 如何使用sessionId(客户端应在本地存储sessionId)登录主题
  4. 在进行这种身份验证之前,我还需要知道其他事情吗

提前谢谢


共 (1) 个答案

  1. # 1 楼答案

    我想我不需要HTTP会话或Servlet会话。Shiro有自己的会话管理器,足以满足我的需要。我错了吗

    不,你说得对。这就是为什么Shiro很棒。从documentation

    Shiro's Session support is much simpler to use and manage than either of these two [web container or EJB Stateful Session Beans] mechanisms, and it is available in any application, regardless of container.

    例如

    Subject currentUser = SecurityUtils.getSubject();    
    Session session = currentUser.getSession();
    session.setAttribute( "someKey", someValue);
    

    引用自the docgetSession calls work in any application, even non-web applications

    给客户端真正的sessionId是一种好做法,还是应该发送某种sessionToken(在服务器端解析为sessionId)

    发送普通sessionId是个坏主意。特别是,如果您通过未加密的网络发送数据。要么使用HTTPS之类的东西,要么使用第NONCE行的东西

    另外,如果通过http/s发布数据,而不是将其放在URL中,请注意

    如何使用sessionId(客户端应在本地存储sessionId)登录主题

    你的意思是,一旦你有了会话ID,你怎么能对主题进行身份验证?你可以简单地, 从医生那里

    Subject requestSubject = new Subject.Builder().sessionId(sessionId).buildSubject();
    

    在进行这种身份验证之前,我还需要知道其他事情吗

    1. Shiro's Session Management
    2. 靠着MITM Attack
    3. 关于HTTPSSSL
    4. 散列函数thisApache Commons DigestUtils上的一些可能是this

    更新

    关于主题验证部分-它会使新创建的主题成为当前已验证的主题吗?如果不是,我如何使其成为“当前”主题

    如果你说的是new Subject.Builder().sessionId(sessionId).buildSubject(),它不会。我不知道如何将线程设置为currentUser。Shiro的JavaDoc

    [this way] returned Subject instance is not automatically bound to the application (thread) for further use. That is, SecurityUtils.getSubject() will not automatically return the same instance as what is returned by the builder. It is up to the framework developer to bind the built Subject for continued use if desired.

    因此,如何在当前线程或进一步使用中绑定主题取决于您

    如果您担心SecurityUtils.getSubject();thingy如何工作,那么,在web容器上下文中,它使用简单的cookie来存储会话数据。当您的请求通过Shiro过滤器到达时,它会将当前主题附加到其生命周期(当前线程)的请求中。当您作为getSubject()时,它只从请求中获取Subject。我发现了一条有趣的线索here

    关于nonce部分:如果他给我发送了某种散列而不是sessionId,我将无法解码它以获得真正的sessionId(授权给他)。我是不是遗漏了什么

    现在,这是一件令人头痛的事。现在重新考虑一下,我认为暂时停止只是过火了。不管怎样,让我解释一下

    1. 用户第一次使用其用户名和密码登录。在客户端设置useridnonce(比如UUID)和HASH(sessionID+nonce),称之为hash1。比如说,在饼干里。将此nonce存储在服务器端,可以在数据库中,也可以作为user_id < > nonce,session_id

    2. 在随后的请求中,请确保返回useridnonceHASH

    3. 在服务器端,您要做的第一件事是验证请求。基于客户端发送的user_id获取存储在hashmap或DB中的sessionIdnonce。创建一个hash,hash(sessionId_from_db+nonce_from_db),称之为hash2

    4. 现在,如果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