2011-02-09 4 views
0

В нашем приложении весна безопасности использует ldap в качестве поставщика.Обход весны безопасности

Я работаю над изменением, которое позволит вам перевернуть флаг в dev, который позволит вам войти в систему, если ваш пользователь/проход соответствует значению из базы данных. сервер LDAP может быть вниз и вы все еще можете войти.

Что ив понял, однако, что некоторые URLs обеспечены

@Secured({"ROLE_USER","ROLE_MERCHANT"}) 

поэтому мне нужно еще иметь некоторые отношения с пружинной безопасности для того, чтобы мой логины для работы. Как мне это сделать?

+0

Добавить все эти роли для пользователя в базе данных? – OrangeDog

+0

нет, но я могу понять их программно. это требование является чем-то вроде взлома, это будет сделано только в dev - у меня есть немного места для написания дрянных хаков – mkoryak

ответ

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

@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> 
Смежные вопросы