我在骆驼下使用 apache shiro,我无法使用 ldap/active 目录将组映射到角色

Posted

技术标签:

【中文标题】我在骆驼下使用 apache shiro,我无法使用 ldap/active 目录将组映射到角色【英文标题】:I am using apache shiro under camel and I cannot map groups to roles with ldap/active directory 【发布时间】:2012-05-28 08:51:01 【问题描述】:

我正在使用 shiro 和骆驼。我可以使用 activedirectory (ldap) 对用户进行身份验证,但我无法将角色中的用户组映射到用户权限。骆驼需要绝对的权限才能工作。

这是我的 config.ini:

[main]
authcStrategy = org.apache.shiro.authc.pam.FirstSuccessfulStrategy
securityManager.authenticator.authenticationStrategy = $authcStrategy


activeDirectoryRealm = org.apache.shiro.realm.activedirectory.ActiveDirectoryRealm
activeDirectoryRealm.systemUsername=cn=padl,cn=Users,dc=comune,dc=prato,dc=local
activeDirectoryRealm.systemPassword=xxxxxxxxxxxxxxxxxxxxxxx
activeDirectoryRealm.url = ldap://172.16.1.98:389
activeDirectoryRealm.groupRolesMap = "CN=menu_ufficiomobile_ania,OU=Menu,OU=Gruppi,OU=ComuneDiPrato,DC=comune,DC=prato,DC=local":"menu_ufficiomobile_ania"

securityManager.realms = $activeDirectoryRealm
[users]

test = test,menu_ufficiomobile_passicarrabili, menu_ufficiomobile_rubati,menu_ufficiomobile_ordinanze, menu_ufficiomobile_ztl, menu_ufficiomobile_cciaa,  menu_ufficiomobile_ania, menu_ufficiomobile_anagrafe, menu_ufficiomobile_mctc, menu_ufficiomobile_pra


[roles]

menu_ufficiomobile_anagrafe = prato:anagrafe
menu_ufficiomobile_mctc = prato:mctc
menu_ufficiomobile_pra = prato:pra
menu_ufficiomobile_ania = prato:ania
menu_ufficiomobile_cciaa = prato:cacomm
menu_ufficiomobile_ztl = prato:ztl
menu_ufficiomobile_ordinanze = prato:ordinanze
menu_ufficiomobile_rubati = prato:rubati
menu_ufficiomobile_passicarrabili = prato:permessi

我的安全注入代码:

ShiroSecurityToken shiroSecurityToken = new ShiroSecurityToken(qr.getUserName(),qr.getPassword());
ShiroSecurityTokenInjector shiroSecurityTokenInjector = new ShiroSecurityTokenInjector(shiroSecurityToken, passPhrase);
arg0.getIn().setHeader("SHIRO_SECURITY_TOKEN", shiroSecurityTokenInjector.encrypt());

以及使用权限的路由代码:

from("seda:interrogaANIA").threads(1)
 .setHeader("db", constant(Database.ANIA)).policy(aniaS)
 .to("bean:interrogaANIA?method=interrogaBancaDati")
 .to("seda:prefilter"); 

谢谢, 马里奥

【问题讨论】:

【参考方案1】:

所以,shiro 中的领域提供了 3 件事:

    验证用户身份 将用户映射到角色 将用户映射到权限

它不提供任意角色->权限映射。为此,您需要在活动目录领域设置 RolePermissionResolver。查看 IniRealm(由 ini 文件中的 [users] 和 [roles] 部分创建的内容),似乎没有一种简单的方法可以将其用作 RolePermissionResolver。我能够将一个应该可以正常工作的适配器类组合在一起。

package org.apache.shiro.samples.web;

import java.util.Collection;
import java.util.Collections;

import org.apache.shiro.authz.Permission;
import org.apache.shiro.authz.SimpleRole;
import org.apache.shiro.authz.permission.RolePermissionResolver;
import org.apache.shiro.config.Ini;
import org.apache.shiro.realm.text.IniRealm;

public class IniRealmRolePermissionResolver implements RolePermissionResolver 
        private LocalIniRealm realm;

        public Collection<Permission> resolvePermissionsInRole(final String roleString) 
                final SimpleRole role = this.realm.getRole(roleString);
                return role == null ? Collections.<Permission>emptySet() : role.getPermissions();
        

        public void setIni(final IniRealm ini) 
                this.realm = new LocalIniRealm();
                this.realm.setIni(ini.getIni());
                this.realm.init();
        

        private static class LocalIniRealm extends IniRealm 
                @Override
                protected SimpleRole getRole(final String rolename) 
                        return super
                                        .getRole(rolename);
                
        

这个添加到你的ini文件中应该可以使用:

rolePermissionResolver = org.apache.shiro.samples.web.IniRealmRolePermissionResolver
rolePermissionResolver.ini = $iniRealm
activeDirectoryRealm.rolePermissionResolver = $rolePermissionResolver

如果你真的不需要ini映射,你可以使用相同的概念,但会大大简化事情。

package org.apache.shiro.samples.web;

import org.apache.shiro.authz.Permission;
import org.apache.shiro.authz.permission.*;

import java.util.Collection;
import java.util.Collections;

public class SimpleRolePermissionResolver implements RolePermissionResolver, PermissionResolverAware 

    private PermissionResolver permissionResolver = new WildcardPermissionResolver();

    public void setPermissionResolver(PermissionResolver permissionResolver) 
        this.permissionResolver = permissionResolver;
    

    public Collection<Permission> resolvePermissionsInRole(String roleString) 
        return Collections.<Permission>singleton(permissionResolver.resolvePermission(roleString));
    

然后你的 ini 配置也发生了一些变化:

rolePermissionResolver = org.apache.shiro.samples.web.SimpleRolePermissionResolver
activeDirectoryRealm.rolePermissionResolver = $rolePermissionResolver

【讨论】:

感谢您的详细回复,我一定会使用它。只是一个问题:事实上,如果我可以选择,我不需要任意角色/权限映射。用户在几个组中,组名是我要使用的角色。但据我所知,在骆驼 .policy() 中,我只能指定权限列表,而不能指定角色列表。我说的对吗? 我真的没有任何骆驼的经验,但是从 ShiroSecurityPolicy 看来,是的,你只能指定权限。但是,我已经编辑了答案以包含 SimpleRolePermissionResolver 的选项。这可能会更好地满足您的目的。 再次感谢您。我不明白只有一件事:使用上面的新代码,如果用户自动在组 X 中(没有 .ini),它也有角色 X,它可以使用我在 .ini 中指定的角色 X 的权限? 我相信你的问题是由 activeDirectoryRealm.groupRolesMap 解决的。但我可能误解了你的问题。 现在我完全理解了您的代码,它应该包含在官方 shiro 示例或 shiro 源代码中。我缺少的部分是,显然,activedirectoryRealm 没有权限概念,只有可以(可选且非自动)映射到角色的组。

以上是关于我在骆驼下使用 apache shiro,我无法使用 ldap/active 目录将组映射到角色的主要内容,如果未能解决你的问题,请参考以下文章

每个用户的最大用户会话数 - apache shiro

无法在 Apache Shiro 中设置成功 URL

如何从 HTML 页面使用 apache 骆驼休息端点上传 txt 文件

apache shiro 使用 Hashing Credentials 无法成功登录

Java EE 7基于数据库的Apache Shiro配置

Shiro:无法使 HttpSession 无效