Java EE 6编程安全性,glassfish和JDBC领域

我正在探索基于我的glassfish服务器的jdbc领域的纯Java EE方式来执行编程安全性,特别是登录用户。

基本上,在我的登录servlet中,我正在做

String username = request.getParameter("username"); String password = request.getParameter("password"); try { request.login(username, password); .... 

如果没有在我的web.xml中执行任何操作,则使用默认域(文件)。 我不想那样,我想使用名为jdbcsecurerealm的jdbcRealm。

所以我将以下内容添加到我的web.xml中

  FORM jdbcsecurerealm  

请注意,我没有添加任何form-login-config来定义form-login-page和form-error-page。

然后,如果我定义安全约束,如

   Admin Pages  /admin/*   administrator   

嗯……它有效! request.login检查我的jdbcRealm,如果我尝试访问安全页面而没有登录,那么我得到一个不错的403。

但似乎我混合了声明性安全性和程序化安全性,因为我觉得我不应该在web.xml中声明任何内容,而是使用request.isUserInRole。

问题

我是否遇到了glassfish特定的行为,或者是否允许使用编程安全性(request.login)和web.xml中定义的jdbc域而不使用form-login-config?

更新我刚刚看到有可能在glassfish-application.xml中指定一个领域,为了指定领域,它是建立一个耳朵而不是战争的更好方法吗?

当您使用特定于容器(专有)的登录模块(如GlassFish JDBC登录模块/领域)时,无法以便携式(纯Java EE)方式实现纯编程方法。

Java EE 6中有一个API:JASPIC。 使用该API(技术上为SPI),您可以构建便携式身份validation模块并完全以编程方式对其进行配置,而无需任何声明。

我写了一篇关于此的博客文章 ,希望能为您提供更多细节。

嗯,Web应用程序的安全性有两个方面:身份validation和授权。 您在这里使用的是程序化身份validation (用户登录的方式)和声明性授权 (定义允许用户查看的内容)。 在我看来,混合两者都没有问题。

如果您将领域保留在web.xml ,您的应用程序将更加便携。 (这意味着您可以在没有更改的情况下在tomcat服务器中部署战争)。