当前位置: 首页 > 知识库问答 >
问题:

Apache Shiro-使用cn以外的属性进行身份验证?

蔺弘
2023-03-14

我正在尝试在我们的项目中使用Apache Shiro进行Active Directory领域的身份验证和授权。当我使用用户CN属性进行身份验证时效果很好,但是,我想使用另一个唯一属性进行登录。是否可以将shiro配置为这样做?

这是我的西罗。ini文件:

    [main]
    shiro.loginUrl = /login.jsp
    activeDirectoryRealm = org.apache.shiro.realm.activedirectory.ActiveDirectoryRealm
    activeDirectoryRealm.systemUsername = admin
    activeDirectoryRealm.systemPassword = secret
    activeDirectoryRealm.searchBase = DC=company,DC=private
    activeDirectoryRealm.url = ldap://url:389

以及登录代码:

    public void login(String uname, String pwd, boolean rememberMe) {
            Factory<SecurityManager> ldapFactory = new IniSecurityManagerFactory("classpath:shiro.ini");
            SecurityManager sManager = ldapFactory.getInstance();
            SecurityUtils.setSecurityManager(sManager);
            Subject currentUser = SecurityUtils.getSubject();
            if (!currentUser.isAuthenticated()) {
                uname = "CN=" + uname + ",OU=Users";
                UsernamePasswordToken token = new UsernamePasswordToken(uname, pwd);
                token.setRememberMe(rememberMe);
                try {
                    currentUser.login(token);
                } catch (UnknownAccountException ex) {
                    logger.info("Unknown user");
                } catch (IncorrectCredentialsException ex) {
                    logger.info("Incorrect credentials");
                } catch (LockedAccountException ex) {
                    logger.info("Account is locked");
                } catch (AuthenticationException ex) {
                    ex.printStackTrace();
                }
            }
        }

如果我换线

    uname = "CN=" + uname + ",OU=Users";

到以下

    uname = "myCustomAttribute=" + uname + ",OU=Users";

试着用它登录,我得到了

    javax.naming.AuthenticationException: [LDAP: error code 49 - 80090308: LdapErr: DSID-0C0903A9, comment: AcceptSecurityContext error, data 52e, v1db1 ]

谢谢你的回答。

共有1个答案

相德宇
2023-03-14

好的,我已经通过创建一个自定义的MyJndiLdapRealm扩展JndiLdapRealm和覆盖方法来做到这一点

protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token){}

但如果你有更好的解决方案,我仍然欢迎你的回答。

 类似资料:
  • 我正在尝试通过连接到LDAP使用Spring Security进行我的第一个演示。 我使用的Sping版本是:3.1.0.RELEASE 以下是我的security-integration.xml: 然而,每当我部署我的战争时,我都会遇到这个例外: HTTP状态500 - 类型异常报告 消息 描述服务器遇到一个内部错误(),该错误阻止它完成此请求。 例外情况 javax.servlet。Servl

  • 我正在尝试使用urllib3连接到网页。代码如下所示。 如果我们假设url是需要使用用户名和密码进行身份验证的某个网页,那么我是否使用正确的代码进行身份验证? 我使用urllib2做这件事很舒服,但使用urllib3做不到同样的事情。 非常感谢

  • jwt不应该仅仅用于认证用户吗?我读到过可以在里面存储非敏感的东西,比如用户ID。将权限级别之类的东西存储在令牌中可以吗?这样我可以避免数据库调用。

  • 问题内容: 我可以通过接收到请求的xml 但不是 没有JavaScript错误,没有跨域策略问题。可能是语法错误,但是我找不到合适的教程。有什么建议吗? 问题答案: 我认为您需要纯格式:

  • 问题内容: 我有一个Java应用程序正在尝试通过http代理访问Web服务。Java应用程序是第三方应用程序,我们无法访问其源代码。 可以通过传递Java启动参数等来配置其启动。我想知道一个可以传递的Java属性是什么,以便应用程序可以使用登录用户的NTLM凭据来验证代理连接? 当我传递https.proxyHost和https.proxyPort(即-Dhttps.proxyHost = abc

  • 在这里尝试看看是否有人已经用Rundeck对AD进行了LDAP身份验证。我正在使用RunDesk的JRE运行方法。以下是我到目前为止所做的工作: 我已经设置了jaas-ldap.conf,如Rundeck authentication users页面所示 我已向管理员请求ssl证书。要使用ldaps,rundeck需要ssl证书,这是在他们的站点上编写的。获得证书后,他们提到以下两个步骤: 一旦获