使用 Ldap 进行春季授权和角色管理
Posted
技术标签:
【中文标题】使用 Ldap 进行春季授权和角色管理【英文标题】:spring authorizations and roles management with Ldap 【发布时间】:2017-08-19 04:27:12 【问题描述】:我正在开发一个基于 spring java 的应用程序,我想使用 apache directory studio ldap 来管理用户,所以我想给每个用户一个角色并管理我使用 spring security 。
这是我的 security-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:security="http://www.springframework.org/schema/security"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-4.2.xsd">
<security:authentication-manager>
<security:ldap-authentication-provider
user-search-filter="(uid=0)" user-search-base="ou=users"
group-search-filter="(uniqueMember=0)" group-search-base="ou=groups"
group-role-attribute="cn" role-prefix="ROLE_" />
</security:authentication-manager>
<security:ldap-server url="ldap://localhost:8389/o=mojo"
manager-dn="uid=admin,ou=system" manager-password="secret" />
<security:http use-expressions="true">
<security:intercept-url pattern="/" access="hasRole('ROLE_Admin')" />
<security:form-login />
</security:http>
这是我的 ldap 层次结构
这对我不起作用,即使我使用管理员凭据登录,也会出现 403 错误,拒绝访问。
有什么帮助吗?
【问题讨论】:
不确定是否有帮助,但上次我处理 spring-security LDAP 时,我不得不使用 hasAuthority 而不是 hasRole。给它一个机会... 不对我不起作用 【参考方案1】:尝试以这种方式将<security:intercept-url pattern="/" access="hasRole('ROLE_ADMIN')" />
中的角色设置为大写。
默认<security:ldap-authentication-provider />
,它自动配置一个org.springframework.security.ldap.authentication.LdapAuthenticationProvider创建一个org.springframework.security.ldap.userdetails.LdapUserDetailsMapper的实例,默认情况下有这个属性:
public class LdapUserDetailsMapper implements UserDetailsContextMapper
// ~ Instance fields
// ================================================================================================
private final Log logger = LogFactory.getLog(LdapUserDetailsMapper.class);
private String passwordAttributeName = "userPassword";
private String rolePrefix = "ROLE_";
private String[] roleAttributes = null;
private boolean convertToUpperCase = true;
以此类推,当convertToUpperCase设置为true时,这个方法
/**
* Creates a GrantedAuthority from a role attribute. Override to customize authority
* object creation.
* <p>
* The default implementation converts string attributes to roles, making use of the
* <tt>rolePrefix</tt> and <tt>convertToUpperCase</tt> properties. Non-String
* attributes are ignored.
* </p>
*
* @param role the attribute returned from
* @return the authority to be added to the list of authorities for the user, or null
* if this attribute should be ignored.
*/
protected GrantedAuthority createAuthority(Object role)
if (role instanceof String)
if (this.convertToUpperCase)
role = ((String) role).toUpperCase();
return new SimpleGrantedAuthority(this.rolePrefix + role);
return null;
最终将您的ou:groups
Admin
转换为ROLE_ADMIN
,这与ROLE_Admin
不匹配
【讨论】:
【参考方案2】:错误是在我的 LDAP 层次结构中,我应该将组命名为 cn=ROLE_ADMIN
而不是 cn=Admin
,因为我的 security-context.xml 文件中有 role-prefix="ROLE_"
【讨论】:
我建议你删除你的问题。 没有机会编辑LDAP的注意;如果你不是用 hasRole("ROLE_Admin") 而是用 hasAuthority("Admin");不需要重命名 LDAP 层次结构。以上是关于使用 Ldap 进行春季授权和角色管理的主要内容,如果未能解决你的问题,请参考以下文章
如何使用带有 LDAP 身份验证的 Apache Shiro 添加角色授权
如何通过数据库的LDAP和基于角色的授权实现Spring安全?
Spring Security - LDAP 身份验证和数据库授权