【问题标题】:Getting the user principal in Restlet over Tomcat通过 Tomcat 在 Restlet 中获取用户主体
【发布时间】:2014-08-08 12:10:04
【问题描述】:

我在 Tomcat 上部署了一个 Web 应用程序,它使用 Tomcat 的表单身份验证。在编写新的 servlet 时,这允许我通过 HttpServletRequest#getUserPrincipal 找到请求的用户。

我想在这个应用程序中使用 Restlet,我可以使用 Restlet 的 ServerServlet 适配器来实现。但是,在我的资源类中收到新请求时,我似乎不再有权访问用户主体。即用户主体信息不会从Tomcat传递到Restlet。

有什么办法可以得到本金吗?

【问题讨论】:

  • 我刚刚发现请求中的信息可用,方法是将其转换为HttpRequest:((HttpRequest)getRequest()).getHttpCall().getUserPrincipal()

标签: java tomcat restlet restlet-2.0


【解决方案1】:

您应该将用户主体与 Restlet 一起使用。事实上,Restlet 有自己的基于挑战响应的安全机制。这允许对请求的用户进行身份验证,获取其角色并在ClientInfo#user 中设置。 servlet 扩展必须被视为在 servlet 容器中嵌入 Restlet 引擎的适配器,但您不应依赖 servlet API。

这是使用 Restlet 安全性的方法:

public class MyApplication extends Application {
    public Restlet createInboundRoot() {
        Router router = new Router(getContext());
        (...)

        ChallengeAuthenticator ca = new ChallengeAuthenticator(getContext(),
            ChallengeScheme.HTTP_BASIC, "admin");

        Verifier verifier = (...)
        Enroler enroler = new MyEnroler(this);

        ca.setNext(router);
        return ca;
    }
}

这是Verifier的示例实现:

public class MyVerifier extends SecretVerifier {
    @Override
    public boolean verify(String identifier, char[] secret) {
        System.out.println(identifier);
        System.out.println(secret);
        //TODO compare with the Database
        return true;
    }
}

这是Enroler的示例实现:

public class MyEnroler implements Enroler {
    private Application application;

    public MyEnroler(Application application) {
        this.application = application;
    }

    public void enrole(ClientInfo clientInfo) {
        Role role = new Role(application, "roleId",
                        "Role name");
        clientInfo.getRoles().add(role);
    }
}

然后,您可以从过滤器、服务器资源等中的请求访问安全/身份验证提示,如下所述:

User user = getRequest().getClientInfo().getUser();
List<Role> roles = getRequest().getClientInfo().getRoles();

你可以注意到这个机制是在 Restlet 中打开的,并且可以支持多种身份验证(oauth2,...)。在 REST 中使用基于 cookie 的身份验证并不是真正的好方法。也就是说,即使与 Restlet 一起使用,您也可以使用它。

希望对你有帮助 蒂埃里

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-29
    • 2015-02-24
    • 1970-01-01
    • 2014-11-01
    • 2017-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多