gpt4 book ai didi

java - PRE_AUTH_FILTER + 登录表单例份验证

转载 作者:太空宇宙 更新时间:2023-11-04 08:05:12 25 4
gpt4 key购买 nike

我是 Spring Security 的新手,似乎我有一个问题对我、常见问题解答和其他网站来说太困难了。

任务是:

  1. 我有带有登录表单的 Spring 应用程序。一切都很好。

  2. 现在我需要能够从应用程序获取任何允许的页面,但需要通过 URL 进行身份验证...类似于:http://myapp.de?login=test&password=test 。我用 PRE_AUTH_FILTER 做到了。一切都可以通过 URL 进行。

  3. 问题是我的应用程序中需要两种身份验证方式。假设如果 PRE_AUTH_FILTER 失败,则加载标准登录表单。所以:http://myapp.de将显示我的登录表单和第 1) 点。

现在,在我的安全配置中,我只有 PRE_AUTH_FILTER 起作用。

我错过了什么?

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

更新 UrlParametersAuthenticationFilter.java

public class UrlParametersAuthenticationFilter extends AbstractPreAuthenticatedProcessingFilter {

@Override
protected Object getPreAuthenticatedPrincipal(HttpServletRequest request) {
if (request.getParameterMap().size() == 2) {
return true;
}
return false;
}

@Override
protected Object getPreAuthenticatedCredentials(HttpServletRequest request) {
String[] credentials = new String[2];
credentials[0] = request.getParameter("j_username");
credentials[1] = request.getParameter("j_password");
return credentials;
}
}

最佳答案

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

编辑:

是的,过滤器一团糟。您甚至查看过 AbstractPreAuthenticatedProcessingFilter 的 javadoc 或源吗?当外部系统已经完成身份验证时使用预身份验证。例如,如果您使用容器提供的 Java EE 身份验证,或者您有一个可进行身份验证的 Web 前端,例如使用用于 NTLM/kerberos 的 IIS 前端。

此外,您的实现不正确, getPreAuthenticatedPrincipal() 应该返回用户名,又名主体,而 getPreAuthenticatedCredentials 应该返回密码,又名凭证。但更重要的是,AbstractPreAuthenticatedProcessingFilter 不执行任何身份验证。来自 Javadoc 的第一行:

Base class for processing filters that handle pre-authenticated authentication requests, where it is assumed that the principal has already been authenticated by an external system.

因此,废弃您的过滤器并使用标准 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 中传递密码是一个非常非常糟糕的主意,您一开始就不应该这样做。它将显示在访问日志中,并引入了一大堆真正不必要的安全问题。

关于java - PRE_AUTH_FILTER + 登录表单例份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12175620/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com