我一直试图让一个简单的基本身份验证示例与WildFly 8.1.0,immutant和朋友一起工作。我愿意发布任何所需的代码,但我不确定此时需要什么。现在,我假设我的standalone.xml,web.xml和jboss-web.xml都包含正确的数据 - 可能不是这样,但是现在我只是潜入问题。
我有一个带有简单/测试资源的应用程序。我已经将它部署在WildFly上并使用基本身份验证尝试访问它。此外,我已经检查了我的application-roles.properties和application-users.properties文件,它们看起来很好。
当我尝试登录时,我从WildFly看到以下跟踪:
14:30:36,681 TRACE [org.jboss.security](默认任务-1)PBOX000210: defaultLogin,登录上下文: javax.security.auth.login.LoginContext@4c89fc2c,主题: 受试者(1313538088).principals = org.jboss.security.SimplePrincipal @ 99148614(测试仪-NA)org.jboss.security.SimpleGroup@83654093(角色(成员:榆树-NSS管理员))org.jboss.security.SimpleGroup @ 83654093(CallerPrincipal(成员:测试仪-NA))
用户是测试人员,你可以看到它是elm-nss-admin的成员。
当我使用密码错误时,WildFly会抓住它并且我的应用程序永远不会进行任何检查。但是,当我发送正确的密码时,会记录上述跟踪,并调用我的身份验证处理程序。
问题是我的身份验证处理程序失败,因为对getUserPrincipal()的调用返回NULL。资源受到保护,这是我的安全约束:
<security-constraint>
<web-resource-collection>
<web-resource-name>Protected Resources</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>*</role-name>
</auth-constraint>
<user-data-constraint>
<transport-guarantee>NONE</transport-guarantee>
</user-data-constraint>
</security-constraint>
当我使用LDAP时,这不是问题。我认为这是因为LDAP提供了证书而WildFly传递了cookie。
但是使用Basic Auth,我没有得到cookie,除非被要求,否则我不会调试调试输出,它非常详细,但相关的位是::cookies {}, :context , :session nil
我猜测getUserPrincipal()失败了,因为我还在进行身份验证吗?
那么,关于我如何从WildFly获取用户数据/权限的任何想法都可以传递适当的数据进行身份验证/授权?
#更新:我能够创建一个简单的应用程序,其中包含我用于生产应用程序的相同XML文件,并且它没有失败。感兴趣的是,以及那些像我一样使用stackoverflow获取答案的人,以下是相关部分:
来自security-realms中的standalone.xml:
<security-realm name="ApplicationRealm">
<authentication>
<local default-user="$local" allowed-users="*"/>
<properties path="application-users.properties" relative-to="jboss.server.config.dir"/>
</authentication>
<authorization>
<properties path="application-roles.properties" relative-to="jboss.server.config.dir"/>
</authorization>
</security-realm>
并在<subsystem xmlns="urn:jboss:domain:security:1.2">
我有:
<security-domain name="other" cache-type="default">
<authentication>
<login-module code="Remoting" flag="optional">
<module-option name="password-stacking" value="useFirstPass"/>
</login-module>
<login-module code="RealmDirect" flag="required">
<module-option name="password-stacking" value="useFirstPass"/>
</login-module>
</authentication>
</security-domain>
<security-domain name="jboss-web-policy" cache-type="default">
<authorization>
<policy-module code="Delegating" flag="required"/>
</authorization>
</security-domain>
<security-domain name="jboss-ejb-policy" cache-type="default">
<authorization>
<policy-module code="Delegating" flag="required"/>
</authorization>
</security-domain>
在我的web.xml文件中(在war-resources / WEB-INF文件夹中):
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>ApplicationRealm</realm-name>
</login-config>
jboss.xml文件位于同一目录中:
<jboss-web>
<context-root></context-root>
<security-domain>other</security-domain>
</jboss-web>
由于这些设置适用于我的简单应用程序,因此我将开始寻找特定于项目的内容,以便为什么WildFly不会在我的生产代码中向我提供用户。
任何有用的建议将不胜感激。甚至只是建议从哪里开始寻找。
#问题解决了。事实证明,在我尝试授权访问特定资源之前,用户已被注销。 :P
答案 0 :(得分:2)
问题解决了。结果用户在我之前被注销了 尝试授权访问特定资源。 :P