在我们的应用程序中,spring security使用ldap作为提供程序。
我正在进行一项更改,让您在dev中翻转一个标志,如果您的用户/通行证与数据库中的值匹配,则允许您登录。 ldap服务器可能已关闭,您仍然可以登录。
我已经意识到,有些网址是用
保护的@Secured( {"ROLE_USER","ROLE_MERCHANT"})
因此我需要与Spring安全性进行一些交易才能使我的登录工作。我该怎么做呢?
答案 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>