绕过春天的安全

时间:2011-02-09 17:20:52

标签: spring-security

在我们的应用程序中,spring security使用ldap作为提供程序。

我正在进行一项更改,让您在dev中翻转一个标志,如果您的用户/通行证与数据库中的值匹配,则允许您登录。 ldap服务器可能已关闭,您仍然可以登录。

我已经意识到,有些网址是用

保护的
@Secured( {"ROLE_USER","ROLE_MERCHANT"})

因此我需要与Spring安全性进行一些交易才能使我的登录工作。我该怎么做呢?

1 个答案:

答案 0 :(得分:2)

您可以配置2个提供程序:一个LDAP提供程序和另一个DAO提供程序。

<sec:authentication-manager alias="authenticationManager">
    <sec:authentication-provider ref="yourLdapAuthenticationProvider" />
    <sec:authentication-provider ref="yourDaoAuthenticationProvider" />
</sec:authentication-manager>

如果LDAP失败,它将回退到DAO身份验证提供程序。

您需要配置自己的身份验证过滤器,将该标志注入yourDaoAuthenticationProvider,以便在身份验证回退到yourDaoAuthenticationProvider时,可以检查是否继续进行身份验证(例如,在开发中) )或忽略它(比如说,在生产中)。因此,在authenticationFilter中,覆盖setDetails()以存储标记: -

myAuthenticationFilter bean

@Override
protected void setDetails(HttpServletRequest request, UsernamePasswordAuthenticationToken authRequest) {
    YourObject yourObject = new YourObject(request.getParameter("devAuthAgainstDAO"));
    authRequest.setDetails(yourObject);
}

使用此功能,让您的yourDaoAuthenticationProvider检查此标志,然后再继续进行身份验证。

最后,您的配置将如下所示: -

<sec:http auto-config="false" entry-point-ref="loginUrlAuthenticationEntryPoint">
    <sec:logout logout-success-url="/login.jsp"/>
    <sec:intercept-url ... />

    <sec:custom-filter position="FORM_LOGIN_FILTER" ref="myAuthenticationFilter"/>
</sec:http>

<bean id="myAuthenticationFilter" class="[YOUR_CUSTOM_AUTHENTICATION_FILTER]">
    <property name="authenticationManager" ref="authenticationManager"/>
    <property name="authenticationFailureHandler" ref="failureHandler"/>
    <property name="authenticationSuccessHandler" ref="successHandler"/>
</bean>

<bean id="loginUrlAuthenticationEntryPoint"
      class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint">
    <property name="loginFormUrl" value="/login.jsp"/>
</bean>

<bean id="successHandler"
      class="org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler">
    <property name="defaultTargetUrl" value="/welcome.jsp"/>
    <property name="alwaysUseDefaultTargetUrl" value="true"/>
</bean>

<bean id="failureHandler"
      class="org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler">
    <property name="defaultFailureUrl" value="/login.jsp?login_error=1"/>
</bean>


<bean id="yourLdapAuthenticationProvider" ... />

<bean id="yourDaoAuthenticationProvider" ... />

<sec:authentication-manager alias="authenticationManager">
    <sec:authentication-provider ref="yourLdapAuthenticationProvider"/>
    <sec:authentication-provider ref="yourDaoAuthenticationProvider"/>
</sec:authentication-manager>