当前位置: 首页 > 知识库问答 >
问题:

使用JAAS从webapp1登录到webapp2

申屠俊发
2023-03-14

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

  • 主机:端口 1/上下文 1/
  • 主机:端口 2/上下文 2/

两个网站的所有内容都通过使用JAAS登录模块进行保护。我现在想在app1中创建一个按钮,以转到app2上的页面。正如预测的那样,我会看到app2的登录屏幕。我可以成功登录

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

共有2个答案

金令秋
2023-03-14

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

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

对于一个J2EE容器内的单点登录来说,这应该足够了。

它直接在JavaEE规范中指定:

EE.3.3.8.2 Web单点登录

......仅当跨越安全策略域边界时,才要求对用户进行重新身份验证............

编辑

经过一番探索,我发现在Wildfly中SSO是默认禁用的。在Wildfly中启用SSO:

>

  • 修改standalone。xml并添加

       <jboss-web>
            <security-domain>sso</security-domain>
               <valve>
                  <class-name>org.apache.catalina.authenticator.SingleSignOn</class-name>
               </valve>
       </jboss-web>
    

    在此之后,野蝇将使用特殊的cookie JSESIONIDSSO用于SSO

  • 浦毅
    2023-03-14

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

    由于您已经配置了< code>JAAS部分,因此您只需关注从第3页开始描述的< code>SSO部分。基本上,这个想法是配置一个模块,使用< code>useSharedState=true与另一个应用程序共享状态。

    在您的< code>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

     类似资料:
    • 我正在使用JAAS对访问我的web应用程序的受保护区域的用户进行身份验证。登录页面如下所示: 我的web-xml如下所示: 我的jaas配置如下所示: 因此,当我在contextPath/protected/test.xhtml这样的受保护区域中打开一个页面时,我会看到带有登录表单的login.xhtml。点击submit按钮后,用户将得到身份验证,但不是转发/重定向到最初请求的页面,而是重定向到

    • 尝试按照配置文档使用JAAS向hawtio添加身份验证 通过使用jetty的demo base test jaas war来配置基本jaas/jetty登录,并能够进行身份验证/授权。 通过阅读文档,我试图将同样的概念融入hawtio,但我确信它甚至没有触及ldap,因为当我在演示战中尝试这一点时,我会得到类似的日志 我决定暂时忽略授权,尝试使用ldap进行身份验证。如果有人对我如何进一步调试这个

    • 有人可以使用jaas登录模块吗。我在看医生 我想是这些登录模块可以1.与OS用户进行身份验证2.提供该用户的组。 基本上我想通过操作系统进行身份验证。输入用户名和密码 我想用windows进行身份验证 我不想做LDAP认证只做os认证。 对于windows,有华夫饼干库可用。但我无法在使用64位机器时进行身份验证。在32位上运行良好。 对于linux,有jpam,但它不提供组。它只会检查用户名、密

    • 我正在尝试开发一个定制的JAAS登录模块,它使用一个令牌并从不同的来源获取用户数据。它应该作为wildfly 8.2.1 final的身份验证领域。我有一个测试servlet,我想在其中进行身份验证,以便检查注入EJB的允许角色。 这个网站的测试:http://www.radcortez.com/custom-principal-and-loginmodule-for-wildfly/事实上,我甚

    • 使用基于表单的JAAS、MySQL、Apache TomEE、JSP、Servlet 我知道如何配置基于表单的JAAS,当用户试图访问安全页面时,自动将用户重定向到登录页面。基本上,我已经为TomEE和MySQL配置了JDBC领域(在文件中),在中,我已经声明了、和。 然后,有以下登录表单: 而且,这对于在web.xml中的标记中声明的页面很好。 但是,我想有明确的访问一个页面,用户可以登录。那么

    • 我有一个使用SpringMVC的Java网络应用程序。该 Web 应用程序在 jboss AS7.1 服务器上运行,该服务器使用带有表单认证的 JAAS 登录模块。当用户在表单上填写其用户名和密码时,登录工作顺利。 我现在想创建一个java控制器,它“将用户登录”,就好像用户填写了日志通知一样。 当上述方法完成时,应允许对任何安全页面的任何访问,因为用户被视为已登录。 可以通过访问Jboss的lo