如何在weblogic应用程序中保护单个URL?

时间:2015-02-27 10:37:27

标签: security weblogic web.xml

更新2: 似乎问题的根源是我只能成功保护应用程序的根目录(例如“/”)。当我尝试保护任何其他网址时,它会给我一个403.不安全的网址没有问题。

原始问题: 我做了这个基本的应用程序,我希望能够有一个安全的页面和一个不安全的页面。每当我尝试访问我的安全页面时(在给出正确的登录数据之后),我目前得到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映射)。

  3. 所以我成功保护了所有页面或者没有任何页面,但我无法保护其中只有一部分。我真的不知道我做错了什么(虽然我确定这是愚蠢的事情)。

    更新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中定义的安全角色分配) 对于这个,当我查看安全领域 - &gt; [领域名称] - &gt;角色和政策 - &gt;领域角色,我看到每个使用该角色的应用程序URL Pattern:/ Role:demorole - &gt;网络模块 - &gt;网址模式和角色

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

    3. <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>
      

1 个答案:

答案 0 :(得分:0)

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

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