Spring - Java EE 用户在身份验证后仍然为空

Posted

技术标签:

【中文标题】Spring - Java EE 用户在身份验证后仍然为空【英文标题】:Spring - Java EE User still null after authentication 【发布时间】:2013-03-24 05:50:19 【问题描述】:

我是 Java EE / Spring 的新手,过去两天我一直在与安全性作斗争。我终于可以使用 Java EE 进行身份验证并使用 Spring 进行授权了。不幸的是,我无法从 Spring 访问 Java EE 身份验证来进行授权。

应用程序的总体思路是这样的:

    如果你没有登录,Spring security 会将你重定向到登录页面 登录页面是唯一被 Java EE 锁定的页面。它输出一个用于身份验证的表单 成功登录后,用户被重定向到主页,该主页应该有与之关联的身份验证对象。

注意对应该的强调,因为它不是。无论出于何种原因,用户都以经过身份验证但匿名的身份返回。如果我可以简单地获取用户名,我可以构建用户详细信息。

这是来自我的web.xml的相关sn-ps:

<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>springSecurityFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</filter>
<security-constraint>
    <web-resource-collection>
        <web-resource-name>Home Page Only</web-resource-name>
        <description>Rely on Spring for Authorization</description>
        <url-pattern>/login</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>*</role-name>
    </auth-constraint>
</security-constraint>
<login-config>
    <auth-method>FORM</auth-method>
    <form-login-config>
        <form-login-page>/login</form-login-page>
        <form-error-page>/loginfailed</form-error-page>
    </form-login-config>
</login-config>

还有我的spring security-content.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security" 
    xmlns:beans="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:lang="http://www.springframework.org/schema/lang"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/security 
        http://www.springframework.org/schema/security/spring-security-3.1.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-3.1.xsd">

    <http auto-config='true' use-expressions="true">
        <intercept-url pattern="/about" access="permitAll"/>
        <intercept-url pattern="/login" access="permitAll"/>
        <intercept-url pattern="/loginfailed" access="permitAll"/>
        <intercept-url pattern="/css/*" access="permitAll"/>
        <intercept-url pattern="/resources/*" access="permitAll"/>
        <intercept-url pattern="/images/*" access="permitAll"/>
        <intercept-url pattern="/js/*" access="permitAll"/>
        <intercept-url pattern="/**" access="hasRole('ROLE_USER')" />
        <form-login default-target-url='/index.jsp' 
            always-use-default-target='true' login-page="/login"
            authentication-failure-url="/loginfailed"
        />
    </http>
    <authentication-manager alias="authenticationManager">
        <authentication-provider ref="securityRef"/>
    </authentication-manager>
    <beans:bean id="securityRef"
        class="my.custom.authprovider.AuthenticationProviderImpl"/>
</beans:beans>

有什么想法吗?

【问题讨论】:

【参考方案1】:

如果你想使用 Java EE 身份验证,你应该配置 PreAuthenticatedProcessingFilter(更准确地说是 J2eePreAuthenticatedProcessingFilter)。 此外,您需要配置 J2eeBasedPreAuthenticatedWebAuthenticationDetailsS​​ource 来填充用户授予的权限: http://static.springsource.org/spring-security/site/docs/3.1.x/reference/springsecurity-single.html#j2ee-preauth-details

顺便说一句,您认为使用 Java EE 表单身份验证有什么优势?

添加在评论之后。

如果需要使用 Java EE 身份验证,您的方法应该更正:您应该通过 Java EE 身份验证保护整个应用程序。 在这种情况下,到达 Spring Security 的每个请求都将通过 Java EE 容器进行身份验证,并且 Spring Security 可以通过 J2eePreAuthenticatedProcessingFilter 对请求进行身份验证。 所以修正后的流程

    如果用户未登录,Java EE 容器会将用户重定向到登录页面

    认证成功后,用户被重定向到受 Spring Security 保护的页面。 Spring Security 可以通过 J2eePreAuthenticatedProcessingFilter 对请求进行身份验证。

【讨论】:

老实说,我宁愿不使用它,但该应用程序运行在 WAS 服务器上,该服务器设置为使用 J2EE 针对 Active Directory 进行身份验证。我之前尝试过使用 J2eePreAuthenticatedProcessingFilter 和不同的设置。我将尝试在此设置中使用它,并告诉您结果如何。

以上是关于Spring - Java EE 用户在身份验证后仍然为空的主要内容,如果未能解决你的问题,请参考以下文章

Java EE 身份验证和授权 [关闭]

Java EE 身份验证和授权 [关闭]

LDAP 用户组

使用 MongoDB 获取存储的用户凭据的 JAVA Spring 自定义身份验证

身份验证后存储附加信息[Spring]

在 Mongo Db 中更新相关文档后 Spring 用户身份验证不起作用