【问题标题】:REST authorization with Jersey and session management带有 Jersey 和会话管理的 REST 授权
【发布时间】:2015-10-05 22:51:35
【问题描述】:

我有一个带有 Jersey 的 RESTful Java 后端。问题是我不知道如何为这些方法实施授权。我的意思是如何检查用户是否有权使用我的 REST API 的给定方法?

当然,如果我查找“Jersey 授权”,我有那些不错的注释,例如@RolesAllowed、@PermitAll 和@DenyAll。但是,这些注释对服务器领域起作用,与服务器用户无关,与您存储在数据库中的应用程序用户无关。

那么为了授权,我该怎么办?我定义了一个过滤器来检查用户是否在我的应用程序中登录?我必须将过滤器应用于需要身份验证的 REST 端点?

这似乎有点“像过去一样”,这就是为什么我要问更好的方法。

【问题讨论】:

    标签: java rest session jersey


    【解决方案1】:

    那么为了授权,我该怎么办?我定义了一个过滤器来检查用户是否登录了我的应用程序?我必须将过滤器应用于需要身份验证的 REST 端点?

    嗯...我猜你不会高兴,但这基本上是你需要做的。

    一些代码建议;

    public class Application extends ResourceConfig {
    
        public Application() {
            super();
            register(RolesAllowedDynamicFeature.class);  // this is for @RolesAllowed 
            register(AuthenticationRequestFilter.class); // your auth filter
        }    
    }
    

    然后,对于基本身份验证,我会这样做:

    @PreMatching
    public class AuthenticationRequestFilter implements ContainerRequestFilter {
    
    @Override
    public void filter(ContainerRequestContext request) throws IOException {
        String authorization = request.getHeaderString("Authorization"); // get BasicAuth header
    
        if (StringUtils.isNotEmpty(authorization) && StringUtils.startsWith(authorization, "Basic")) {
            ... do the password check... you have base64 encrypted string here
    
            request.setSecurityContext(new SecurityContext(){
                                                ...implementation... 
            });
        }}}
    

    不过,大部分工作需要你自己完成。


    编辑 要使@RolesAllowed 正常工作,您需要在身份验证过滤器中设置SecurityContext。如果用户通过身份验证,您需要设置适当的上下文(就像我在上面的代码片段中所做的那样)。

    此上下文实际上允许您使用其方法执行任何您喜欢检查角色、用户名等的逻辑;例如我的实现是:

    public class AuthorizedContext implements SecurityContext {
    
        private final InternalUserBean user;
    
        public AuthorizedContext(InternalUserBean user) {
            this.user = user;
        }
    
        @Override
        public Principal getUserPrincipal() {
            return () -> getUser().getUsername();
        }
    
        @Override
        public boolean isUserInRole(String s) {
            // this does the proper check for @RolesAllowed annotation.
            return StringUtils.equals(s, getUser().getRole()); 
        }
    
        @Override
        public boolean isSecure() {
            return false;
        }
    
        @Override
        public String getAuthenticationScheme() {
            return "YourRealmName";
        }
    
        public InternalUserBean getUser() {
            return user;
        }
    }
    

    【讨论】:

    • 我不明白你的代码建议。正如我在最初的问题中所说,@RolesAllowed 注释对服务器领域的用户有用,而不是存储在数据库中的应用程序用户。对于过滤器,我必须实现一个过滤器来检查用户是否被授权,身份验证本身是通过给定的 REST 端点进行的。
    • @ernirulez 我认为您在这里误解了服务器领域。您可以根据需要进行身份验证,我给您提供了 BasicAuth 的示例,但是始终需要您自己设置 SecurityContext。另请参阅编辑。
    【解决方案2】:

    在阅读了很多之后,我在这里找到了一个非常好的(而且很酷的解决方案):

    Jersey Request Filter only on certain URI

    因此,为了仅检查那些使用您的自定义注释注释的方法的授权(您的授权 ContainerRequestFilter 仅过滤您的 REST API 的注释方法)。我把它命名为@AuthorizationRequired

    【讨论】:

      猜你喜欢
      • 2020-04-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-22
      • 2011-01-29
      • 1970-01-01
      • 2011-09-11
      • 2014-04-18
      • 1970-01-01
      相关资源
      最近更新 更多