2012-06-12 2 views
2

Я знаю, что это должен быть очень простой вопрос, но я новичок в java и затрудняюсь получить точный код, который мне нужен. Что мне нужно сделать, так это получить в настоящее время имя пользователя из Windows и проверить, принадлежит ли этот пользователь к определенной группе пользователей AD, которая должна быть определена в каком-либо файле конфигурации. Это очень легко сделать на C#, но я не знаю, как это сделать в JAVA. Пример кода будет замечательным. В C# я включил бы группу безопасности в App.Config в настройки приложения, тогда я смогу захватить идентификатор Windows текущего пользователя, а затем повторить все группы, к которым принадлежит пользователь, и соответствовать желаемому. Мне нужно сделать то же самое в javaКак проверить, принадлежит ли пользователь определенной группе AD в java

+0

«Мне сложно получить точный код, который мне нужен». К сожалению, это не случайно: интеграция Java с платформой разработки Windows не соответствует уровню интеграции C#. В прошлый раз, когда мне нужно было что-то сделать, мне пришлось перепрыгнуть через все виды обручей с Open LDAP (включая отладку проблемы параллелизма в коде Novell). – dasblinkenlight

ответ

3

Если вы только заботитесь о текущем входе пользователя Windows (т. Е. Ваша программа Java будет работать в Windows) и не против использования JNA, вы можете использовать предоставленную функцию в platform.jar, Advapi32Util#getCurrentUserGroups(), чтобы получить группы, в которых пользователь входит.

Например:

import com.sun.jna.platform.win32.Advapi32Util; 

for (Advapi32Util.Account account : Advapi32Util.getCurrentUserGroups()) { 
    System.out.println(account.fqn); 
} 

Это также имеет преимущество в том, что для Windows кэширует членство пользователей во всех группах (включая группы, содержащие другие группы пользователь является членом), когда пользователь входит в систему.


Требования здесь, кажется, своего рода неспецифическая и это начинает травить в районах, которые, вероятно, не отлично подходит для SO, но я дам ему идти в любом случае.

В конечном счете, когда ваша система будет запущена, определяется, насколько сложной будет установка. Если вы собираетесь работать на сервере под Windows, подключенном к тому же домену, с которым вы аутентифицируете, тогда вы должны посмотреть на Waffle, в котором содержится сервлет, фильтр Spring Security, плагин JAAS и несколько других способов, которыми вы может реализовать интегрированную проверку подлинности Windows, которая использует собственные методы Windows для загрузки идентификаторов Windows и связанных групп Active Directory. Это предоставит вам опыт, наиболее похожий на использование IIS и WIA с помощью приложения .NET framework. Нижняя сторона этого заключается в том, что сервер должен запускаться в системе Windows.

К сожалению, работа в среде, отличной от Windows, потребует дополнительной настройки и конфигурации. Наиболее интегрированным решением является, вероятно, Spring Security, которая имеет a Kerberos extension, способную предоставлять SPNEGO (Windows Integrated Authentication). Ссылка, приведенная выше, содержит сведения (я считаю, что они все еще актуальны) о том, что необходимо для активации фильтра Kerberos. Чтобы получить доступ к информации о группе, вам необходимо изменить значение userDetailsService в примере security.xml. Проще всего сделать здесь, чтобы обеспечить надлежащим образом сконфигурированный LdapUserDetailsService в качестве объекта здесь. Я не все, что испытывал с весной, но похоже, что конфигурация будет чем-то вроде (этого не хватает contextSource).

<bean id="adUserSearch" class="org.springframework.security.ldap.search.FilterBasedLdapUserSearch"> 
    <constructor-arg value="dc=domain,dc=com"/> 
    <constructor-arg value="(sAMAccountName={0})"/> 
    <constructor-arg ref="contextSource" /> 
</bean> 

<bean id="adAuthoritiesPopulator" class="org.springframework.security.ldap.userdetails.DefaultLdapAuthoritiesPopulator"> 
    <constructor-arg ref="contextSource"/> 
    <constructor-arg value="dc=domain,dc=com" /> 
    <property name="groupSearchFilter" value="(member={0})"/> 
    <property name="rolePrefix" value="ROLE_"/> 
    <property name="searchSubtree" value="true"/> 
    <property name="convertToUpperCase" value="true"/> 
</bean> 

<bean id="userDetailsService" class="org.springframework.security.ldap.userdetails.LdapUserDetailsService"> 
    <constructor-arg ref="adUserSearch"/> 
    <constructor-arg ref="adAuthoritiesPopulator"/> 
</bean> 

Это должно предоставить вам аутентифицированный Kerberos пользователь со связанными с ним группами.

Если весенняя безопасность неприемлема, вы можете попробовать перепрограммировать свою собственную версию, используя, возможно, Shiro и the pure-Java SPNEGO filter, но показывая пример, который потребует в основном написания программы.

Надеюсь, это поможет. После того, как вы решите подход, вероятно, уместно обратиться к более конкретным вопросам в виде вопросов типа SO.

+0

Большое вам спасибо. Я это попробую. Этот пакет com.sun.jna.platform.win32.Advapi32Util, он включен уже в стандартную установку Java или мне нужно как-то его установить. Я новичок в Java, так что понятия не имею. – fenix2222

+0

Кроме того, как это будет вести себя на машинах без окон? – fenix2222

+0

@ fenix2222: он не входит в стандартный пакет Java. Это часть JNA (с которой я связан выше). Это не будет работать вообще на компьютерах, отличных от Windows, поскольку он использует API Win32 для фактического поиска (следовательно, мое предостережение в начале ответа). Если вы можете быть немного понятнее о своих требованиях, я рад помочь. – ig0774

1

Вы можете получить все группы без ЮНА, как это:

String groups[] = (new com.sun.security.auth.module.NTSystem()).getGroupIDs(); 

Очевидно, что это будет работать только на Windows, и даже на Windows, является использование com.sun * пакеты поощряться.. См. this для объяснения результата.

0

Это можно сделать с помощью API Java SE без непосредственного использования пакетов com.sun. *. Для доступа к этой информации используйте Java Authentication and Authorization Service (JAAS) (javax.security.auth. * И javax.security.auth.login. *). Создание JAAS config file с помощью следующей записи:

sampleApp { 
    com.sun.security.auth.module.NTLoginModule required debug=false; 
}; 

Сохранить эту запись как sampleapp_jaas.config. Затем установите системное свойство, чтобы Java искал файл конфигурации.

-Djava.security.auth.login.config==sampleapp_jaas.config 

Обратите внимание, что двойной знак имеет особое значение. См. com.sun.security.auth.login.ConfigFile для получения подробной информации о заказе на загрузку.

Затем создайте LoginContext, который будет искать запись в конфигурации JAAS. Вызовите логин, чтобы заполнить тему, а затем получить доступ к принципалам, которые представляют группы пользователей.

LoginContext l = new LoginContext("sampleApp"); 
l.login(); 
try { 
    Subject s = l.getSubject(); 
    for (Principal p : s.getPrincipals()) { 
     System.out.println(p); 
    } 
} finally { 
    l.logout(); 
} 

Используя эту установку, Java будет использовать класс com.sun.security.auth.module.NTSystem, чтобы получить информацию, но ни один из кода не будет зашито в нестандартных API.

Смежные вопросы