在 ldif 文件中向用户授予 ADMIN 角色
Granting an ADMIN role to a user in a ldif file
对于测试环境,我有一个 .ldif
文件来授予 ben
用户 ADMIN
角色,因为我的 Spring 安全需要这个角色配置:.hasRole("ADMIN").anyRequest()
.
这里是 .ldif
文件内容:
dn: ou=groups,dc=springframework,dc=org
objectclass: top
objectclass: organizationalUnit
ou: groups
dn: ou=people,dc=springframework,dc=org
objectclass: top
objectclass: organizationalUnit
ou: people
dn: uid=ben,ou=people,dc=springframework,dc=org
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
cn: Ben LeHeros
sn: Ben
uid: ben
userPassword: {SHA}nFCebWjxfaLbHHG1Qk5UU4trbvQ=
dn: uid=toto,ou=people,dc=springframework,dc=org
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
cn: Toto LeHeros
sn: Toto
uid: toto
userPassword: totopass
dn: cn=adMIN,ou=groups,dc=springframework,dc=org
objectclass: top
objectclass: groupOfNames
cn: ADMin
uniqueMember: uid=ben,ou=people,dc=springframework,dc=org
dn: cn=user,ou=groups,dc=baeldung,dc=com
objectclass: top
objectclass: groupOfNames
cn: user
member: uid=toto,ou=people,dc=springframework,dc=org
测试环境Spring安全配置如下:
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth)
throws Exception {
auth
.ldapAuthentication()
.userDnPatterns("uid={0},ou=people")
.groupSearchBase("ou=groups")
.contextSource().ldif("classpath:test-server.ldif");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable().httpBasic()
.authenticationEntryPoint(restAuthenticationEntryPoint).and()
.authorizeRequests().antMatchers("/**")
.hasRole("ADMIN").anyRequest()
.authenticated();
}
有几点观察:
1- 测试成功,用户通过身份验证并被授予管理员角色。
2- 如果我没有将角色认证配置为 .hasRole("ADMIN").anyRequest()
,而是将其配置为 .hasRole("admin").anyRequest()
,那么测试中给出的用户角色将不会被接受并且测试失败并显示 403(不是401) 验证后。
3- .ldif
文件中的大小写似乎无关紧要,因为 admin
组可以写成 adMIN
和 ADMin
并且测试仍在成功。
4- 将用户的 admin
组替换为 user
组,会使测试失败并显示 403,即用户需要管理员角色才能登录。
dn: cn=user,ou=groups,dc=springframework,dc=org
objectclass: top
objectclass: groupOfNames
cn: user
uniqueMember: uid=ben,ou=people,dc=springframework,dc=org
为什么大小写在 .ldif
文件中无关紧要而在 configure
方法中很重要?
每个目录服务器架构(定义的属性和对象类)用于构建组条目的可分辨名称 (DN) 的属性定义为 case-ignore(DN“规范”https://www.rfc-editor.org/rfc/rfc4514 ).
我个人认为 hasRole(..) 以 case-sensitive 方式匹配的错误。但是我认为是这种情况,因为 DefaultLdapAuthoritiesPopulator 默认为 convertToUpperCase 到 true
对于测试环境,我有一个 .ldif
文件来授予 ben
用户 ADMIN
角色,因为我的 Spring 安全需要这个角色配置:.hasRole("ADMIN").anyRequest()
.
这里是 .ldif
文件内容:
dn: ou=groups,dc=springframework,dc=org
objectclass: top
objectclass: organizationalUnit
ou: groups
dn: ou=people,dc=springframework,dc=org
objectclass: top
objectclass: organizationalUnit
ou: people
dn: uid=ben,ou=people,dc=springframework,dc=org
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
cn: Ben LeHeros
sn: Ben
uid: ben
userPassword: {SHA}nFCebWjxfaLbHHG1Qk5UU4trbvQ=
dn: uid=toto,ou=people,dc=springframework,dc=org
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
cn: Toto LeHeros
sn: Toto
uid: toto
userPassword: totopass
dn: cn=adMIN,ou=groups,dc=springframework,dc=org
objectclass: top
objectclass: groupOfNames
cn: ADMin
uniqueMember: uid=ben,ou=people,dc=springframework,dc=org
dn: cn=user,ou=groups,dc=baeldung,dc=com
objectclass: top
objectclass: groupOfNames
cn: user
member: uid=toto,ou=people,dc=springframework,dc=org
测试环境Spring安全配置如下:
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth)
throws Exception {
auth
.ldapAuthentication()
.userDnPatterns("uid={0},ou=people")
.groupSearchBase("ou=groups")
.contextSource().ldif("classpath:test-server.ldif");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable().httpBasic()
.authenticationEntryPoint(restAuthenticationEntryPoint).and()
.authorizeRequests().antMatchers("/**")
.hasRole("ADMIN").anyRequest()
.authenticated();
}
有几点观察:
1- 测试成功,用户通过身份验证并被授予管理员角色。
2- 如果我没有将角色认证配置为 .hasRole("ADMIN").anyRequest()
,而是将其配置为 .hasRole("admin").anyRequest()
,那么测试中给出的用户角色将不会被接受并且测试失败并显示 403(不是401) 验证后。
3- .ldif
文件中的大小写似乎无关紧要,因为 admin
组可以写成 adMIN
和 ADMin
并且测试仍在成功。
4- 将用户的 admin
组替换为 user
组,会使测试失败并显示 403,即用户需要管理员角色才能登录。
dn: cn=user,ou=groups,dc=springframework,dc=org
objectclass: top
objectclass: groupOfNames
cn: user
uniqueMember: uid=ben,ou=people,dc=springframework,dc=org
为什么大小写在 .ldif
文件中无关紧要而在 configure
方法中很重要?
每个目录服务器架构(定义的属性和对象类)用于构建组条目的可分辨名称 (DN) 的属性定义为 case-ignore(DN“规范”https://www.rfc-editor.org/rfc/rfc4514 ).
我个人认为 hasRole(..) 以 case-sensitive 方式匹配的错误。但是我认为是这种情况,因为 DefaultLdapAuthoritiesPopulator 默认为 convertToUpperCase 到 true