准备工作
- 正确安装的Ldap服务:我这里的Ldap域为domain.com
- 安装好的Zeppelin服务
- Tips: 可以使用phpLdapAdmin对Ldap进行在线管理
Ldap账号配置
- 添加用户组组织单元(ou)
- 添加用户组织单元(ou)
- 在组织单元groups(ou=groups)下添加group: 我这里创建admin和user两个group
- 在组织单元users(ou=users)下创建用户:我这里创建两个测试用户zpln_user1和zpln_admin
- 将zpln_admin用户添加到admin组下,zpln_user1用户添加到user组下
- 将zpln_user1添加到user group的步骤跟上面一样,不再重复演示
Zeppelin LdapRealm配置
- 将shiro.ini文件用以下内容替换
```nginx
Sample LDAP configuration, for user Authentication, currently tested for single Realm
[main] ldapRealm=org.apache.zeppelin.realm.LdapRealm ldapRealm.contextFactory.authenticationMechanism=simple ldapRealm.contextFactory.url=ldap://ldap_host:389 ldapRealm.userDnTemplate=cn={0},ou=users,dc=domain,dc=com ldapRealm.pagingSize = 200 ldapRealm.authorizationEnabled=true ldapRealm.searchBase=dc=domain,dc=com ldapRealm.userSearchBase = ou=users,dc=domain,dc=com ldapRealm.groupSearchBase = ou=groups,dc=domain,dc=com ldapRealm.groupObjectClass=posixGroup ldapRealm.userLowerCase = true ldapRealm.memberAttribute = memberuid ldapRealm.groupSearchFilter=(&(objectClass=posixGroup)(memberuid={0})) ldapRealm.userSearchScope = subtree ldapRealm.groupSearchScope = subtree ldapRealm.contextFactory.systemUsername= cn=admin,dc=domain,dc=com我的cn=admin,dc=domain,dc=com密码设置的是admin,这里需要替换成用户自己设置的密码
ldapRealm.contextFactory.systemPassword = admin ldapRealm.groupSearchEnableMatchingRuleInChain = false将Ldap上的admin group映射成zeppelin的admin角色, user group映射成zeppelin的user_role角色
ldapRealm.rolesByGroup = admin:admin,user:user_role securityManager.realms = $ldapRealm
sessionManager = org.apache.shiro.web.session.mgt.DefaultWebSessionManager cookie = org.apache.shiro.web.servlet.SimpleCookie cookie.name = JSESSIONID cookie.httpOnly = true sessionManager.sessionIdCookie = $cookie securityManager.sessionManager = $sessionManager securityManager.sessionManager.globalSessionTimeout = 86400000 shiro.loginUrl = /api/login securityManager.sessionManager = $sessionManager securityManager.realms = $ldapRealm
sessionManager = org.apache.shiro.web.session.mgt.DefaultWebSessionManager
Enables ‘HttpOnly’ flag in Zeppelin cookies
cookie = org.apache.shiro.web.servlet.SimpleCookie cookie.name = JSESSIONID cookie.httpOnly = true
Uncomment the below line only when Zeppelin is running over HTTPS
cookie.secure = true
sessionManager.sessionIdCookie = $cookie securityManager.sessionManager = $sessionManager
86,400,000 milliseconds = 24 hour
securityManager.sessionManager.globalSessionTimeout = 86400000 shiro.loginUrl = /api/login
[urls]
shiro检测资源权限是顺序检测的,前面的资源匹配上了就验证这个规则对应的权限即可,不再往后匹配
所以底层实现规则存储用的是LinkedList,保证规则链路保持配置时的顺序
/api/version = anon /api/cluster/address = anon
配置允许所有登陆的用户访问解释器重启接口
/api/interpreter/setting/restart/** = authc
配置只允许拥有admin角色,且登陆成功的用户可以访问解释器相关接口(解释器配置页)
/api/interpreter/** = authc, roles[admin]
配置只允许拥有admin角色,且登陆成功的用户可以访问解释器仓库相关接口(解释器配置页)
/api/notebook-repositories/** = authc, roles[admin]
配置只允许拥有admin角色,且登陆成功的用户可以访问配置相关接口
/api/configurations/** = authc, roles[admin]
配置只允许拥有admin角色,且登陆成功的用户可以访问凭据设置相关接口
/api/credential/** = authc, roles[admin]
配置只允许拥有admin角色,且登陆成功的用户可以访问管理员相关接口
/api/admin/** = authc, roles[admin]
/** = anon
/** = authc ```
- 下面是在Zeppelin官网英文文档未提及但需要特别注意的几个配置项,使用OpenLdap时若缺少这些配置可能会出现配置完成后能登陆Zeppelin但没有admin权限的情况(目前不确定是否是所有OpenLdap版本都存在这个问题,我这里测试用的是openldap-2.4.42)
- ldapRealm.groupSearchEnableMatchingRuleInChain = false
- ldapRealm.memberAttribute = memberuid
- ldapRealm.groupSearchFilter=(&(objectClass=posixGroup)(memberuid={0}))
- ldapRealm.groupObjectClass=posixGroup
- 修改完配置后重启zeppelin服务并用zpln_admin用户登陆, 查看日志,若能正常获取用户角色则表示配置成功
- 也能正常打开解释器配置页面
- 将zpln_admin用户从cn=admin,ou=groups,dc=domain,dc=com组中移除再测试就没有访问解释器配置页的权限了
- 从管理员角色对应的group移除用户zpln_admin
- 刷新解释器配置页面,发现已经没有访问权限了