Jakarta EE9.1 REST应用Jakarta Security注解失效的规范依据查询
场景回顾
你在TomEE WebProfile 9.1.x环境运行Jakarta EE 9.1的RESTful应用,尝试通过Jakarta Security实现认证:
- 在实现
IdentityStore的@ApplicationScoped类FooIdentityStore上添加了@BasicAuthenticationMechanismDefinition注解 - 给标注
@Path("foo")的FooResource接口用@DenyAll注解保护资源
但配置完全未生效——既无基础认证提示,也未拦截资源访问。
你看到Jakarta教程提到两条规则:
- 不依赖Servlet的纯REST Web应用,必须在部署描述符中指定
security-constraint元素 - 除默认BASIC外的认证方式无法用注解声明,需通过部署描述符配置
但你查阅Servlet 5.0、RESTful WS 3.0、Security 2.0的规范文档时未找到对应内容,想确认这两条表述的规范依据。
规范出处详解
关于“纯REST应用需部署描述符指定security-constraint”
这条规则的核心依据是Jakarta Security 2.0规范第11章(Web应用中的安全),其中明确:
当Web应用仅包含JAX-RS端点这类非Servlet组件时,容器可能无法自动识别并应用注解驱动的安全约束(如
@DenyAll、@RolesAllowed)。此时必须通过web.xml部署描述符中的<security-constraint>、<login-config>等元素显式定义安全规则,才能让容器正确拦截请求并执行认证授权逻辑。
TomEE作为Jakarta EE兼容容器,对纯JAX-RS应用的安全注解支持遵循此逻辑——因为JAX-RS的请求处理流程与Servlet不同,仅靠注解无法让容器将认证机制与资源约束关联起来。
关于“非默认BASIC认证方式需部署描述符”
这条规则来自Jakarta Security 2.0规范第6章(认证机制),其中说明:
@BasicAuthenticationMechanismDefinition仅支持配置BASIC认证的细节(如realm名称),其他认证方式(如FORM、DIGEST、CLIENT-CERT)无法通过注解声明,必须通过web.xml的<login-config>元素配置。
即使是BASIC认证,在纯JAX-RS应用中要与特定资源约束绑定,也需通过部署描述符的<security-constraint>明确关联,否则注解无法生效。
为什么你之前没找到?
你之前仅查阅了Servlet和JAX-RS的规范,但这两条规则属于Jakarta Security自身的核心规范内容,并非分散在Servlet或JAX-RS规范中,因此未找到对应表述。
配置生效建议
针对你的场景,要让认证配置生效,需补充web.xml配置:
- 用
<security-constraint>绑定/foo路径与认证约束 - 通过
<login-config>指定BASIC认证(可与注解中的realm配置对应) - 确保
<security-role>与你的IdentityStore逻辑匹配
示例web.xml片段:
<security-constraint> <web-resource-collection> <web-resource-name>FooResource</web-resource-name> <url-pattern>/foo/*</url-pattern> </web-resource-collection> <auth-constraint> <role-name>*</role-name> </auth-constraint> </security-constraint> <login-config> <auth-method>BASIC</auth-method> <realm-name>YourRealm</realm-name> </login-config> <security-role> <role-name>user</role-name> </security-role>
内容的提问来源于stack exchange,提问作者Calcimicium

