3

我正在探索基于我 glassfish 服务器的 jdbc 领域进行编程安全的纯 Java EE 方法,尤其是登录用户。

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

String username = request.getParameter("username");
String password = request.getParameter("password");

try {
    request.login(username, password);
....

在我的 web.xml 中不做任何事情,使用默认领域(文件)。我不希望那样,我想使用我的 jdbcRealm,名为 jdbcsecurerealm。

所以我将以下内容添加到我的 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。

问题

我是否遇到了 glassfish 特定的行为,或者是否允许在没有 form-login-config 的情况下使用在 web.xml 中定义的 jdbc 领域的编程安全性(request.login)?

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

4

2 回答 2

3

当您使用容器特定(专有)登录模块(例如 GlassFish JDBC 登录模块/领域)时,不可能采用可移植(纯 Java EE)方式的纯编程方法。

Java EE 6 中有一个 API:JASPIC。使用该 API(从技术上讲是 SPI),您可以构建可移植的身份验证模块并完全以编程方式配置它们,而无需任何声明。

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

于 2013-04-19T07:03:12.933 回答
2

Well, there are two aspects to security in web applications : Authentication and Authorization. What you are using here is programmatic authentication (the way users are logging in) and declarative authorization (defining what users are allowed to see). There is no issue in mixing both, in my opinion.

If you keep your realm in your web.xml, your application will be more portable. (meaning you can deploy your war in e.g. a tomcat server without changes).

于 2013-04-18T14:09:23.347 回答