一般而言,我在Java身份验证框架和身份验证工作流程方面经验不足(仅了解一些理论知识),因此出于教育目的,我试图为我的HTTP应用程序创建这种类型的身份验证:
/login
。sessionId
。/myresource?sessionId=1234567
。sessionId
。然后,服务器执行常规的获取工作流/myresource
(使用Shiro管理方法级访问权限)。基本上我有以下问题:
提前致谢。
我想我不需要HTTP会话或Servlet会话。 Shiro拥有自己的会话管理器,足以满足我的需求。我错了吗?
不,你是对的。这就是Shiro很棒的原因。从文档:
Shiro的Session支持比这两种[Web容器或EJB状态会话Bean]机制中的任何一种都更易于使用和管理,并且在任何应用程序中都可以使用它,而与容器无关。
例如
Subject currentUser = SecurityUtils.getSubject();
Session session = currentUser.getSession();
session.setAttribute( "someKey", someValue);
引用文档:getSession calls work in any application, even non-web applications
给客户端提供真实的sessionId是一种好习惯还是应该发送某种sessionToken(在服务器端解析为sessionId)?
发送普通的sessionId是一个坏主意。特别是,如果您要通过未加密的网络发送数据。使用HTTPS之类的东西
或使用
NONCE
行
。
另外,请注意,如果通过http / s POST数据而不是URL中的数据。
如何使用sessionId(客户端应将其存储在本地)登录Subject?
您的意思是,一旦获得会话ID,如何才能对主题进行身份验证?您可以简单地从文档中
Subject requestSubject = new Subject.Builder().sessionId(sessionId).buildSubject();
在进行这种身份验证之前,我还有其他需要知道的事情吗?
是。
更新
关于该主题认证部分-它将新创建的主题变成当前已认证的主题吗? 如果不是,我如何使其成为“当前”主题?
如果您在谈论new Subject.Builder().sessionId(sessionId).buildSubject()
,它不会。而且我不知道如何将其设置为该线程的
currentUser
。Shiro的JavaDoc说,
[以这种方式]返回的Subject实例不会自动绑定到应用程序(线程)以供进一步使用。也就是说,SecurityUtils.getSubject()不会自动返回与构建器返回的实例相同的实例。如果需要,框架开发人员可以将生成的Subject绑定以继续使用。
因此,这取决于您如何在当前线程中绑定主题或进一步使用。
如果您担心事情的SecurityUtils.getSubject();
工作原理,那么在Web容器上下文中,它使用简单的cookie来存储您的会话数据。当您的请求通过Shiro过滤器时,它会将当前主题附加到请求的生命周期(当前线程)。而当您getSubject()
只是Subject
从请求中获取时。我在这里找到了一个有趣的话题。
关于随机数部分:如果他发送给我某种哈希值而不是他的sessionId-我将无法对其进行解码以获取真实的sessionId(以此来授权他)。
我在这里想念什么吗?
随机部分-脖子上的疼痛。现在重新考虑,我认为做NONCE只是过分杀伤力。反正让我解释一些
用户首次使用其用户名和密码登录。在客户端设置userid
,nonce
(例如,UUID)和HASH(sessionID+nonce)
,将其称为hash1。在Cookie中说。将此存储nonce
在服务器端,可能在数据库中或在Map中user_id <--> nonce,session_id
根据后续要求,请确保您传回userid
,nonce
以及HASH
。
在服务器端,您要做的第一件事是验证请求。获取sessionId
并nonce
根据user_id
客户端发送的哈希表或数据库将其存储在哈希表或数据库中。创建一个哈希HASH(sessionId_from_db + nonce_from_db),将其称为hash2。
现在,如果hash1与hash2匹配,则可以验证请求,并且由于您已在服务器端存储了当前sessionId,因此可以使用它。在请求完成后,在Cookie和服务器端设置新的随机数。
如果您进行1-4,您将意识到您不需要Shiro进行身份验证。(:因此,我想说的很对,除非您对安全性而不是性能感到异常,否则在这种情况下不应用NONCE。
为什么MITM攻击对我很重要? 我的客户端(javascript
ajax代码)通过ajax从其服务器中获取数据。因此,我认为我不应该以任何方式关心MITM。
我认为这对您很重要。MITM攻击意味着您的请求/响应已通过计算机(MITM)链接到路由器。如果是未加密的请求,则全部是发送给MITM的纯文本。他可以看到您的所有请求…并且可能会欺骗请求并可能劫持会话。让我找到一些例子。…
http : //michael-coates.blogspot.com/2010/03/man-in-middle-attack-
explained.html
我正在尝试使用Shiro对我正在构建的JSF Web应用程序进行身份验证和授权。不幸的是,我仍然有一些困难缠绕我的头如何把所有的东西放在一起。 我已经成功地(100%使用shiro.ini文件)将身份验证配置回存储测试凭据集的JDBC领域。当凭据以明文形式存储时,它对我来说非常有效。 我的最终目标是统一MySQL数据库中的现有凭证集。密码存储为SHA-256盐哈希。我花了一整天的时间阅读可用的文档
我正在尝试在我们的项目中使用Apache Shiro进行Active Directory领域的身份验证和授权。当我使用用户CN属性进行身份验证时效果很好,但是,我想使用另一个唯一属性进行登录。是否可以将shiro配置为这样做? 这是我的西罗。ini文件: 以及登录代码: 如果我换线 到以下 试着用它登录,我得到了 谢谢你的回答。
我正在尝试使用urllib3连接到网页。代码如下所示。 如果我们假设url是需要使用用户名和密码进行身份验证的某个网页,那么我是否使用正确的代码进行身份验证? 我使用urllib2做这件事很舒服,但使用urllib3做不到同样的事情。 非常感谢
jwt不应该仅仅用于认证用户吗?我读到过可以在里面存储非敏感的东西,比如用户ID。将权限级别之类的东西存储在令牌中可以吗?这样我可以避免数据库调用。
我正在开发一个Web应用程序,它是rest客户端并使用rest服务(API)来执行任何操作。我集成了apache shiro以使用工作正常的jdbc领域执行身份验证。 现在,我正在寻找一种使用apacheDS LDAP执行身份验证的解决方案。我计划使用kerberos身份验证,但我没有找到任何有用的文章或示例来使用apache shiro实现kerberos身份验证。 我发现apache shir
我即将开始开发一个REST服务,安全性是这个项目的一个重要方面,但我找不到一些关于如何实现它的明确信息。我的服务一开始会被Android应用程序使用,但以后可能会被其他平台使用。控制用户访问非常关键,因此对REST服务的和控制非常重要。 尽管我可以找到关于如何制作安全REST API的主题,比如这里,这里和这里的这个大的,但令我惊讶的是,所有这些主题都没有指向著名的标准、框架或经过时间测试的解决方