有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用JAAS从webapp1登录到webapp2

我有两个java WebApp,它们运行在同一台jboss服务器上,但在不同的域中:

两个网站的所有内容都使用JAAS loginmodule进行保护。我现在想在app1中创建一个按钮,以转到app2上的页面。正如预测的那样,我是由app2的loginscreen呈现的。我可以成功登录

然而,两个网络应用上的用户实际上是相同的。这意味着对app1有效的用户名/密码在app2上也有效。我想编写一些程序来绕过冗余的安全检查。如果app1想从app2访问页面,我想通过某种方式将j_用户名和j_密码传递给app2,这样app2就可以立即执行安全检查。如果我必须创建额外的控制器或jsp,并在这个过程中使用重定向,这不是问题。如何直接传递j_用户名和j_密码,使登录屏幕不再显示,但仍会执行安全检查


共 (1) 个答案

  1. # 1 楼答案

    您需要的是使用JAAS实现Single sign-on (SSO)Here你可以找到一个使用LDAP作为登录模块的教程,但你会明白这一点

    因为已经配置了JAAS部分,所以只需要关注从page 3开始描述的SSO部分。基本上,我们的想法是配置其中一个模块,使用useSharedState=true与另一个应用程序共享状态

    LoginModule中,您将使用以下内容:

    public boolean login() throws LoginException{
      // ...
      String username = null;
      String password = null;
      // check if useSharedState is true, if it is true, use the 
      // username/password from shared state.
      if ("true".equalsIgnoreCase(option_.get("useShardState"))) {
        username = (String)sharedStateMap_.get("javax.security.auth.login.name");
        password = (String)sharedStateMap_.get("javax.security.auth.login.password");
      } else {
        // get the username and password from the CallbackHandler
        Callback [] callbacks = {new NamePasswordCallback()};
        handler_.handle(callbacks);
        username = callback.getUserId();                
        password = callback.getPassword();
        //save the username and password into the shared state
        sharedStateMap.put("javax.security.auth.login.name",username);
        sharedStateMap.put("javax.security.auth.login.password",password);
      }
      // ... communicates with data store to authenticate this user     
    }
    

    因为在你的另一个问题中,你提到你正在使用JBoss,因为JBoss版本5.0,你可以使用:

    <Valve className="org.apache.catalina.authenticator.SingleSignOn" debug="0"></Valve>
    

    如果您使用的是WebAuthentication类,那么它将自动为您处理SSO