Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用JAAS从webapp1登录到webapp2_Java_Jaas - Fatal编程技术网

Java 使用JAAS从webapp1登录到webapp2

Java 使用JAAS从webapp1登录到webapp2,java,jaas,Java,Jaas,我有两个java WebApp,它们运行在同一jboss服务器上,但位于不同的域中: 两个网站的所有内容都使用JAAS loginmodule进行保护。我现在想在app1中创建一个按钮,以转到app2上的页面。正如预测的那样,我是由app2的loginscreen呈现的。我可以成功登录 然而,两个webapp上的用户实际上是相同的。这意味着对app1有效的用户名/密码在app2上也有效。我想通过编程绕过冗余安全检查。如果App1想从app2访问页面,我想通过某种方式将j_用户名和j_密码

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

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


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

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

由于您已经配置了
JAAS
部分,因此只需关注从开始描述的
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版本
5.0
,你可以使用:

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


如果您正在使用该类,这将为您自动处理
SSO

JAAS登录适用于安全域,而不是webapp。所以您应该将两个应用程序放在一个安全域中。它是web.xml中的登录配置部分:

   <login-config>
        <auth-method>FORM</auth-method>
        <realm-name>ApplicationRealm</realm-name>
       <form-login-config> ...............</form-login-config>
   </login-config>

在此之后,Wildfly将为SSO使用特殊的cookie JSESSIONIDSSO

如何为同一jboss提供不同的端口1和端口2?它是一个Jboss实例,端口1==port2吗?它是一台服务器(机器),具有Jboss域设置。因此,存在多个实例/服务器组。第二个组具有端口偏移量。WebAuthentication类在JBOSS 7中不再可用。我不知道为什么它被移除了。这个类还有其他选择吗?您链接到的示例假设两个webapp都在同一个服务器实例上运行。我实际上在域模式下使用JBOSS,在同一台物理“服务器机器”上有两个服务器实例。可以跨多个实例实现单点登录吗?@user1884155 Yes
SSO
可以跨物理机器工作。@user1884155 In
JBoss 7
中有一个等价类,名为:
Servlet3AuthenticationFilter
,这是使用Servlet 3的规范。如何在其他服务器实例上填充sharedstate映射?您的浏览器在登录website1后访问website2时发出的请求中是否嵌入了某些请求属性或cookie,jboss会检测到这一点以填充sharedmap?目前,我们的web.xml中没有配置域名。如果不输入域名,默认值是什么?你是说如果我给两个网站一个随机的realmname(例如:realmXYZ),我将激活某种秘密的“单点登录”模式,而不需要任何进一步的配置?我的两个Web应用使用相同的安全域。也就是说,在我的JBoss domain.xml文件中,我有一个secuerity域“xyz”,在每个webapp的JBoss-app.xml文件中,我将它们链接到这个安全域。我没有在任何地方设置域名。域名称和安全域之间的区别/层次结构是什么?安全策略域==域使用独立设置或域设置(一个jboss中有多个服务器实例)是否重要?如果两个应用的域名相同,我看不到任何变化。
   <jboss-web>
        <security-domain>sso</security-domain>
           <valve>
              <class-name>org.apache.catalina.authenticator.SingleSignOn</class-name>
           </valve>
   </jboss-web>