我在Tomcat上部署了一个Web应用程序,它使用Tomcat的表单身份验证。在编写新的servlet时,这允许我通过HttpServletRequest#getUserPrincipal
找到请求的用户。
我想在这个应用程序中使用Restlet,我可以使用Restlet的ServerServlet
适配器。但是,在我的资源类中接收新请求时,我似乎无法再访问用户主体。也就是说,用户的主要信息不会从Tomcat传递到Restlet。
有没有办法获得校长?
答案 0 :(得分:0)
您应该将用户主体与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也可以使用它。
希望它可以帮到你, 亨利