Apache Shiro — LDAP для аутентификации и Properties/Ini для авторизации

Я пытаюсь добавить некоторые функции аутентификации и авторизации в свое небольшое веб-приложение. поэтому я использую apache shiro.

мой план: использование существующего сервера ldap для аутентификации пользователей и использование свойств или файла ini для авторизации.

вот небольшой пример: пользователь x хочет использовать приложение он вводит свое имя пользователя и пароль сервер ldap используется для аутентификации --> user + pwd правильно? если аутентификация проверена и верна, файл свойств или файл ini используется для проверки того, разрешено ли пользователю запускать некоторые функции внутри приложения.

Я надеюсь, вы знаете, что я пытаюсь сделать.

теперь я не уверен, как реализовать эту функцию. достаточно ли использовать ini-файл или необходимо реализовать мою собственную область?! есть пример реализации?

я благодарен за каждую информацию

и извините за мой плохой английский :/


person Phi    schedule 08.12.2015    source источник


Ответы (1)


Да, вам нужно реализовать область, но это не сложно. Вам просто нужно расширить JndiLdapRealm и переопределить метод queryForAuthorizationInfo.

Этот метод возвращает тип интерфейса AuthorizationInfo. В вашем случае проще всего вернуть экземпляр SimpleAuthorizationInfo, который реализует этот интерфейс.

Вы должны инициализировать AuthorizationInfo с ролями и/или разрешениями для аутентифицированного пользователя. При вызове этого метода пользователь уже аутентифицирован, но не авторизован.

Внутри этого метода вы можете прочитать информацию об авторизации из любого источника данных, который вы хотите, это могут быть свойства или ini-файл, свойства, связанные с пользователем на сервере LDAP, база данных или что-либо, что вам нравится.

Реализация области может быть:

package example.shiro.realm.ldap;

import javax.naming.NamingException;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.ldap.JndiLdapRealm;
import org.apache.shiro.realm.ldap.LdapContextFactory;
import org.apache.shiro.subject.PrincipalCollection;

public class JndiLdapAuthzRealm extends JndiLdapRealm {

    private List<String> getRoles(String userName) {
        List<String> roles = new ArrayList<>();
        // TODO: get roles from data source and fill list
        roles.add("user");
        roles.add("admin");
        return roles;
    }

    private List<String> getPermissions(String userName) {
        List<String> perms = new ArrayList<>();
        // TODO: get permissions from data source and fill list
        perms.add("myapp:run");
        perms.add("myapp:file:create");
        return perms;
    }

    @Override
    protected AuthorizationInfo queryForAuthorizationInfo(PrincipalCollection principals,
            LdapContextFactory ldapContextFactory) throws NamingException {
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        String userName = principals.getPrimaryPrincipal().toString();
        info.addRoles(getRoles(userName));
        info.addStringPermissions(getPermissions(userName));
        return info;
    }
}

В вашем случае перепишите getRoles и getPermissions, чтобы получить роли и разрешения для аутентифицированного пользователя из свойств или ini-файла.

In shiro.ini:

[main]

ldapRealm = example.shiro.realm.ldap.JndiLdapAuthzRealm
ldapRealm.userDnTemplate = uid={0},cn=users,cn=accounts,dc=example,dc=com
ldapRealm.contextFactory.url = ldap://192.168.0.10
person whbogado    schedule 17.01.2016