我和春天有个安全:)的Spring Security + LDAP + CustomLdapAuthoritiesPopulator +与rememberMe
一个小问题,什么是我的目标: 配置LDAP身份验证与自定义角色,从数据库中提取,并记住我的功能。
什么做:
- LDAP验证:为AD用户OK
- 自定义角色从数据库:OK
- 记住我:失败
我的问题是: '记住我'工作正常,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页显示 “”; (无)
你得到了上述问题的答案?如果不是,请尝试我的回答并访问我提供的链接以获取有关*记住我认证*的更多信息。 – OO7
尝试用我的答案中的新链接。 – OO7
我解决了这个问题,稍后会发布答案。 – EatingPeopleIsFun