我已经获得了我的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应用程序中使用这些数据。我想我应该实现UserDetailsService并将其与Spring连接,但是虽然我读了很多,但我不知道如何在我的情况下这样做。也许我的方法是错的,我应该完全改变它?提前感谢任何帮助或提示。
答案 0 :(得分:1)
您最好的选择可能是遵循using a UserDetailsContextMapper
with LDAP手册中的说明。
由于您要在此处调用数据库,我将使用NullLdapAuthoritiesPolulator
并在UserDetailsContextMapper
中加载所有数据,包括用户角色。这样你就可以避免进行两次数据库调用。