Как использовать WAFFLE для единого входа с помощью отдельного Java-клиента
Мы пытаемся использовать WAFFLE для единого входа с помощью отдельного Java-клиента с JAAS. Мы упоминали waffle.jaas.WindowsLoginModule в нашем jaas.conf, но он запрашивает имя пользователя, пароль, который, по нашему мнению, не является идеальным решением для единого входа. Кто-нибудь может подсказать, как этого избежать?
К вашему сведению - мы не используем веб-сервер / сервер приложений.
2 ответа
Я считаю, что для единого входа вам понадобится и сервер, и клиент. Вы можете взглянуть на этот пример, он не использует модуль входа в систему, а базовые классы WindowsSecurityContext, включенные в WAFFLE, для передачи токенов kerberos вперед и назад для получения зарегистрированного пользователя.
Ниже приведены шаги для выполнения единого входа с использованием Waffle для автономного клиента Java без использования сервера.
- Создать учетные данные клиента
- Получите билет службы, используя initializeSecurityContext из WindowsSecurityContextImpl.
- Получите WindowsIdentity, используя accessSecurityContext из WindowsAuthProviderImpl
Исходная ссылка https://exceptionshub.com/getting-kerberos-service-ticket-using-waffle-in-java.html
Для клиент-серверного sso вы должны следовать https://code.dblock.org/2010/04/08/pure-java-waffle.html. В приведенном ниже коде изображен автономный java sso с использованием kerberos.
import com.sun.jna.platform.win32.Sspi;
import waffle.windows.auth.IWindowsCredentialsHandle;
import waffle.windows.auth.IWindowsIdentity;
import waffle.windows.auth.IWindowsSecurityContext;
import waffle.windows.auth.impl.WindowsAccountImpl;
import waffle.windows.auth.impl.WindowsAuthProviderImpl;
import waffle.windows.auth.impl.WindowsCredentialsHandleImpl;
import waffle.windows.auth.impl.WindowsSecurityContextImpl;
public class KerberosSingleSignOn {
public static void main() {
try {
System.out.println(getWindowsIdentity().getFqn());
}
catch (Exception e) {
e.printStackTrace();
}
}
public static IWindowsIdentity getWindowsIdentity() throws Exception {
try {
byte[] kerberosToken = getServiceTicketSSPI();
WindowsAuthProviderImpl provider = new WindowsAuthProviderImpl();
IWindowsSecurityContext securityContext = provider
.acceptSecurityToken("client-connection", kerberosToken, "Kerberos");
return securityContext.getIdentity();
}
catch (Exception e) {
throw new Exception("Failed to process kerberos token");
}
}
public static byte[] getServiceTicketSSPI() throws Exception {
final String securityPackage = "Kerberos";
IWindowsCredentialsHandle clientCredentials = null;
WindowsSecurityContextImpl clientContext = null;
final String currentUser = WindowsAccountImpl.getCurrentUsername();
try {
clientCredentials = WindowsCredentialsHandleImpl.getCurrent(securityPackage);
clientCredentials.initialize();
// initial client security context
clientContext = new WindowsSecurityContextImpl();
clientContext.setCredentialsHandle(clientCredentials.getHandle());
/*OR
clientContext.setCredentialsHandle(clientCredentials);
*/
clientContext.setSecurityPackage(securityPackage);
final Sspi.SecBufferDesc continueToken = null;
do {
System.out.println("Using current username: " + currentUser);
clientContext.initialize(clientContext.getHandle(), continueToken, currentUser);
}
while (clientContext.isContinue());
return clientContext.getToken();
}
catch (Exception e) {
throw new Exception("Failed to process kerberos token");
}
finally {
if (clientContext != null)
clientContext.dispose();
if (clientCredentials != null)
clientCredentials.dispose();
}
}
}
Вместо использования вафли и усложнения. Вы можете легко использовать System.getProperty("user.name") предоставит имя пользователя.