2016-10-27 66 views
0

我已经被这个任务用了好几天了。在我的web应用程序的登录表单中,在用户输入用户名和密码之前,我想要接收请求他的Windows帐户的用户名。经过大量研究,我发现Kerberos是我必须使用的,但我不知道如何。 我有权访问Active Directory服务器,所以我创建了服务主体名称,建立在Java上与AD的连接上,但是我不可能获得Windows用户。获取Windows用户登录WebApp(JAVA)

现在我试着哟使用Waffle,就像我读的,就像导入一些JAR一样简单,并且在一个JSP文件中获取主体名称(它假设是Windows用户),但正如我所说,我不能这样做。

有没有人做过类似的事情?

任何帮助将真正感谢,

在此先感谢。

UPDATE:

根据你的要求,这是从来就迄今所做的:

在WServer 2012 R2(其中我有AD)我创建了一个叫做用户santi.mitrol.net

注册一个SPN给该用户使用下面的命令:

setspn -A HTTP/santi.mitrol.net santi.mitrol.net 

,并在此之后,我创建了相关的密钥表:

ktpass -out C:\temp\test.keytab -princ HTTP/[email protected] -mapUser santi.mitrol.net -mapOp set -pass MYPASS -crypto RC4-HMAC-NT -pType KRB5_NT_PRINCIPAL 

此设置后,我创造了这个项目:https://github.com/spring-projects/spring-security-kerberos/tree/master/spring-security-kerberos-samples/sec-server-win-auth/src/main但我不能让它工作...

带华夫一样..我的web.xml我有这样的:

<filter-name>SecurityFilter</filter-name> 
<!--<filter-class>waffle.servlet.NegotiateSecurityFilter</filter-class>--> 
<filter-class>net.mitrol.config.activedirectory.CustomFilter</filter-class> 

<filter-name>SecurityFilter</filter-name> 
<url-pattern>/*</url-pattern> 

但是,当我向另一台PC上的我的PC上部署的Tomcat发出请求时,它们会提示输入凭据,这不是我所需要的,我只需要根据请求接收在提出请求的计算机上登录的Windows用户。

Thanksssss

+0

向我们展示你已经尝试过的东西。 –

+0

[Java当前计算机名称和登录用户?]可能重复(http://stackoverflow.com/questions/473446/java-current-machine-name-and-logged-in-user) –

回答

0

好,半个月后,我终于可以得到它的工作!!!!

我会尽可能详细地发布整个过程,因为没有人会遭受我所遭受的。

在这个过程中,我使用的DOMIAN DEV-MITROL.LOCAL三台计算机:

  • 域控制器: 主机名:AR-SRV-DC-007 用户:管理员 通:somePass40

  • Tomcat机器: ip:192.168.40.91(我在DC上创建了一个dns条目,将此IP解析为santi.dev-mitrol。网) 用户:tomcat的 通:tomcatPass40

  • 客户机以发出请求到Tomcat机(它不会致使正常工作,如果你做,你正在运行的服务器在同一台机器的要求)

步骤:

1)已登录在DC与管理员用户Y创建此SPN:

setspn -A HTTP/santi.dev-mitrol.net tomcat 
setspn -A HTTP/santi.dev-mitrol.net.dev-mitrol.local tomcat 

2)在“管理工具> Active Directory用户和计算机”上找到用户“tomcat”,并在委派选项卡中选择“信任此用户委派任何服务(仅限Kerberos)”选项,并在“帐户”在“帐户选项”中选中“不需要Kerberos预制”。

3)创建密钥表白衣这个命令:

ktpass -princ HTTP/[email protected] -mapuser [email protected] -pass * -ptype KRB5_NT_PRINCIPAL -out test.keytab 

taht你要在这里使用的密码是:tomcatPass40。

4)现在,时间与tomcat的用户登录并粘贴此路径上创建的密钥表:

C:\ Program Files文件\ Apache软件基金会\ Tomcat的8.5 \的conf \

除了对此,你有这样的文件夹中创建两个文件:

KRB5.ini

[libdefaults] 
default_realm = DEV-MITROL.LOCAL 
default_tkt_enctypes = rc4-hmac,aes256-cts-hmac-sha1-96,aes128-cts-hmac-sha1-96 
default_tgs_enctypes = rc4-hmac,aes256-cts-hmac-sha1-96,aes128-cts-hmac-sha1-96 
forwardable=true 

[realms] 
DEV-MITROL.LOCAL = { 
kdc = AR-SRV-DC-007 
} 

[domain_realm] 
dev-mitrol.local= DEV-MITROL.LOCAL 
.dev-mitrol.local= DEV-MITROL.LOCAL 

和的Jaas.conf

com.sun.security.jgss.krb5.initiate { 
com.sun.security.auth.module.Krb5LoginModule required; 
}; 

com.sun.security.jgss.krb5.accept { 
com.sun.security.auth.module.Krb5LoginModule required 
storeKey=true 
useKeyTab=true 
keyTab="file:///C:/Program Files/Apache Software Foundation/Tomcat 8.5/conf/test.keytab" 
principal="HTTP/santi.dev-mitrol.net.dev-mitrol.local"; 
}; 

5)编辑web.xml文件是在同一个文件夹中,包括SPNEGO过滤器:

<filter> 
    <filter-name>SpnegoHttpFilter</filter-name> 
    <filter-class>net.sourceforge.spnego.SpnegoHttpFilter</filter-class> 
    <init-param> 
     <param-name>spnego.allow.basic</param-name> 
     <param-value>true</param-value> 
    </init-param> 

    <init-param> 
     <param-name>spnego.allow.localhost</param-name> 
     <param-value>true</param-value> 
    </init-param> 

    <init-param> 
     <param-name>spnego.allow.unsecure.basic</param-name> 
     <param-value>true</param-value> 
    </init-param> 

    <init-param> 
     <param-name>spnego.login.client.module</param-name> 
     <param-value>com.sun.security.jgss.krb5.initiate</param-value> 
    </init-param> 

    <init-param> 
     <param-name>spnego.krb5.conf</param-name> 
     <param-value>krb5.ini</param-value> 
    </init-param> 

    <init-param> 
     <param-name>spnego.login.conf</param-name> 
     <param-value>jaas.conf</param-value> 
    </init-param> 

    <init-param> 
     <param-name>spnego.login.server.module</param-name> 
     <param-value>com.sun.security.jgss.krb5.accept</param-value> 
    </init-param> 

    <init-param> 
     <param-name>spnego.prompt.ntlm</param-name> 
     <param-value>true</param-value> 
    </init-param> 

    <init-param> 
     <param-name>spnego.logger.level</param-name> 
     <param-value>1</param-value> 
    </init-param> 
</filter> 
<filter-mapping> 
    <filter-name>SpnegoHttpFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

6)在“C创建一个JSP文件:\ Program Files文件\ Apache软件基金会\ Tomcat的8.5 \的webapps \ ROOT”与此内容:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
    <head> 
     <title>Hello SPNEGO Example</title> 
    </head> 
    <body> 
     Hello <%= request.getRemoteUser() %> ! 
    </body> 
</html> 

7)如果你遵循这个步骤,它应该是工作,你会在你的要求来接收Windows用户的名称。

希望它有帮助。

+0

SSO也可能与胡扯。我在几个webapps中实现了它。看起来不像你所做的那么复杂。 –