【问题标题】:Why should i use JAAS against hand-written security?为什么我应该使用 JAAS 来对抗手写安全?
【发布时间】:2011-04-21 14:18:13
【问题描述】:

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

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

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

1) 有没有扩展 Principal 对象,所以它可以存储更多的属性?

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

【问题讨论】:

    标签: java security jakarta-ee jaas


    【解决方案1】:

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

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

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

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

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

    5. 我建议进一步阅读 J2EE security 或者您可以在 OWASP 指南中找到更多资源。

    【讨论】:

    • 编写自己的登录模块实现更便携,因为它不依赖于额外的服务器配置。只要您考虑到您需要手动管理所有安全角色。
    • 此外,JAAS 模型假定您的安全模型是基于角色的。情况可能并非总是如此。安全模型可以纯粹基于权限(因为角色的定义明天可能会改变)。我会使用一个简单的 servlet 过滤器来实现页面级别的安全性,并使用 CDI 拦截器来实现方法/类级别的安全性。
    【解决方案2】:

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

    要检索应用程序中的对象,请使用my other answer 中详述的过程。

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

    【讨论】:

      猜你喜欢
      • 2011-04-12
      • 2019-10-07
      • 2014-03-17
      • 1970-01-01
      • 1970-01-01
      • 2010-09-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多