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)。 此外,您需要配置 J2eeBasedPreAuthenticatedWebAuthenticationDetailsSource 来填充用户授予的权限: 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 用户在身份验证后仍然为空的主要内容,如果未能解决你的问题,请参考以下文章