request.getUserPrincipal()返回了空值。

3

用户成功验证,但在身份验证后,当我转到下一个控制器时,request.getUserPrincipal()为null。 我正在使用WebSphere 7,我的应用程序是Spring MVC。

   System.out.println("subject.getPrincipals(): " + subject.getPrincipals());

   WSSubject.setRunAsSubject(subject);

在登录控制器中进行身份验证后,subject.getPrincipals() 返回 principal,但是当我进入下一个控制器时,request.getUserPrincipal() 为 null。

web.xml

<security-role>
    <role-name>Administrator</role-name>
</security-role>

<security-constraint>
    <display-name>manager_Service</display-name>
    <web-resource-collection>
        <web-resource-name>manageservice</web-resource-name>
        <url-pattern>/manageServiceList.htm</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>Administrator</role-name>
    </auth-constraint>
    <user-data-constraint>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
</security-constraint>

application.xml

<security-role>
    <role-name>Administrator</role-name>
</security-role>

ibm-application-bnd.xml

<security-role name="Administrator">
    <group name="Administrator" />
</security-role>

用户属于管理员组。我所有的部署描述符都设置得很好。有任何想法我犯了什么错误吗?

2个回答

3
似乎您只保护一个网址,即/manageServiceList.htm,因此如果用户访问其他网址,则根本没有主体。

会有其他资源可用,但这不是我的问题。无论我访问受保护的资源还是未受保护的资源,都应该有原则。 - Muhammad Imran Tariq
这可能是你想要的,但并不是它的工作方式:如果我没记错的话,你必须保护资源才能获得一个带有填充主体的请求。但当然,保护资源而没有任何限制(允许所有)也是合法的。 - Ralph
请看我的问题:“在登录控制器进行身份验证后,subject.getPrincipals()返回主体,但当我转到下一个控制器时,request.getUserPrincipal()为null”。问题出在哪里?为什么会是null? - Muhammad Imran Tariq
@imran tariq:你所说的“下一个控制器”是指映射到另一个(未受保护)URL的控制器吗? - Ralph
下一个控制器是指登录后的任何控制器。问题在于服务器容器没有更新用户已经通过身份验证,因此返回主体为空。 - Muhammad Imran Tariq

-2

创建和配置自定义JAAS登录模块解决问题。请参见第4个列表 这里

不知道我的以前的代码有什么问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接