使用角色进行安全保护注释不起作用(Jersey)



尽管我以前在这里找到了很多问题的答案,但我还是新来的。

现在我正在寻找这方面的帮助:我在我的小REST API上有这个小示例资源:

@Path("/greeting")
@PermitAll
public class HelloResource {
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    @Path("all")
    public String sayHelloToAll() {
        return "Hello, everybody!";
    }
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    @RolesAllowed("admin")
    @Path("admin")
    public String sayHelloToAdmin() {
        return "Hello, admin!";
    }
}

为了过滤角色,我实现了SecurityContext:

public class Authorizer implements SecurityContext {
    @Override
    public String getAuthenticationScheme() {
        return null;
    }
    @Override
    public Principal getUserPrincipal() {
        return null;
    }
    @Override
    public boolean isSecure() {
        return false;
    }
    @Override
    public boolean isUserInRole(String role) {
        return true;
    }
}

ContainerRequestFilter:的实现

@Provider
@Priority(Priorities.AUTHENTICATION)
public class AuthorizationFilter implements ContainerRequestFilter {
    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException {
        requestContext.setSecurityContext(new Authorizer());
    }
}

这是我的应用程序类:

@ApplicationPath("/")
public class Application extends ResourceConfig {
    public Application() {
        super(HelloResource.class);
        register(AuthorizationFilter.class);
        register(RolesAllowedDynamicFeature.class);        
    }
}

有了这些,当我请求URI greeting/all时,一切都很好,会显示字符串"Hello,大家好!"。但是,当我请求URI问候语/admin时,即使我的isUserInRole方法总是返回true,也永远不会调用该URI问候语/admin,当管理员角色的用户请求它时,应该调用该URI。事实上,我的filter方法总是被调用,但我的isUserInRole方法从未被调用。

我听从了很多建议:

SecurityContext没有';不使用@RolesAllowed

使用角色授权AllowedDynamicFeature和Jersey

如何访问由@RolesAllowed 保护的泽西岛资源

使用JAX-RS和Jersey 进行基于REST令牌的身份验证的最佳实践

但它似乎对任何东西都不起作用。

有人能帮我吗?我不知道是不是有什么东西我错过了

提前谢谢大家。

编辑:当我请求URI问候语/admin时,顺便说一句,我得到了403 Forbiden(我忘了这么说)

查看RoleAllowedRequestFilter的源代码。当用户通过身份验证时,预期存在关联的Principal。过滤器在这里检查

if (rolesAllowed.length > 0 && !isAuthenticated(requestContext)) {
    throw new ForbiddenException(LocalizationMessages.USER_NOT_AUTHORIZED());
}
...
private static boolean isAuthenticated(final ContainerRequestContext requestContext) {
    return requestContext.getSecurityContext().getUserPrincipal() != null;
}

因此,您需要在SecurityContextgetUserPrincipal中返回一个Principal

@Override
public Principal getUserPrincipal() {
    return new Principal() {
        @Override
        public String getName() {
            return "Some Name";
        }
    };
}

最新更新