AngularJS - Java EE REST安全性

jih*_*ter 6 java security rest angularjs java-ee-7

我在Java EE 7后端使用AngularJS和REST API.该项目部署在Wildfly应用程序服务器上,我有一些问题重新分类证券:

  1. 加密/解密数据我使用CryptoJS在服务器端(Java)加密和解密,但显然我们必须清除密码,密码和盐只加密.我的问题是为什么密码短语是明文?它应该是秘密的,然后加密也没有?

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

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

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

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

AngularJs和Jboss以及JAAS(omnisecurity)

如何集成angularjs和基于java jaas的身份验证?

有些用户提到这个:

* 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
Run Code Online (Sandbox Code Playgroud)

但是没有关于如何实现这一点的具体例子,尤其是CSRF.

gus*_*to2 3

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

一旦您以明文形式发送密钥(密码?),加密就毫无用处。

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

不同的情况是端到端安全性,当客户端加密、发布加密数据并且它们按原样存储/处理时,加密密钥仅供用户使用。如果情况并非如此,并且服务需要数据进行进一步操作,则 HTTPS 是最佳选择。

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

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

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

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

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

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

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

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

默认的Web授权应该就可以了。

不过——保持简单。根据我的经验,静态资源(网页、图像、脚本、CSS)应该是静态的,并且它们是否公开可用并不重要。重要的是执行(操作、数据……)作为服务公开,这就是您进行正确的身份验证和授权的点。

玩得开心