2

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

该应用程序的总体思路是:

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

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

这是我的相关片段web.xml

<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>

有任何想法吗?

4

1 回答 1

2

如果您想使用 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 对请求进行身份验证。所以修正后的流量

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

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

于 2013-04-02T19:34:40.350 回答