【发布时间】:2015-07-29 12:36:15
【问题描述】:
我对 Spring Security 有一点问题 :)
我的目标是什么: 使用自定义角色配置 LDAP 身份验证,从数据库中获取,并记住我的功能。
做了什么:
- LDAP 身份验证:确定
- 数据库中 AD 用户的自定义角色:确定
- 记住我:失败
我的问题是: “记住我”工作正常,persistent_logins 表创建成功,它可以很好地存储令牌。但是当用户返回网站时,spring 显示“未授权”页面。
我认为这是因为“记住我”对我的自定义角色以及从 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 身份验证 的更多信息。
-
在我的答案中尝试使用新链接。
-
我解决了这个问题,稍后会发布答案。
标签: java spring spring-security ldap remember-me