Java 预验证过滤器&x2B;登录表单身份验证

Java 预验证过滤器&x2B;登录表单身份验证,java,authentication,spring-security,Java,Authentication,Spring Security,我是SpringSecurity的新手,似乎我有一个问题对我来说太难了,对于常见问题和其他网站来说 任务是: 我有一个带有登录表单的spring应用程序。一切都很好 现在我需要有能力从应用程序获得任何允许的页面,但通过URL认证。。。类似于:。我用PRE_AUTH_过滤器做的。一切都与URL一起工作 问题是我在我的应用程序中需要两种身份验证方式。假设如果预验证过滤器失败,则加载标准登录表单。因此:将显示我的登录表单,并在第1点) 现在,在我的安全配置中,我只有PRE_AUTH_过滤器工作 我错过

我是SpringSecurity的新手,似乎我有一个问题对我来说太难了,对于常见问题和其他网站来说

任务是:

  • 我有一个带有登录表单的spring应用程序。一切都很好

  • 现在我需要有能力从应用程序获得任何允许的页面,但通过URL认证。。。类似于:。我用PRE_AUTH_过滤器做的。一切都与URL一起工作

  • 问题是我在我的应用程序中需要两种身份验证方式。假设如果预验证过滤器失败,则加载标准登录表单。因此:将显示我的登录表单,并在第1点)

  • 现在,在我的安全配置中,我只有PRE_AUTH_过滤器工作

    我错过了什么

    <sec:http auto-config="true" use-expressions="true">
        <sec:form-login login-page="/login.jsp" default-target-url="/start" authentication-failure-url="/login.jsp?error=true"/>
        <sec:logout logout-url="/logout" logout-success-url="/login.jsp"/>
        <sec:anonymous username="guest" granted-authority="ROLE_ANONYMOUS"/>
        <sec:access-denied-handler error-page="/error403.jsp"/>
        <sec:intercept-url pattern="/login*" access="permitAll"/>   
        <sec:intercept-url pattern="/objautocomplete*" access="hasRole('ROLE_USER')"/>
        <sec:intercept-url pattern="/start*" access="hasRole('ROLE_USER')"/>
        <sec:intercept-url pattern="/u*" access="hasRole('ROLE_USER')"/>
        <sec:intercept-url pattern="/crosstable*" access="hasRole('ROLE_USER')"/>
        <sec:intercept-url pattern="/objcen*" access="hasRole('ROLE_USER')"/>
        <sec:intercept-url pattern="/objchecks*" access="hasRole('ROLE_USER')"/>
        <sec:intercept-url pattern="/globalcen*" access="hasRole('ROLE_USER')"/>
        <sec:custom-filter position="PRE_AUTH_FILTER" ref="preAuthFilter" />
        <sec:remember-me/>
    </sec:http>
    
        <!-- PRE_ AUTHENTICATION -->        
    <beans:bean id="userDetailsServiceImpl"
        class="com.grsnet.qvs.auth.UserDetailsServiceImpl" />
    
    <beans:bean id="preAuthenticatedProcessingFilterEntryPoint"
        class="com.grsnet.qvs.auth.LinkForbiddenEntryPoint" />
    
    <beans:bean id="preAuthenticationProvider" class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider">
        <beans:property name="preAuthenticatedUserDetailsService" ref="userDetailsServiceImpl" />
    </beans:bean>
    
    <beans:bean id="preAuthFilter"
        class="com.grsnet.qvs.auth.UrlParametersAuthenticationFilter">
        <beans:property name="authenticationManager" ref="appControlAuthenticationManager" />
    </beans:bean>
    
    <sec:authentication-manager alias="appControlAuthenticationManager">
        <sec:authentication-provider ref="preAuthenticationProvider" />
    </sec:authentication-manager>
    
        <!-- LOGIN FORM AUTHENTICATION -->  
    
    <sec:authentication-manager>
        <sec:authentication-provider user-service-ref="qvsUserDetailsService"/>
    </sec:authentication-manager>
    
    <beans:bean id="qvsUserDetailsService" class="com.grsnet.qvs.auth.QVSUserDetailsService"/>
    
    </beans:beans>
    
    所以,放弃你的过滤器,使用标准的UsernamePasswordAuthenticationFilter

    <beans:bean id="urlParameterAuthFilter" class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter">
        <beans:property name="usernameParameter" value="username" />
        <beans:property name="passwordParameter" value="password" />
        <beans:property name="postOnly" value="false" />
        <beans:property name="authenticationManager" ref="appControlAuthenticationManager" />
    </beans:bean>
    
    
    
    然后将自定义筛选器声明替换为

    <sec:custom-filter before="FORM_LOGIN_FILTER" ref="urlParameterAuthFilter" />
    
    
    
    免责声明:在URL中传递密码是一个非常非常糟糕的主意,您首先不应该这样做。它将出现在访问日志中,并引入了一大堆真正不必要的安全问题

    所以,放弃你的过滤器,使用标准的UsernamePasswordAuthenticationFilter

    <beans:bean id="urlParameterAuthFilter" class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter">
        <beans:property name="usernameParameter" value="username" />
        <beans:property name="passwordParameter" value="password" />
        <beans:property name="postOnly" value="false" />
        <beans:property name="authenticationManager" ref="appControlAuthenticationManager" />
    </beans:bean>
    
    
    
    然后将自定义筛选器声明替换为

    <sec:custom-filter before="FORM_LOGIN_FILTER" ref="urlParameterAuthFilter" />
    
    
    

    免责声明:在URL中传递密码是一个非常非常糟糕的主意,您首先不应该这样做。它将出现在访问日志中,并引入了一大堆真正不必要的安全问题。

    我应该用字符串替换我的代码吗?还是加上?当我替换时,我有下一种情况:1。登录表单工作2。url验证不起作用,并在登录表单上重定向我。更新:有下一个异常:找不到org.springframework.security.web.authentication.preauthentication.PreAuthenticatedAuthenticationTokenUPDATE的AuthenticationProvider:当我尝试调试时,UserDetails Service Impl中没有任何活动。当我使用PRE_AUTH_FILTER时,我已经进行了调试活动,并且已经成功了。请您发布您的URLParametersAuthenticationFilteries的代码。请在更新部分查看它。顺便说一下,我在UrlParametersAuthenticationFilter.java中有所有良好的调试活动。我应该用字符串替换我的代码吗?还是加上?当我替换时,我有下一种情况:1。登录表单工作2。url验证不起作用,并在登录表单上重定向我。更新:有下一个异常:找不到org.springframework.security.web.authentication.preauthentication.PreAuthenticatedAuthenticationTokenUPDATE的AuthenticationProvider:当我尝试调试时,UserDetails Service Impl中没有任何活动。当我使用PRE_AUTH_FILTER时,我已经进行了调试活动,并且已经成功了。请您发布您的URLParametersAuthenticationFilteries的代码。请在更新部分查看它。顺便说一下,我在UrlParametersAuthenticationFilter.java中有所有良好的调试活动
    <sec:custom-filter before="FORM_LOGIN_FILTER" ref="urlParameterAuthFilter" />