Java:许可Web应用程序.登录前检查许可证

Pra*_*tel 9 java licensing web.xml servlets filter

我想保护我的webapp许可证.当请求webapp的任何页面/资源时,我想首先检查许可证.如果未找到许可证,那么我想重定向到许可证上载页面.

我创建了一个过滤器,它映射到我可以检查许可证的所有请求,并在必要时重定向.问题是我的webapp具有登录验证的安全约束.有关详细信息,请参阅最后的web.xml.

由于安全性约束,所有请求首先被登录身份验证拦截,然后转发到我的过滤器.但是,我想在登录之前检查许可证.

这是我问过的一个相关问题.

Java:在进行登录身份验证之前拦截所有请求

优先考虑安全约束的过滤器似乎是不可能的.所以,我想问一下,有什么其他方法可以解决这个用例吗?

web.xml中

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    id="WebApp_ID" version="2.5">
    <display-name>Tango</display-name>

    <filter>
        <filter-name>SalsaValidationFilter</filter-name>
        <filter-class>net.semandex.salsa.validationFilters.SalsaValidationFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>SalsaValidationFilter</filter-name>
        <url-pattern>/*</url-pattern>
        <!-- <servlet-name>SalsaValidationServlet</servlet-name> -->
        <dispatcher>REQUEST</dispatcher>
    </filter-mapping>

    <session-config>
        <session-timeout>20</session-timeout>
    </session-config>

    <security-constraint>
        <web-resource-collection>
            <web-resource-name>Login page images</web-resource-name>
            <url-pattern>/images/salsadb-logo2.png</url-pattern>
            <url-pattern>/images/salsa-icon.png</url-pattern>
            <url-pattern>/images/shadow_box.png</url-pattern>
            <url-pattern>/images/header.png</url-pattern>
            <url-pattern>/images/bg.png</url-pattern>
            <url-pattern>/css/splash.css</url-pattern>
            <url-pattern>/WEB-INF/licenseValidation.html</url-pattern>
            <url-pattern>/auth/licenseValidation.html</url-pattern>
        </web-resource-collection>
    </security-constraint>

    <security-constraint>
        <web-resource-collection>
            <web-resource-name>The entire webapp</web-resource-name>
            <url-pattern>/*</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <role-name>SalsaUser</role-name>
        </auth-constraint>
    </security-constraint>

    <security-role>
        <role-name>SalsaUser</role-name>
    </security-role>

    <login-config>
        <auth-method>FORM</auth-method>
        <form-login-config>
          <form-login-page>/auth/login.jsp</form-login-page>
          <form-error-page>/auth/loginError.jsp</form-error-page>
        </form-login-config>

        <realm-name>mongo_login</realm-name>
    </login-config>
</web-app>
Run Code Online (Sandbox Code Playgroud)

小智 1

如果您必须在身份验证之前验证许可证,唯一的方法是使用编程安全性并将许可证验证作为过程的一部分。

当声明性安全性不足以表达应用程序的安全模型时,编程安全性非常有用。用于编程安全性的 API 由 EJBContext 接口和 HttpServletRequest 接口的方法组成。这些方法允许组件根据调用者或远程用户的安全角色做出业务逻辑决策。

https://docs.oracle.com/javaee/7/tutorial/security-intro003.htm#BNBXH

以下是一些简短的示例:https ://docs.oracle.com/javaee/7/tutorial/security-webtier003.htm#GJIIE

我自己没有做过程序安全性,但从外观上看,你可以这样做:

  1. 从 web.xml 中删除容器安全性 - 按照设计,它会优先于其他所有内容,从而妨碍您。理想情况下,您可以将 auth-method 设置为 NONE 并保留安全约束 - 大概您在尝试访问时会直接显示错误页面,然后您可以在 servlet 中执行 2) 和 3)(如下),然后再试一次。如果您也必须删除安全约束,请按如下方式使用过滤器。
  2. 添加一个将验证许可证的过滤器。如果失败,它将重定向到上传许可证的页面并重试。如果没有,您将执行链中的下一个过滤器。
  3. 链中的下一个过滤器知道许可证是有效的。如果用户未登录,它将尝试获取用户和密码作为请求参数。如果它们存在,它将尝试以编程方式对它们进行身份验证 - 此时您正在执行上一个链接中的示例之一。如果用户已登录,则继续。如果凭据不匹配或没有可供尝试的凭据,请重定向到自定义登录页面,让用户填写其凭据并重试。
  4. 如果您必须从 web.xml 中删除安全约束,请使用另一个过滤器来检查此处的角色以及您可能需要的其他任何内容。

确保重定向到不同的路径,以便这些页面不会再次调用过滤器并循环。(过滤器可以配置为在转发/重定向时跳过,我认为这是默认设置,但如果您必须放弃安全约束,那么您需要确保无论如何都会调用它们。)

您可以在单个过滤器中完成所有这些操作和/或在无法写出适当的响应时进行重定向(有点模拟 servlet 多次向自己 POSTing)。过滤器比 servlet 更适合此目的,因为您可以确定任何访问尝试都会调用它。

另一种方法是将 2) 和 3) 中的所有内容编写为除“真实”应用程序之外的单个 servlet,并在会话未经身份验证且没有正确的“有效许可证”时使用过滤器重定向到它。属性集(您在 servlet 中设置)。这可能会更快并且更容易维护,但耦合不会那么紧密。