【问题标题】:AngularJS - Java EE REST securityAngularJS - Java EE REST 安全性
【发布时间】:2015-06-16 10:00:14
【问题描述】:

我在 Java EE 7 后端使用 AngularJS 和 REST API。 该项目部署在 Wildfly 应用服务器上,我有一些关于证券评级的问题:

  1. 为了加密/解密数据,我使用 CryptoJS 在服务器端 (Java) 加密和解密,但显然我们必须以明文形式发送密码,密码和盐只加密。 我的问题是为什么密码是明文?它应该是秘密的,然后也加密了?

  2. 对于 REST API,Java EE 7 使用的标准是什么,HTTP 安全标头 (basic-auth)? Json 访问令牌?以及它是如何工作的,在 cookie 上存储用户会话/令牌的位置?我只是想知道如何使用 Angular 来做到这一点。

  3. 也许我可以将经典 JAAS 与基于表单的身份验证一起使用,然后在服务器端使用 request.login() 进行身份验证,然后我的 EJB 将全部受到 @Role 的保护。

  4. 在 AngularJS 中保护页面的方法是什么?目前我正在使用 web.xml 并放置 URL 模式,也许有更好的方法?

我已经找到了很多这样的例子:

AngularJs and Jboss and JAAS(全方位安全)

how to integrate angularjs and java jaas based authentication?

一些用户提到这一点:

* index.html page should contain token inside html to avoid CSRF
* token shouldn't be stored in a cookie storage
* Each request should be signed with header param
* Server should validate every request by passed header
* If cookie usage is a must you should validate referer in order to prevent CSRF

但是没有具体的例子说明如何实现这一点,尤其是 CSRF。

【问题讨论】:

  • 您的第 1 点听起来很令人担忧。 CryptoJS 是一个 javascript 库,您是否真的在服务器端使用 nashorn 或其他东西,或者您的意思是说您在 javascript 的客户端使用它?您从哪里发送密码短语以及将其发送到哪里?用于(身份验证、用于加密的 PBKDF 等)的密码是什么?你不需要加密盐,这被认为是公开的。

标签: java angularjs rest security java-ee-7


【解决方案1】:

要加密/解密数据,我使用 CryptoJS 加密和解密 服务器端(Java),但显然我们必须发送密码 清楚,密码和盐只被加密。我的问题是为什么 密码是明文吗?它应该是秘密的,然后加密为 好吧没有?

只要您以明文形式发送密钥(密码?) - 加密就没有用了。

要实现合理的客户端-服务器安全性,请使用 HTTPS。简单、有效且更安全。通常,在 Web 应用程序端加密是个坏主意,因为用户或“中间人”可以检索或修改密钥和数据。

不同的情况是端到端安全性,当客户端加密、发布加密数据并按原样存储/处理时,加密密钥仅供用户使用。如果不是这种情况,并且服务需要数据进行进一步操作,那么 HTTPS 就是要走的路。

对于 REST API,Java EE 7 使用的标准是什么,HTTP 安全标头 (basic-auth)? Json 访问令牌?以及它是如何真正的 工作,在哪里存储用户会话/令牌,在 cookie 上?我只想 知道如何使用 Angular。

实际上你列出了你的选项。这是你的决定。每个选项都有其优点和缺点。基本上 - 如果您谈论的是 (REST) 服务,那么使用什么技术并不重要。

对于直接从浏览器调用的 REST 服务,我会省略基本身份验证(否则用户会看到弹出身份验证窗口)

您可以使用 JWT 令牌(由应用程序密钥签名,只需添加一些到期日期),但您无法“注销”用户,只需等到令牌到期即可。优点是,令牌是“自给自足的”,您不必担心会话管理。客户端在 Authorization HTTP 标头中发送 JWT 令牌,您只需对其进行解码、验证,然后您就可以从令牌中假设身份。

另一个选项是会话令牌(cookie 或作为授权标头发送),您需要在其中管理会话(存储令牌,在注销时清除令牌,...)。使用应用服务器会话 cookie 会使您的服务无法被其他应用程序使用(仍然是一个问题 - 您是否希望/需要第三方可重用服务),但您实现了内置授权(JAAS、角色等)。

也许我可以将经典的 JAAS 与基于表单的身份验证一起使用,并且 然后在服务器端对 request.login() 进行身份验证,然后我的 EJB 将全部受@Role 保护。

确实,这是您对用户进行身份验证和授权以及颁发令牌(jwt、cookie、其他...)的一种方式。

AngularJS 中保护页面的方法是什么?目前我是 使用 web.xml 并放置 URL 模式,也许有一个 更好的方法?

默认的网络授权应该没问题。

仍然 - 保持简单。根据我的经验,静态资源(网页、图像、脚本、css)应该是静态的,如果它们是公开可用的,这并不重要。重要的是执行(操作、数据……)作为服务公开,这就是您进行适当身份验证和授权的地方。

玩得开心

【讨论】:

  • “其他应用程序无法使用”.. 是的,除非我们说的是联合令牌。
猜你喜欢
  • 1970-01-01
  • 2016-03-15
  • 2013-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多