CAS и Spring - аутентифицированные, но не авторизованные, вызывающие петлю перенаправления
Я использую CAS, чтобы определить аутентификацию по LDAP, к которой я не могу добавить. Поэтому я использую MySQL для хранения ролей для каждого пользователя.
У меня проблема в том, что, когда человек находится в LDAP, но не играет соответствующей роли в MySQL, я получаю цикл перенаправления. Приложение пытается отправить пользователя обратно на страницу входа в систему CAS, которая (поскольку пользователь прошел проверку подлинности и уже получил билет) пытается отправить его обратно на страницу и т. Д. И т. Д.
Мое applicationContext.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:sec="http://www.springframework.org/schema/security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd">
<sec:http entry-point-ref="casEntryPoint">
<sec:intercept-url pattern="/**" access="ROLE_ODINUSERS,ROLE_ODINSUPERS,ROLE_ODINADMINS" />
<sec:logout logout-success-url="/cas-logout.jsp" />
<sec:custom-filter ref="casFilter" after="CAS_FILTER" />
</sec:http>
<sec:authentication-manager alias="authenticationManager">
<sec:authentication-provider ref="casAuthenticationProvider" />
</sec:authentication-manager>
<bean id="casFilter"
class="org.springframework.security.cas.web.CasAuthenticationFilter">
<property name="authenticationManager" ref="authenticationManager" />
<property name="authenticationFailureHandler">
<bean
class="org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler">
<property name="defaultFailureUrl" value="/cas-failed.jsp" />
</bean>
</property>
<property name="authenticationSuccessHandler">
<bean
class="org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler">
<property name="defaultTargetUrl" value="/" />
</bean>
</property>
<property name="proxyGrantingTicketStorage" ref="proxyGrantingTicketStorage" />
<property name="proxyReceptorUrl" value="/secure/receptor" />
</bean>
<bean id="casEntryPoint"
class="org.springframework.security.cas.web.CasAuthenticationEntryPoint">
<property name="loginUrl" value="https://localhost:8443/cas/login" />
<property name="serviceProperties" ref="serviceProperties" />
</bean>
<bean id="casAuthenticationProvider"
class="org.springframework.security.cas.authentication.CasAuthenticationProvider">
<property name="userDetailsService" ref="userService" />
<property name="serviceProperties" ref="serviceProperties" />
<property name="ticketValidator">
<bean class="org.jasig.cas.client.validation.Cas20ServiceTicketValidator">
<constructor-arg index="0"
value="https://localhost:8443/cas" />
<property name="proxyGrantingTicketStorage" ref="proxyGrantingTicketStorage" />
<property name="proxyCallbackUrl"
value="https://localhost:8443/cas/secure/receptor" />
</bean>
</property>
<property name="key" value="an_id_for_this_auth_provider_only" />
</bean>
<bean id="proxyGrantingTicketStorage"
class="org.jasig.cas.client.proxy.ProxyGrantingTicketStorageImpl" />
<bean id="serviceProperties" class="org.springframework.security.cas.ServiceProperties">
<property name="service" value="https://localhost:8443/CASTest/j_spring_cas_security_check" />
<property name="sendRenew" value="false" />
</bean>
<sec:jdbc-user-service id="userService" data-source-ref="dataSource"
authorities-by-username-query="select username, role FROM user_authorization WHERE username = ?"
users-by-username-query="SELECT username, password, enabled FROM user_authentication WHERE username = ?" />
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://localhost:3306/user_mgt</value>
</property>
<property name="username"><value>root</value></property>
<property name="password"><value>test</value></property>
</bean>
<bean class="org.springframework.security.web.access.expression.DefaultWebSecurityExpressionHandler"/>
</beans>
Есть ли изящный способ обойти петлю перенаправления? Возможно, способ определить страницу для отправки пользователю, если он не авторизован, вместо того, чтобы по умолчанию отправлять его обратно на страницу входа?
1 ответ
Вы можете сделать с помощью
<sec:http entry-point-ref="casEntryPoint">
<sec:intercept-url pattern="/**" access="ROLE_ODINUSERS,ROLE_ODINSUPERS,ROLE_ODINADMINS" />
<sec:logout logout-success-url="/cas-logout.jsp" />
<sec:custom-filter ref="casFilter" after="CAS_FILTER" />
<sec:form-login login-page="/login" authentication-failure-url="/login?error"
username-parameter="j_username" password-parameter="j_password"
default-target-url="/somepageaction" />
</sec:http>