权限
组不仅仅可以用来设置用户的is_*
字段,还有2种方法把LDAP的组成员信息转换成Django的权限信息。
最后,这2种方法都需要一种机制在LDAP组和Django组之间建立映射。LDAPGroupType
实现了一种算法将LDAP的组信息转换成Django的组信息。用户可以通过继承LDAPGroupType
来修改默认的行为。所有的内部实现都把name_attr
存入了__init__
,并指定了来自LDAP的哪一个参数映射到Django的组名字。默认情况下使用cn
参数。
直接使用组
侵入性最小的方法实现组权限映射就是设置AUTH_LDAP_FIND_GROUP_PERMS
为True
。LDAPBackend
将找出所有LDAP用户组并把它们和Django组进行映射,并且为这些组加载相应的权限。你需要自己将组信息和权限相关联,通常使用自带的admin界面。
为了减少与LDAP的链接请求,LDAPBackend
可以使用Django的缓存功能存储一份LDAP用户组信息的副本在缓存中。通过设置AUTH_LDAP_CACHE_GROUPS
为True
来启用这一特性。也可以设置AUTH_LDAP_GROUP_CACHE_TIMEOUT
来控制缓存的超时时间。
AUTH_LDAP_CACHE_GROUPS = True
AUTH_LDAP_GROUP_CACHE_TIMEOUT = 300
组镜像
第二种把LDAP组信息转换成Django权限信息的方法就是创建组镜像。如果AUTH_LDAP_MIRROR_GROUPS
是True
,则每次用户登录时候LDAPBackend
都会使用LDAP组信息来更新数据库。任何不存在的组都将被创建并且Django的组信息将被更新来匹配LDAP的组信息。注意如果LDAP包含组嵌套结构,Django数据库将以扁平化的形式来表示。为了使组镜像生效,你需要把ModelBackend
也作为认证方式之一。
这2种方式区别在于,第一种方式每次接收到请求都会去LDAP服务器或缓存进行查询,而第二种则是仅在用户认证时候被更新,这不太适合那种有长链接的网站。
非LDAP用户
LDAPBackend
还有一个能力就是管理非认证(authenticate)用户的授权(authorization)。比如你或许使用RemoteUserBackend
来映射已经在外部认证的用户到Django用户。通过设置AUTH_LDAP_AUTHORIZE_ALL_USERS
,LDAPBackend
将按照普通的方法映射这些用户到LDAP用户为了提供授权信息。注意这对于AUTH_LDAP_MIRROR_GROUPS
是无效的;组镜像是一种认证机制而不是授权机制。