Java webapp的多个login-config

时间:2011-05-27 09:40:59

标签: java web-applications login

我有一个Java Web应用程序,它有一个用于用户交互的网站。要对用户进行身份验证,我通过web.xml配置了应用程序以使用基于FORM的身份验证。用户被转发到登录页面,到目前为止一切正常。

现在我们正在为这个通过RESTful Web服务访问应用程序的Web应用程序开发桌面客户端(在C#中)。我在与网站相同的Web应用程序中实现了这些服务,当然也应该对Web服务的调用者进行身份验证。但现在我面临的问题是,无论何时我调用Web服务,服务器都会返回登录页面的HTML作为响应。

我认为能够为我的REST服务servlet(可能会使用BASIC身份验证)使用另一个login-config会很酷。

谷歌并没有带来多少,但我无法相信我是第一个处于这种状况的人。所以我想听听你的想法和解决方案。

任何提示都表示赞赏。

5 个答案:

答案 0 :(得分:6)

唯一的解决方案是为两个具有不同登录机制的客户端提供两个应用程序。应该将应用程序代码分开并将其移动到这些应用程序的常用应用程序并转发请求。

否则,请使用自定义身份验证。

答案 1 :(得分:4)

我遇到了同样的问题,但找不到解决方案。 您可以定义多种身份验证方法: http://docs.oracle.com/cd/E24329_01/web.1211/e24485/thin_client.htm#SCPRG164 但: 不幸的是,FORM和BASIC都不能一起存在于auth-method值列表中。

答案 2 :(得分:4)

我用tomcat阀解决了这个问题。阀检查是否存在Authorization标头,在这种情况下,标头用作验证用户的凭据,否则将执行正常的验证方法。

以下是Valve的代码:

    private void createMap(){
    List<Integer> state_action_pair = new ArrayList<Integer>();
    for(int i=0;i<this.stateActionTable.length;i++){
        for(int j=0;j<this.stateActionTable[0].length;j++){
            state_action_pair.add(this.stateActionTable[i][j]);
        }
        this.stateActionMap.put(state_action_pair, i);
        state_action_pair.clear();
    }
}

您可以通过添加&lt; Valve&gt;来使用阀门。标记在tomcat安装的server.xml文件中,或者在WebApp的META-INF / context.xml文件中:

该项目位于github:https://github.com/robbyn/mydsrealm

答案 3 :(得分:1)

不幸的是,login-config没有像过滤器和servlet那样映射,所以webapp只有一个全局。这意味着您需要2个webapps,或者如果在JBoss上,您可以使用WebAuthentication类通知容器您的应用程序的程序登录。但是,如果您使用的是嵌入式jetty或其他Web服务器,则绝对无法使用web.xml同时支持BASIC和FORM。您必须编写自定义身份验证服务

但是,您可以转换为Apache Shiro,它将以一种精心编写的简单设计解决这些问题。这些步骤将允许REST客户端在没有会话cookie的每个页面上使用BASIC auth,或者在/ rest / login登录并接收会话。然后,浏览器客户端可以使用FORM auth

1) protect /login with "authc", set shiro.loginUrl to /login and host an HTML form at that location
2) protect /rest/login with "anon" and write a URL handler for POST with this code
    UsernamePasswordToken token = new UsernamePasswordToken(userName, password);
    token.setRememberMe(rememberMe);
    SecurityUtils.getSubject().login(token);
3) protect /rest/logout with "logout"
4) protect /rest/** with "noSessionCreation, authcBasic, rest"

答案 4 :(得分:0)

我帮助https://wiki.apache.org/tomcat/SSLWithFORMFallback与此tomcat valve结合使用,以允许SSL客户端证书和表单以及基本后备身份验证。

祝你好运