自从我完成 JASPIC 工作以来,已经过了很长时间了。
我有一个web.xml
看起来像这样的:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<security-constraint>
<web-resource-collection>
<web-resource-name>service-broker-related-resources</web-resource-name>
<url-pattern>/v2/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>emcc</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>Frob Service Broker</realm-name>
</login-config>
<security-role>
<role-name>emcc</role-name>
</security-role>
</web-app>
我还设置并安装了服务器身份验证模块 (SAM)。在我的glassfish-web.xml
喜欢中提到过:
<!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN" "http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd">
<glassfish-web-app httpservlet-security-provider="emccSAM">
我的 SAM 工作正常。
事实上,它的效果有点太好了!它正在拦截所有请求,而不仅仅是由<url-pattern>
of标识的请求/v2/*
。这最初让我感到惊讶。
但是当我仔细考虑这一点时,我认为这有一定的意义:SAM 现在负责身份验证,而不是容器,真的。
那么web.xml
现在本质上是无关紧要的吗?
然后我想了更多,很明显它是相关的,因为它的内容也说明了身份验证发生后要做什么,即如果用户通过 SAM 成功验证,现在检查她是否具有emcc
角色。如果她没有,并且大概请求以 开头/v2/
,那么我们将她赶出去。如果她不这样做,并且大概是从其他任何内容开始请求,那么我们就让她进来。
那么,我的 SAM 必须自行有效地决定传入的请求是否值得验证,这是预期的行为吗? 我希望我的 SAM 会“正常”触发,即仅当有人尝试访问需要身份验证的 URI 时,如<security-constraint>
.
可能值得注意的是,唯一起作用的 servlet 是当 JAX-RSApplication
类使用@ApplicationPath("/v2")
.