簡體   English   中英

Jersey REST-Servlet 中的角色允許注釋不起作用

[英]RolesAllowed Annotation in Jersey REST-Servlet not working

我有一個使用 Jersey3、Tomcat 10 和來自 Tomcat 的 DataSourceRealm 進行身份驗證的網絡應用程序。

運行 Servlet 可以順利運行,但授權似乎沒有發生,因為每個經過身份驗證的用戶都可以訪問資源,即使方法使用@RolesAllowed注釋

我的controller看起來像這樣:

@Path("/dataset")
public class DatasetController {

    @RolesAllowed({"1, 3"})
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Response getAllEntries(@DefaultValue("1") @QueryParam("state") int state) 

web.xml看起來像這樣:

  <!-- URL-Mappings -->
    <servlet-mapping>
        <servlet-name>Hello Word</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>Entries REST Endpoint</servlet-name>
        <url-pattern>/api/*</url-pattern>
    </servlet-mapping>

    <!-- Security Roles -->
    <security-role>
        <role-name>1</role-name>
    </security-role>
    <security-role>
        <role-name>2</role-name>
    </security-role>
    <security-role>
        <role-name>3</role-name>
    </security-role>

    <!-- Login Config -->
    <login-config>
        <auth-method>BASIC</auth-method>
    </login-config>

    <!-- Security Constraints-->
    <security-constraint>
        <web-resource-collection>
            <web-resource-name>REST Endpoint</web-resource-name>
            <url-pattern>/api/*</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <role-name>1</role-name>
            <role-name>2</role-name>
            <role-name>3</role-name>
        </auth-constraint>
    </security-constraint>

我在調試時檢查了 SecurityContext,經過身份驗證的用戶獲得了正確的角色,例如sc.isUserInRole("1/2/3")表明身份驗證工作正常。 角色必須被稱為 1,2,3 但這似乎不是問題。

我錯過了什么? 感謝您的任何意見!

因此,您可以使用兩種不同的授權機制:一種由 Servlet 容器提供,一種由 Jersey 提供。 使用 Servlet 容器提供的服務,您可以在 web.xml 中配置所有角色和安全性。 使用 Servlet 容器授權時,所有@RolesAllowed注解都不起作用。

然后你有 Jersey 授權。 使用 Jersey,它將從 Servlet 容器身份驗證中獲取經過身份驗證的用戶,並根據@RolesAllowed注解進行授權。 如果您想使用 Jersey 授權,您只需注冊RolesAllowedDynamicFeature

要使用 Jersey 的授權,首先刪除您在 web.xml 中的所有授權配置。 然后,如果您使用ResourceConfig進行應用配置,只需使用以下內容注冊該功能。

register(RolesAllowedDynamicFeature.class);

如果您使用 web.xml 進行應用程序配置,請使用以下 init-param

<init-param>
  <param-name>jersey.config.server.provider.classnames</param-name>
  <param-value>org.glassfish.jersey.server.filter.RolesAllowedDynamicFeature</param-value>
</init-param>

這幾乎就是讓授權生效。

對於看到這篇文章的其他人,請記住 OP 正在使用 Servlet 容器身份驗證 如果您這樣做,那么您需要做的就是注冊RolesAllowedDynamicFeature以獲得授權。 如果你不使用 Servlet 容器身份驗證,那么你需要實現你自己的身份驗證過濾器,你需要在其中進行身份驗證,然后設置 SecurityContext。 看看這篇文章了解更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM