我正在探索基于我的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中
<login-config> <auth-method>FORM</auth-method> <realm-name>jdbcsecurerealm</realm-name> </login-config>
请注意,我没有添加任何form-login-config来定义form-login-page和form-error-page。
然后,如果我定义安全约束,例如
<security-constraint> <web-resource-collection> <web-resource-name>Admin Pages</web-resource-name> <description></description> <url-pattern>/admin/*</url-pattern> </web-resource-collection> <auth-constraint> <role-name>administrator</role-name> </auth-constraint> </security-constraint>
好吧…有效!request.login根据我的jdbcRealm进行检查,如果我尝试不登录而访问安全页面,那么我会得到一个很好的403。
但是似乎我在混合声明式安全性和程序性安全性,因为我觉得我不应该在web.xml中声明任何内容,而应该使用request.isUserInRole。
问题 :
我是在打玻璃鱼的特定行为,还是允许将编程安全性(request.login)与web.xml中定义的jdbc领域一起使用,而无需使用form-login- config?
更新 我刚刚看到有可能在glassfish-application.xml中指定领域,这是更好的方法来建立耳朵而不是战争来指定领域吗?
当您使用特定于容器的(专有)登录模块(例如GlassFish JDBC登录模块/领域)时,无法采用可移植(纯Java EE)方式的纯编程方法。
Java EE 6中有一个API用于此目的:JASPIC。使用该API(从技术上讲,是SPI),您可以构建可移植的身份验证模块,并完全以编程方式配置它们,而无需任何声明。
我写了一篇有关此的博客文章,希望为您提供更多详细信息。