Apache Shiro - 用于身份验证和属性的LDAP /用于授权的Ini

时间:2015-12-08 09:14:55

标签: apache authentication authorization shiro jdbcrealm

我正在尝试为我的小型Web应用程序添加一些身份验证和授权功能。因此,我正在使用apache shiro。

我的计划:使用现有的ldap服务器进行用户身份验证,并使用属性或ini文件进行授权。

这是一个小例子: 用户x想要使用该应用程序 他输入了用户名和密码 ldap服务器用于身份验证 - >用户+ pwd正确吗? 如果验证验证正确,则使用属性文件或ini文件检查是否允许用户,以启动应用程序内的某些功能。

我希望你知道我想做什么。

现在我不确定如何实现此功能。是否足以使用ini文件或是否需要实现我自己的领域?!是否有一个示例实现?

我很感激每一个信息

抱歉我的英语不好:/

1 个答案:

答案 0 :(得分: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;
    }
}

在您的情况下,重写getRolesgetPermissions以从属性或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