Java 通过Tomcat获取Restlet中的用户主体

Java 通过Tomcat获取Restlet中的用户主体,java,tomcat,restlet,restlet-2.0,Java,Tomcat,Restlet,Restlet 2.0,我在Tomcat上部署了一个web应用程序,它使用Tomcat的表单身份验证。在编写新servlet时,这允许我通过HttpServletRequestgetUserPrincipal查找请求的用户 我想在这个应用程序中使用Restlet,我可以使用Restlet的ServerServlet适配器来实现这一点。但是,在我的资源类中接收新请求时,我似乎不再具有访问用户主体的权限。也就是说,用户prinicpal信息不会从Tomcat传递到Restlet 有没有办法获得主体?您应该将用户主体与Res

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

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


有没有办法获得主体?

您应该将用户主体与Restlet一起使用。事实上,Restlet有自己的基于挑战响应的安全机制。这允许对请求的用户进行身份验证,获取其角色并在ClientInfo用户中进行设置。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;
    }
}
以下是验证器的示例实现:

以下是Enroler的示例实现:

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

User user = getRequest().getClientInfo().getUser();
List<Role> roles = getRequest().getClientInfo().getRoles();
您可以注意到这个机制是在Restlet中打开的,并且可以支持广泛的身份验证oauth2。。。。在REST中使用基于cookie的身份验证并不是一个好方法。也就是说,即使使用Restlet,您也可以使用它

希望它能帮助你,
Thierry

我刚刚通过将信息强制转换到HttpRequest:HttpRequestgetRequest.getHttpCall.getUserPrincipal,发现该信息在请求中可用
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();