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

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

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

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

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

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

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

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

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-файла.

В 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
Другие вопросы по тегам