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