2011-04-21 66 views
13

我得到了手写安全性,简单的servlet过滤器,将非授权用户重定向到他们的登录页面。登录控制器在成功认证或主页后将其重定向到请求的URL。这种方法工作正常,唯一的缺点是我必须通过stacktrace将存储在HttpSession中的User对象传递给EJB bean。为什么我应该使用JAAS手写安全性?

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

我不需要通过stacktrace传递用户,调用sessionContext.getCallerPrincipal()就足够了。但主对象只返回我的userName,而不是userId,所以我必须执行另外选择,如果我需要userId为例。

1)有无论如何扩展主体对象,所以它可以存储更多的属性?

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

回答

10

2)使用一个标准的安全机制,像JAAS具有许多优点:

  1. 您可以轻松地改变用户的方式通过配置您的服务器仅验证 - 无需更改代码里面任何东西。

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

  3. 您可以利用框架安全 - 例如。 web.xml安全标签,EJB安全注释。由于JAAS是一种标准的认证方式,因此所有认真的技术都将支持JAAS(Spring安全等),因此可以确保采用未来的技术会更容易。如果你的软件计划增长,你肯定会需要一个标准。

  4. 它会为您节省时间和精力。 JAAS提供身份验证和授权,在几分钟内完成打包和配置。

  5. 我推荐阅读J2EE security,或者您可以在OWASP指南中找到更多资源。

+0

编写自己的实现登录模块的更便携,由于它不依赖于额外的服务器配置。只要您考虑到需要手动管理所有安全角色。 – 2013-09-25 10:05:26

+0

另外,JAAS模型假定您的安全模型是基于角色的。情况可能并非如此。安全模型可以完全基于权限(因为角色的定义可以在明天改变)。 我会使用一个简单的servlet过滤器来实现页面级安全性,并使用CDI拦截器来实现方法/类级别的安全性。 – 2014-06-20 19:35:12

0

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

要检索应用程序中的对象,请使用my other answer中详细介绍的步骤。

import javax.security.jacc.PolicyContext; 

Subject subject = (Subject) PolicyContext.getContext("javax.security.auth.Subject.container"); 
相关问题