【发布时间】: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>
我尝试了其他一些选项来确保我的应用程序正常工作。
完全关闭安全性:这很顺利。
为所有内容设置安全性:我将
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:角色
所以我实际上有几个应用程序都遇到同样的问题,安全性必须是 /*。 我已经习惯了可能的角色配置:
您在此处看到的带有 demorole 的那个(在 web.xml 中定义了角色,在 weblogic.xml 中定义了安全角色分配) 对于这个,当我查看 Security Realms -> [realm name] -> Roles and Policies -> Realm Roles 时,我会看到在 -> Web module -> Url Patterns and RoleURL Pattern:/ Role:demorole 的每个应用程序/p>
我没有定义角色,我只是在安全约束中使用
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>
【问题讨论】: