【问题标题】:How to secure a single url in a weblogic application?如何保护 weblogic 应用程序中的单个 url?
【发布时间】:2015-04-30 01:02:34
【问题描述】:

更新 2: 问题的根源似乎是我只能成功保护应用程序的根(例如“/”)。当我尝试保护任何其他 url 时,它给了我一个 403。不安全的 url 可以正常工作。

原始问题: 我制作了这个基本应用程序,我希望能够拥有一个安全页面和一个不安全页面。目前,每当我尝试访问我的安全页面时(在提供正确的登录数据后),我都会收到 403。下面我发布了我一直在尝试使用的 web.xml。我可以毫无问题地访问不安全的页面。

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_10" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  <display-name>Login test</display-name>

<!-- Servlet config -->   
  <servlet>
    <servlet-name>AfterLoginServlet</servlet-name> 
    <servlet-class>test.AfterLoginServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>AfterLoginServlet</servlet-name>
    <url-pattern>/secured</url-pattern>
  </servlet-mapping>
  <servlet>
    <servlet-name>UnsecuredServlet</servlet-name> 
    <servlet-class>test.UnsecuredServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>UnsecuredServlet</servlet-name>
    <url-pattern>/unsecured</url-pattern>
  </servlet-mapping>

<!-- Login and security config -->  
  <servlet>
    <servlet-name>Login</servlet-name>
    <servlet-class>test.Login</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>Login</servlet-name>
    <url-pattern>/login</url-pattern>
  </servlet-mapping>

  <security-role>
    <role-name>demorole</role-name>
  </security-role>

  <security-constraint>
    <web-resource-collection>
      <web-resource-name>secured pages</web-resource-name>
      <url-pattern>/secured</url-pattern>
    </web-resource-collection>
    <auth-constraint>
      <role-name>demorole</role-name>
    </auth-constraint>
  </security-constraint>

  <login-config>
    <auth-method>FORM</auth-method>
    <realm-name>MyRealm</realm-name>
    <form-login-config>
      <form-login-page>/login</form-login-page>
      <form-error-page>/error</form-error-page>
    </form-login-config>
  </login-config>

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

</web-app>

我尝试了其他一些选项来确保我的应用程序正常工作。

  1. 完全关闭安全性:这很顺利。

  2. 为所有内容设置安全性:我将security-constraint 调整为将url-pattern 设置为/*。这使我只能访问 /(如果我更改了我的 servlet 映射)。

所以我成功地保护了所有页面或没有保护我的页面,但我无法只保护其中的一部分。我真的不知道我可能做错了什么(尽管我确信这很愚蠢)。

更新 1: 我现在有 2 个工作选项(对于我的简单测试用例): http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 登录测试

<!-- Servlet config -->   
  <servlet>
    <servlet-name>AfterLoginServlet</servlet-name> 
    <servlet-class>test.AfterLoginServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>AfterLoginServlet</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
  <servlet>
    <servlet-name>UnsecuredServlet</servlet-name> 
    <servlet-class>test.UnsecuredServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>UnsecuredServlet</servlet-name>
    <url-pattern>/unsecured</url-pattern>
  </servlet-mapping>

<!-- Login and security config -->  
  <servlet>
    <servlet-name>Login</servlet-name>
    <servlet-class>test.Login</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>Login</servlet-name>
    <url-pattern>/login</url-pattern>
  </servlet-mapping>

  <security-role>
    <role-name>demorole</role-name>
  </security-role>

  <security-constraint>
    <web-resource-collection>
      <web-resource-name>unsecured</web-resource-name>
      <url-pattern>/unsecured</url-pattern>
    </web-resource-collection>
  </security-constraint>

  <security-constraint>
    <web-resource-collection>
      <web-resource-name>secured pages</web-resource-name>
      <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
      <role-name>demorole</role-name>
    </auth-constraint>
  </security-constraint>

  <login-config>
    <auth-method>FORM</auth-method>
    <realm-name>MyRealm</realm-name>
    <form-login-config>
      <form-login-page>/login</form-login-page>
      <form-error-page>/error</form-error-page>
    </form-login-config>
  </login-config>

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

</web-app>

我还可以将 AfterLoginServlet 的 servlet 映射更改为 /*。这仍然适用于 / url,但不适用于其他任何东西......

更新 3:角色

所以我实际上有几个应用程序都遇到同样的问题,安全性必须是 /*。 我已经习惯了可能的角色配置:

  1. 您在此处看到的带有 demorole 的那个(在 web.xml 中定义了角色,在 weblogic.xml 中定义了安全角色分配) 对于这个,当我查看 Security Realms -> [realm name] -> Roles and Policies -> Realm Roles 时,我会看到在 -> Web module -> Url Patterns and RoleURL Pattern:/ Role:demorole 的每个应用程序/p>

  2. 我没有定义角色,我只是在安全约束中使用All(在 web.xml 或 weblogic.xml 中没有额外的定义):

.

<security-constraint>
    <web-resource-collection>
        <web-resource-name>all</web-resource-name>
        <url-pattern>*</url-pattern>
        <http-method>GET</http-method>
    </web-resource-collection>
    <auth-constraint>
        <role-name>All</role-name>
    </auth-constraint>
</security-constraint>

【问题讨论】:

    标签: security weblogic web.xml


    【解决方案1】:

    尝试将其放入 weblogic.xml 文件中:

    <security-role-assignment>
            <role-name>demorole</role-name>
            <externally-defined/>
    </security-role-assignment>
    

    【讨论】:

    • 您好,感谢您的建议。我试过这个,但我仍然得到 403。你还有其他建议吗?我能否提供更多信息来帮助您查明问题?
    • 您要针对哪个存储库进行身份验证?你在哪里定义了降级?
    • 我不确定你的意思。我在 web.xml 中定义了 demorole。我还有安全角色分配,其中包含在 weblogic.xml 中定义的 demorole 的主体名称。我的公司提供了许多为我的域定义的身份验证提供程序(因此是非标准的)。现在,我设法找到了一个有效的配置(请参阅下面的答案),但我真的不知道它为什么有效。所以虽然这解决了我眼前的问题,但我仍然想知道我以前的方法有什么问题。
    • 通过更多测试,我想我已经更准确地指出了问题所在。我用我的发现和有效的配置更新了我的问题。
    • 您在哪里定义了降级中的用户?是在您的 LDAP 存储库中还是您有 WebLogic 角色(安全领域 -> [领域名称] -> 角色和策略 -> 领域角色?
    猜你喜欢
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-05
    相关资源
    最近更新 更多