2015-12-08 3 views
0

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

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

here's небольшой пример: пользователь А хочет использовать приложение он вводит его имя пользователя и его пароль сервер LDAP используется для проверки подлинности -> пользователь + PWD правильно? Если аутентификация проверена и исправлена, файл свойств или файл ini используются для проверки того, разрешен ли пользователь, для запуска некоторых функций внутри приложения.

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

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

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

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

ответ

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, чтобы получить роли и разрешение для идентифицированного пользователя из свойств или ини файла.

В 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 
Смежные вопросы