【问题标题】:Apache Shiro - LDAP for Authentication and Properties/Ini for AuthorizationApache Shiro - 用于身份验证和属性的 LDAP/用于授权的 Ini
【发布时间】:2016-03-13 03:24:40
【问题描述】:

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

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

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

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

现在我不确定如何实现此功能。使用ini文件就足够了还是需要实现我自己的领域?!有示例实现吗?

感谢所有信息

对不起我的英语不好:/

【问题讨论】:

    标签: apache authentication authorization shiro jdbcrealm


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2015-12-24
      • 2017-10-18
      • 2014-07-17
      • 2020-09-27
      • 2018-02-22
      • 1970-01-01
      • 2015-05-12
      • 2011-11-19
      • 1970-01-01
      相关资源
      最近更新 更多