如何在LdapAuthenticationProvider Spring Security中设置UserDetails?

时间:2014-05-15 11:44:37

标签: spring-mvc spring-security

我已经获得了我的Spring MVC应用程序,其中我使用LDAP进行身份验证,使用MySQL数据库进行授权。下面有ldap-config.xml文件。

<bean id="contextSource" class="org.springframework.ldap.core.support.LdapContextSource">
    <property name="url" value="ldap://myLdapServerIp" />
    <property name="base" value="ou=people,dc=company,dc=int" />
</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}</value>
                </list>
            </property>
        </bean>
    </constructor-arg>
    <constructor-arg>
        <bean id="authorities" class="com.package.security.MyLDAPAuthorities">
        </bean>
    </constructor-arg>
</bean>

<bean id="authenticationManager"
    class="org.springframework.security.authentication.ProviderManager">
    <constructor-arg ref="ldapAuthProvider" />
</bean>

类MyLDAPAuthorities只是从数据库中获取角色。

@Service
public class MyLDAPAuthorities implements LdapAuthoritiesPopulator {

@Autowired
UserDao userDao;

@Override
public Collection<? extends GrantedAuthority> getGrantedAuthorities(
        DirContextOperations userData, String username) {

    User user= userDao.findUserByName(username);
    Collection<Role> userPermission = user.getRoles();
    Collection<MyGrantedAuthority> authorities = new ArrayList<>();
    for(Role r : userPermission){
        authorities.add(new MyGrantedAuthority(r.getPk().getRole().toString()));
    }
    return authorities;
}

}

这很好但我想将一些其他人员从数据库添加到User(Principal?)bean,并且能够随时在我的Web应用程序中使用这些数据。我想我应该实现UserDetailsS​​ervice并将其与Spring连接,但是虽然我读了很多,但我不知道如何在我的情况下这样做。也许我的方法是错的,我应该完全改变它?提前感谢任何帮助或提示。

1 个答案:

答案 0 :(得分:1)

您最好的选择可能是遵循using a UserDetailsContextMapper with LDAP手册中的说明。

由于您要在此处调用数据库,我将使用NullLdapAuthoritiesPolulator并在UserDetailsContextMapper中加载所有数据,包括用户角色。这样你就可以避免进行两次数据库调用。