栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

定制JAX-RS授权-在每个请求中使用JWT

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

定制JAX-RS授权-在每个请求中使用JWT

您可以在中执行此逻辑

ContainerRequestFilter
。在这里处理自定义安全功能非常普遍。

要考虑的一些事情

  1. 该类应带有注释,

    @Priority(Priorities.AUTHENTICATION)
    以便在其他过滤器(如果有)之前执行。

  2. 您应该

    SecurityContext
    在过滤器中使用。我要做的是实现一个
    SecurityContext
    。您可以根据需要真正实现它。

这是一个没有任何安全逻辑的简单示例

@Provider@Priority(Priorities.AUTHENTICATION)public class SecurityFilter implements ContainerRequestFilter {    @Override    public void filter(ContainerRequestContext requestContext) throws IOException {        SecurityContext originalContext = requestContext.getSecurityContext();        Set<String> roles = new HashSet<>();        roles.add("ADMIN");        Authorizer authorizer = new Authorizer(roles, "admin",    originalContext.isSecure());        requestContext.setSecurityContext(authorizer);    }    public static class Authorizer implements SecurityContext {        Set<String> roles;        String username;        boolean isSecure;        public Authorizer(Set<String> roles, final String username,  boolean isSecure) { this.roles = roles; this.username = username; this.isSecure = isSecure;        }        @Override        public Principal getUserPrincipal() { return new User(username);        }        @Override        public boolean isUserInRole(String role) { return roles.contains(role);        }        @Override        public boolean isSecure() { return isSecure;        }        @Override        public String getAuthenticationScheme() { return "Your Scheme";        }     }    public static class User implements Principal {        String name;        public User(String name) { this.name = name;        }        @Override        public String getName() { return name; }       }}

注意事项

  • 我创建了一个
    SecurityContext
  • 我添加了一些角色,并将它们用作
    isUserInRole
    方法。这将用于授权。
  • 我创建了一个
    User
    实现的自定义类
    java.security.Principal
    。我返回了这个自定义对象
  • 最后,我
    SecurityContext
    ContainerRequestContext

怎么办?让我们看一个简单的资源类

@Path("secure")public class SecuredResource {    @GET    @RolesAllowed({"ADMIN"})    public String getUsername(@Context SecurityContext securityContext) {        User user = (User)securityContext.getUserPrincipal();        return user.getName();    }}

注意事项:

  • SecurityContext
    被注入该方法。
  • 我们得到
    Principal
    并将其投射到
    User
    。因此,实际上您可以创建任何实现的类
    Principal
    ,并根据需要使用此对象。
  • 使用
    @RolesAllowed
    注释。对于Jersey,有一个过滤器
    SecurityContext.isUserInRole
    通过传入
    @RolesAllowed
    批注中的每个值来检查,以查看是否允许用户访问资源。

要在Jersey启用此功能,我们需要注册

RolesAllowedDynamicFeature

    @ApplicationPath("/api")public class AppConfig extends ResourceConfig {    public AppConfig() {        packages("packages.to.scan");        register(RolesAllowedDynamicFeature.class);    }}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/483342.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号