为什么我应该使用JAAS来对抗手写的安全性?

2022-09-04 21:45:14

我得到了手写的安全性,简单的servlet过滤器,它将未经授权的用户重定向到他们的登录页面。登录控制器在成功进行身份验证后将其重定向到请求的 URL 或其主页。这种方法工作正常,唯一的缺点是,我必须通过堆栈跟踪将存储在HttpSession中的User对象传递给EJB bean。

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

我不再需要通过堆栈跟踪传递User,调用就足够了。但是主体对象只返回我的用户名,而不是userId,所以如果我需要userId,我必须执行加法选择。sessionContext.getCallerPrincipal()

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

2)为什么我应该使用JAAS或Spring Security或其他安全框架,为什么不直接使用手写的servlet过滤器?


答案 1

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

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

  2. 您可以确保您的安全性是最新的,支持最强大的算法,以安全的方式存储主体等。同样,只需与您的服务器,框架等保持最新状态即可。拥有手写的安全模块很容易出错,很快就会过时。

  3. 您可以利用框架安全性 - 例如。web.xml安全标签,EJB 安全注释。因为JAAS是一种标准的身份验证方式,所以你可以肯定采用未来的技术会更容易,因为所有严肃的技术都将支持JAAS(Spring安全等)。如果您的软件计划发展,那么您肯定需要一个标准。

  4. 它将节省您的时间和精力。JAAS 提供认证和授权,可在几分钟内整齐地打包和配置。

  5. 我建议进一步阅读有关 J2EE 安全性的内容,或者您可以在 OWASP 指南中找到更多资源。


答案 2

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

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

import javax.security.jacc.PolicyContext;

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