- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我希望向客户端提供休息 API 调用(通过普通 Jersey ,而不是 spring),以根据他们在 header 中发送的 JWT 返回特定用户允许的所有端点的列表。我在 stackoverflow(感谢贡献者!)示例代码中找到了获取所有端点的示例代码,无论角色如何,但不是基于角色的子集。我也找到了如何获取每个方法的注释,但希望避免重新发明“if @PermitAll 而不是 @DenyAll,或 RolesAllowed 中的角色等......”的轮子。
Jersey 2.0 是否有一个我可以调用的方法,该方法将在给定 SecurityContext 和 url 端点或方法的情况下解析为 true/false?
boolean allowed = isMethodAllowed(SecurityContext ctx, String url);
或者
boolean allowed = isMethodAllowed(SecurityContext ctx, 类方法);
最佳答案
感谢这篇文章:Listing all deployed rest endpoints (spring-boot, jersey)
特别是 Johanne Jander 的帖子(谢谢!),我想出了下面的代码,它似乎适用于我的情况,一个简单的 Jersey 用例。在此提供,以防对其他人有用。
@Path("/v1/userinterface")
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public class MyUI extends MyRestApi {
private final static Logger log = LoggerFactory.getLogger(MyUI.class);
@Context
private Configuration configuration;
@Context
private SecurityContext security;
@Path("/allowedendpoints")
@GET
@Operation(summary = "List API access points allowed for the currently authenticated user", tags = {
"ui" }, description = "Returns a list of urls", responses = {})
public Response showAll(@Context UriInfo ui) {
log.debug("Get list of all allowed endpoints for user: " + security.getUserPrincipal().getName());
HashMap<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>();
for (Class<?> c : configuration.getClasses()) {
// Since all of my endpoint classes extend MyRestApi,
// only scan them, not all classes
if (MyRestApi.class.isAssignableFrom(c)) {
scanClass(c, map);
}
}
return Response.ok().entity(map).build();
}
public void scanClass(Class<?> baseClass, HashMap<String, ArrayList<String>> map) {
Builder builder = Resource.builder(baseClass);
if (null != builder) {
Resource resource = builder.build();
String uriPrefix = "";
process(uriPrefix, resource, map);
}
}
private void process(String uriPrefix, Resource resource, HashMap<String, ArrayList<String>> map) {
// recursive method
String pathPrefix = uriPrefix;
List<Resource> resources = new ArrayList<>();
resources.addAll(resource.getChildResources());
if (resource.getPath() != null) {
pathPrefix = (pathPrefix + "/" + resource.getPath()).replaceAll("//", "/");
}
for (ResourceMethod method : resource.getAllMethods()) {
if (method.getType().equals(ResourceMethod.JaxrsType.SUB_RESOURCE_LOCATOR)) {
resources.add(Resource
.from(resource.getResourceLocator().getInvocable().getDefinitionMethod().getReturnType()));
} else {
if (isPathAllowed(security, method.getInvocable().getDefinitionMethod())) {
if (map.containsKey(pathPrefix))
map.get(pathPrefix).add(method.getHttpMethod());
else
map.put(pathPrefix, new ArrayList<String>(Arrays.asList(method.getHttpMethod())));
}
}
}
for (Resource childResource : resources) {
process(pathPrefix, childResource, map);
}
}
public boolean isPathAllowed(SecurityContext ctx, Method method) {
// @DenyAll on the method takes precedence over @RolesAllowed and @PermitAll
if (method.isAnnotationPresent(DenyAll.class)) {
return (false);
}
// @RolesAllowed on the method takes precedence over @PermitAll
RolesAllowed rolesAllowed = method.getAnnotation(RolesAllowed.class);
if (rolesAllowed != null) {
return (hasRole(ctx, rolesAllowed.value()));
}
// @PermitAll on the method takes precedence over @RolesAllowed on the class
if (method.isAnnotationPresent(PermitAll.class)) {
return (true);
}
// @DenyAll can't be attached to classes
// @RolesAllowed on the class takes precedence over @PermitAll on the class
rolesAllowed = method.getDeclaringClass().getAnnotation(RolesAllowed.class);
if (rolesAllowed != null) {
return (hasRole(ctx, rolesAllowed.value()));
}
// @PermitAll on the class
if (method.getDeclaringClass().isAnnotationPresent(PermitAll.class)) {
return (true);
}
return (false); // default
}
private boolean hasRole(SecurityContext ctx, String[] rolesAllowed) {
for (final String role : rolesAllowed) {
if (ctx.isUserInRole(role)) {
return (true);
}
}
return (false);
}
它根据带有 @DenyAll、@PermitAll 和 @RolesAllowed 注释的 SecurityContext 标记返回当前经过身份验证的用户有权访问的端点。
完全公开,我的应用程序很简单,在端点处只有基本的类和方法注释。 ymmv。
示例输出:
{
"/v1/resources" : [
"POST",
"GET"
],
"/v1/resources/{id}" : [
"DELETE",
"GET"
]
}
关于java - 有没有办法根据用户的角色和@RolesAllowed 获取用户有权访问的所有 Jersey 网址的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55882717/
我正在开发一个项目,该项目具有用 @RolesAllowed 注释的服务。我知道这个注释定义了可以访问该方法的角色。但我不确定这些角色是在哪里定义的以及如何为不同的角色添加用户。我使用 weblogi
我必须将方法的访问限制为仅具有特定角色的用户。IdentityManager 已正确构建。 我有这个 Controller 类。 @Named @RequestScoped @LoggedIn pub
我目前正在Tomcat 7中使用Jersey 2.5.1创建后端服务器。为了安全起见,我使用了@RolesAllowed,@PermitAll等批注,并且创建了自定义的ContainerRequest
在 Spring Boot 应用程序中,仅使用注释,我想实现安全性 我已将 @EnableGlobalMethodSecurity(jsr360Enabled=true) 添加到配置类。该类还有一个
我的数据库中有两个表格。用户和 user_role。 CREATE TABLE `user` ( `username` varchar(50) NOT NULL, `password` var
TLDR我开发的Java Web应用程序需要在REST服务上实现用户区分。我知道有一些注释(@RolesAllowed、@PermitAll、@DenyAll)可以描述哪个角色可以使用该服务。我的问题
我正在使用 keycloak,我已经创建了一个 dropwizard 服务,我想开始在其中执行角色。 我试过使用@RolesAllowd("user") 注释,但它总是返回 403。 我也试过@Per
我有一个名为和 SessionScoped 的 JSF Controller ,如下所示 import javax.inject.Named; import javax.enterprise.cont
我在设置安全 REST 服务时遇到一些问题。我想创建一个简单的登录/注销服务并使用它。 我正在关注本教程。我跳过了登录表单的部分,并将用户名和密码硬编码到服务中。 (登录()) http://www.
我正在使用 JAX-RS 和 Jersey 实现。我正在尝试使用 Tomcat 6 使用 BASIC 身份验证来验证我的服务。 这是代码: @Path("/authenticate") @RolesA
我正在使用 Spring @RolesAllowed 来保护我的 API(方法),但我想更改未经授权的用户调用方法时发生的情况。当前的行为是 Spring 抛出 HTTP 403 错误。这很棒,但我只
我正在使用 App Engine 和 Jersey 构建应用程序。我想使用允许在请求中创建过滤器的注释 @RolesAllowed(Role_user)。 问题是我们需要配置类SecurityCont
我要问的问题有点棘手,我还没有找到任何答案。也许是因为我在寻找错误的东西。但我希望你能在这方面帮助我。 我用了following tutorial实现使用 token 而不是基本用户/密码身份验证的自
我希望向客户端提供休息 API 调用(通过普通 Jersey ,而不是 spring),以根据他们在 header 中发送的 JWT 返回特定用户允许的所有端点的列表。我在 stackoverflow
我有一个基本的 SpringBoot 应用程序。使用 Spring Initializer、嵌入式 Tomcat、Thymeleaf 模板引擎,并将其打包为可执行的 JAR 文件。 @Configur
我在我的应用程序中使用角色授权,如下所示, **@RolesAllowed("Admin")** public class ExampleResource { // @GET @Produce
我想将 Jersey 的 DeclarativeLinking 特性与其 RolesAllowed 特性结合起来。 我能够成功地将链接注入(inject)到响应中,但该注入(inject)并未关注该端
我有一个简单的 jersey 2.4 资源: @RolesAllowed("admin") public List list(){} 我还有一个设置自定义安全上下文的 ContainerRequest
我正在尝试根据我通过 Jersey/JAX-RS 公开的资源的角色设置身份验证。此资源存在于 Glassfish 实例中,其中基于角色的身份验证(具体而言,通过 @RolesAllowed)当前正在按
我们正在通过 postman 休息客户端测试在 Jersey 开发的 REST 网络服务。它是一个 POST 方法,用 @RolesAllowed 注释。该方法完整注解如下: @POST @Path(
我是一名优秀的程序员,十分优秀!