在WildFly中部署使用基本身份验证进行战争时,getUserPrincipal将返回null

时间:2014-12-04 21:16:29

标签: authentication cookies jboss wildfly

我一直试图让一个简单的基本身份验证示例与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

1 个答案:

答案 0 :(得分:2)

史蒂文自己解决了这个问题:

  

问题解决了。结果用户在我之前被注销了   尝试授权访问特定资源。 :P