为什么应该使用JAAS而不是手写安全性?

13

我有一个手写的安全性简单的Servlet过滤器,将未经授权的用户重定向到其登录页面。 登录控制器在成功验证或主页后将其重定向到所请求的URL。 这种方法很好用,唯一的缺点是我必须通过堆栈跟踪将存储在HttpSession中的User对象传递给EJB Beans。

现在我重写了一些代码并使用基于http的Spring-security进行身份验证。 它已自动与Glassfish JAAS集成。

我不再需要通过堆栈跟踪传递用户,调用sessionContext.getCallerPrincipal()就足够了。 但是主体对象只返回用户名而不是用户ID,因此如果需要用户ID,则必须执行附加选择操作。

1)是否有任何方法可以扩展主体对象,以便它可以存储更多属性?

2)为什么要使用JAAS或Spring Security或另一个安全框架,而不是手写的servlet过滤器?

2个回答

12

2) 使用像JAAS这样的标准安全机制有许多优点:

  1. 通过配置服务器,您可以轻松更改用户身份验证方式 - 无需更改代码中的任何内容。

  2. 您可以确保您的安全性是最新的,支持最强的算法,安全地存储Principal等。只需保持与服务器、框架等同步,手写的安全模块容易出错并很快过时。

  3. 您可以利用框架安全性 - 如web.xml安全标记、EJB安全注释。因为JAAS是一种标准的身份验证方式,所以您可以确信采用未来的技术将更加容易,因为所有重要的技术都将支持JAAS(如Spring security等)。如果您的软件计划成长,您肯定需要一个标准化的方法。

  4. 它将节省您的时间和精力。JAAS提供身份验证和授权功能,可在几分钟内整洁地打包并进行配置。

  5. 我建议进一步阅读J2EE安全或在OWASP指南中查找更多资源。


1
编写自己的登录模块实现更具可移植性,因为它不依赖于额外的服务器配置。只要您考虑到需要手动管理所有安全角色,就可以了。 - Gerrit Brink
1
此外,JAAS模型假定您的安全模型是基于角色的。但这并非总是如此。安全模型可以纯粹基于权限(因为角色的定义可能会在明天更改)。我将使用简单的Servlet过滤器进行页面级别的安全控制,并使用CDI拦截器进行方法/类级别的安全控制。 - Bino Manjasseril

0

1) 我不知道你是否可以扩展类Principal。但是请注意,在您的LoginModule中,在完成身份验证之前调用commit()(可能在您的login()方法中),可以将凭据添加到Subject中。为此,只需将对象添加到其中一个列表中:Subject.getPrivateCredentials()或Subject.getPublicCredentials()(不带参数)。您可以添加许多对象,例如您自己的类、字符串或任何您想要的内容。

要检索应用程序中的对象,请使用我的其他答案中详细说明的过程。

import javax.security.jacc.PolicyContext;

Subject subject = (Subject) PolicyContext.getContext("javax.security.auth.Subject.container");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接