2

shiro と camel を使用しています。ActiveDirectory (ldap) を使用してユーザーを認証できますが、ロール内のユーザー グループをユーザー権限にマップできません。また、camel が機能するには絶対的なアクセス許可が必要です。

ここに私の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"); 

ありがとう、マリオ

4

1 に答える 1

6

したがって、shiro のレルムは 3 つのことを提供します。

  1. ユーザーを認証する
  2. ユーザーを役割にマップする
  3. ユーザーを権限にマップする

行わないのは、任意の役割 -> 権限のマッピングを提供することです。このためには、Active Directory レルムに 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
于 2012-05-21T23:44:59.033 に答える