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