【发布时间】:2014-02-14 02:16:34
【问题描述】:
我目前正在将我的应用程序与公司 ldap 集成。虽然我能够让应用程序实际检查 ldap 上的用户进行身份验证,但用户无法克服 Spring Security ROLES 配置。我越来越: “拒绝 抱歉,您无权查看此页面。” 每次我尝试进入带有 @Secured(['ROLE_USER']) 的页面时。我想知道如何将 LDAP 上的每个用户添加为 ROLE_USER,以便他能够充分使用应用程序。
我的 ldap 配置很简单:
grails.plugin.springsecurity.providerNames = ['ldapAuthProvider','anonymousAuthenticationProvider','rememberMeAuthenticationProvider']
grails.plugin.springsecurity.ldap.context.anonymousReadOnly = true
grails.plugin.springsecurity.ldap.context.server = "SOME LDAP ADRESS"
grails.plugin.springsecurity.ldap.authorities.groupSearchBase = 'ou=Employees,O=*****,C=****'
grails.plugin.springsecurity.ldap.search.base = 'O=****,C=****'
grails.plugin.springsecurity.ldap.authorities.retrieveGroupRoles = true
grails.plugin.springsecurity.ldap.authorities.retrieveDatabaseRoles = true
grails.plugin.springsecurity.ldap.authorities.groupSearchFilter = 'member={0}'
grails.plugin.springsecurity.ldap.search.attributesToReturn = null
spring security core是默认的:
// Added by the Spring Security Core plugin:
grails.plugin.springsecurity.userLookup.userDomainClassName = 'amelinium1.grails.SecUser'
grails.plugin.springsecurity.userLookup.authorityJoinClassName = 'amelinium1.grails.SecUserSecRole'
grails.plugin.springsecurity.authority.className = 'amelinium1.grails.SecRole'
grails.plugin.springsecurity.controllerAnnotations.staticRules = [
'/**': ['permitAll'],
'/**/systeminfo': ['permitAll'],
'/**/js/**': ['permitAll'],
'/**/css/**': ['permitAll'],
'/**/images/**': ['permitAll']]
grails.plugin.springsecurity.logout.postOnly = false
http://grails-plugins.github.io/grails-spring-security-core/docs/manual/guide/single.pdf 上提供的文档似乎不是最新的,即使它是针对 2.0 版本的 spring security core。 我尝试实现 Custom GrailsUser 和 GrailsUserDetailsService,但它们似乎与插件的其余部分没有融合。(基于文档的实现)。
任何人都可以通过一些关于如何在最新版本 2.0-RC2 中实现 LDAP 的信息来指出正确的方向吗?
编辑
我的 CustomUserDetailsService 类,但我不确定它的 LDAP 配置是否正确:
class CustomUserDetailsService implements GrailsUserDetailsService{
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User.withTransaction { status ->
User user = User.findByUsername(username)
if (!user) throw new UsernameNotFoundException('User not found', username)
def authorities = user.authorities.collect {new GrantedAuthorityImpl(it.authority)}
return new CustomUserDetails(user.username, user.password, user.enabled,
!user.accountExpired, !user.passwordExpired,
!user.accountLocked, authorities ?: NO_ROLES, user.id,
user.firstName, user.lastName)
} as UserDetails
}
@Override
public UserDetails loadUserByUsername(String username, boolean loadRoles)
throws UsernameNotFoundException, DataAccessException {
return loadUserByUsername(username);
}
}
还有 CustomUserDetails 类:
class CustomUserDetails extends GrailsUser{
final String firstName
final String lastName
CustomUserDetails(String username, String password, boolean enabled,
boolean accountNonExpired, boolean credentialsNonExpired,
boolean accountNonLocked,
Collection<GrantedAuthority> authorities,
long id, String firstName, String lastName) {
super(username, password, enabled, accountNonExpired,
credentialsNonExpired, accountNonLocked, authorities, id)
this.firstName = firstName
this.lastName = lastName
}
}
问题是我无法从 LDAP 获取其他信息,而不是用户名作为 ldap 登录。 也希望在这里得到帮助。在将应用程序重新设计为基于 Customclasses 后,我收到如下错误: 方法没有签名:静态 org.springframework.security.core.userdetails.User.findByUsername() 适用于参数类型:(java.lang.String) 值:[hajduk]
【问题讨论】:
标签: spring grails spring-security ldap grails-plugin