使用JAAS

时间:2015-12-14 12:53:12

标签: java jaas

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

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

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

2 个答案:

答案 0 :(得分:4)

您需要使用Single sign-on (SSO)来实施JAASHere您可以找到使用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

答案 1 :(得分:2)

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

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

在一个J2EE容器内进行单点登录就足够了。

直接在Java EE spec中指定:

EE.3.3.8.2网络单点登录

......只有在跨越安全策略域边界时才需要重新验证用户............

修改

经过一番发现后,我发现Wildfly默认禁用SSO。在Wildfly中启用SSO:

  1. 修改standalone.xml并在<single-sign-on path="/"/>代码
  2. 中添加<host>
  3. 添加jboss-web.xml(sso - 您的安全域)

       <jboss-web>
            <security-domain>sso</security-domain>
               <valve>
                  <class-name>org.apache.catalina.authenticator.SingleSignOn</class-name>
               </valve>
       </jboss-web>
    
  4. 此Wildfly将使用特殊cookie JSESSIONIDSSO进行SSO