4

简短版:在纯 Java EE 6 中,是否有类似Spring 的 Authentication Processing Filter 之类的东西,它可以自定义基于表单的身份验证?

长版:我正在开发一个纯 Java EE 6 Web 应用程序(JSF2、CDI),它必须独立于稍后使用的具体 Java EE 6 容器。

访问受限的 JSF2 页面存储在子文件夹/pages中。在我的 web.xml 中,我定义了以下内容来限制对这些页面的访问:

<login-config>
    <auth-method>FORM</auth-method>
    <realm-name>??????????</realm-name>
    <form-login-config>
        <form-login-page>/login.jsf</form-login-page>
        <form-error-page>/access_denied.jsf</form-error-page>
    </form-login-config>
</login-config>

<security-constraint>
    <display-name>pages_auth</display-name>
    <web-resource-collection>
        <web-resource-name>pages</web-resource-name>
        <url-pattern>/pages/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>AuthenticatedUser</role-name>
    </auth-constraint>
</security-constraint>

<security-role>
    <role-name>AuthenticatedUser</role-name>
</security-role>

如“???”所示 在上面的代码中,我不能使用像 JDBC 这样的预定义领域之一,因为要使用的认证是非常自定义的(讨厌的细节:凭据是根据丑陋的遗留系统检查的)并且需要一些 Java 编码。

我希望我可以创建一个新的类来实现一些接口,覆盖一些身份验证方法,参数“login”和“password”返回一个布尔值来表示成功的身份验证。

然而,在阅读了几个小时的主题之后,我完全迷失了:-(我需要实现一个 JAAS LoginModule 和 Realm 吗?这对我来说看起来很复杂。或者还有另一种标准的 Java EE 6 方法吗?或者我需要采用实现 ServletFilter 的方式吗?

4

3 回答 3

2

在领域名称标签中,您需要将您在容器中创建的领域名称放入其中。这不是领域类型,它只是您选择的领域名称。

我有一个使用 JBoss AS 的应用程序,并以我的配置为例:

web.xml

<realm-name>weblog-jaas-realm</realm-name>

独立的.xml

<security-domain name="weblog-jaas-realm">
    <authentication>
        <login-module code="Database" flag="required">
            [...]
        </login-module>
    </authentication>
</security-domain>
于 2012-06-08T14:56:35.970 回答
1

我最终使用了Spring Security。似乎使用 Java EE 6 库,实现自定义身份验证提供程序并不容易。当然,您可以使用 servlet 过滤器从头开始实现所有内容,但在我看来这太容易出错了。Spring Security 似乎是一个很好的解决方案,尽管它为我的 web 应用程序添加了许多库,我希望我可以不用这些库。

于 2012-06-22T06:34:22.263 回答
1

与其考虑编写自己的自定义领域,当然也不必考虑使用 servlet 过滤器,不如使用适当的 JAASLoginModule实现相当容易地实现这一点。我们已经在许多不同的 Java EE 容器(包括 Tomcat、WebLogic 和 WebSphere)上非常成功地做到了这一点。

虽然 JAAS 清楚地定义了 API,使您的LoginModule实现可移植,但您会发现在每个容器中配置 JAAS 的方式是不同的,您可能不得不设置适当的主体名称和角色主体实现映射以使其工作。

于 2012-09-18T13:01:26.257 回答