У меня есть небольшая проблема с пружинной безопасностью :)Spring Security + LDAP + CustomLdapAuthoritiesPopulator + RememberMe
Какова моя цель: Настройки LDAP аутентификации с помощью пользовательских ролей, принесенных из базы данных, и запомнить функциональность.
Что сделано:
- LDAP Auth: OK
- пользовательских ролей для пользователей AD из базы данных: OK
- Запомнить меня: FAIL
Моя проблема: «Запомнить меня» отлично работает, таблица persistent_logins создана успешно, она отлично хранит токены. Но когда пользователь возвращается на веб-сайт, весна показывает страницу «не авторизована».
Я думаю, что это происходит, потому что «Remember me» ничего не знает о моих собственных ролях и извлекает роли из LDAP.
Вопрос: Как сказать «Помни меня», чтобы получить роли через мой CustomLdapAuthoritiesPopulator?
мой applicationContext.xml
<bean id="contextSource" class="org.springframework.security.ldap.DefaultSpringSecurityContextSource">
<constructor-arg value="ldap://ldap.forumsys.com:389"/>
<property name="userDn" value="cn=read-only-admin,dc=example,dc=com"/>
<property name="password" value="password"/>
</bean>
<bean name="myDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/db"/>
<property name="username" value="username"/>
<property name="password" value="password"/>
</bean>
<bean id="ldapAuthProvider" class="org.springframework.security.ldap.authentication.LdapAuthenticationProvider">
<constructor-arg>
<bean class="org.springframework.security.ldap.authentication.BindAuthenticator">
<constructor-arg ref="contextSource"/>
<property name="userDnPatterns">
<list>
<value>uid={0},dc=example,dc=com</value>
</list>
</property>
</bean>
</constructor-arg>
<constructor-arg>
<bean class="my.extra.CustomLdapAuthoritiesPopulator"/>
</constructor-arg>
</bean>
<bean id="tokenRepository"
class="org.springframework.security.web.authentication.rememberme.JdbcTokenRepositoryImpl">
<property name="createTableOnStartup" value="false"/>
<property name="dataSource" ref="myDataSource"/>
</bean>
<security:authentication-manager>
<security:authentication-provider ref="ldapAuthProvider"/>
</security:authentication-manager>
<security:http auto-config="true" use-expressions="true">
<security:access-denied-handler error-page="/403"/>
<security:intercept-url pattern="/login*" access="permitAll()"/>
<security:intercept-url pattern="/favicon.ico" access="permitAll()"/>
<security:intercept-url pattern="/resources/**" access="permitAll()"/>
<security:intercept-url pattern="/**" access="hasRole('ROLE_USER')"/>
<security:form-login login-page='/login' login-processing-url="/j_spring_security_check"
default-target-url="/" authentication-failure-url="/login?fail"/>
<security:remember-me key="_spring_security_remember_me" token-validity-seconds="14400"
token-repository-ref="tokenRepository"
user-service-ref="ldapUserService"/>
</security:http>
<security:ldap-user-service id="ldapUserService" server-ref="contextSource"
group-search-base="dc=example,dc=com"
group-search-filter="ou={0})"
user-search-base="dc=example,dc=com"
user-search-filter="uid={0}"/>
Во время отладки, когда пользователь возвращается, CustomLdapAuthoritiesPopulator не называется. Я добавил код для проверки ролей для пользователя (на странице приветствия и на странице 403).
Collection<? extends GrantedAuthority> roles = SecurityContextHolder.getContext().getAuthentication().getAuthorities();
roles.forEach(System.out::println);
После входа пользователя в систему, страница приветствия показывает "ROLE_USER", "ROLE_ADMIN"
После пользователь возвращается назад, 403 страница показывает ""; (Ничего)
Получите ответ по вышеуказанному вопросу? Если нет, попробуйте мой ответ и перейдите по ссылке, которую я предоставил, для получения дополнительной информации о * Remember-Me Authentication *. – OO7
Попробуйте с новыми ссылками в моем ответе. – OO7
Я решил проблему, немного позже отправит ответ. – EatingPeopleIsFun