我有两个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以便不再显示登录屏幕,但仍然执行安全检查?
答案 0 :(得分:4)
您需要使用Single sign-on (SSO)
来实施JAAS
。 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
。
答案 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:
standalone.xml
并在<single-sign-on path="/"/>
代码<host>
添加jboss-web.xml(sso - 您的安全域)
<jboss-web>
<security-domain>sso</security-domain>
<valve>
<class-name>org.apache.catalina.authenticator.SingleSignOn</class-name>
</valve>
</jboss-web>
此Wildfly将使用特殊cookie JSESSIONIDSSO进行SSO