jndi Authentication在普通java类中失败,但在spring中通过

5n0oy7gb  于 2021-07-14  发布在  Java
关注(0)|答案(0)|浏览(232)

这可能听起来很傻,但我遇到了这种行为。我正在使用jndi进行ldap身份验证。我有一个演示程序设置,其中身份验证在提供不正确的凭据时失败,但在spring控制器方法中似乎也是如此(我正在从react应用程序进行post调用)。
纯java实现

import java.util.Properties;

import javax.naming.NamingException;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;

public class Demo {

    public static void main(String[] args) {
        Properties environment = new Properties();
        String userDomain = "@region.company.net";
        environment.setProperty(DirContext.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
        environment.setProperty(DirContext.PROVIDER_URL, "ldap://region.company.net:3268");
        environment.setProperty(DirContext.SECURITY_AUTHENTICATION, "simple");
        environment.setProperty(DirContext.SECURITY_PRINCIPAL, "userId"+userDomain);
        environment.setProperty(DirContext.SECURITY_CREDENTIALS, "wrongPassword");

        try {
            DirContext context = new InitialDirContext(environment);
            System.out.println("Authentication Successful !!!\n\n");
        } catch (NamingException e) {
            System.out.println("Authentication Failed !!!\n\n");
            e.printStackTrace();
        }
    }

}

控制器实现

@PostMapping("/authenticateUser")
    public String authenticateUser(@RequestBody HashMap<String, String> user) {
        Properties environment = new Properties();
        String userDomain = "@region.company.net";
        environment.setProperty(DirContext.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
        environment.setProperty(DirContext.PROVIDER_URL, "ldap://region.company.net:3268");
        environment.setProperty(DirContext.SECURITY_AUTHENTICATION, "simple");
    //  environment.setProperty(DirContext.SECURITY_PRINCIPAL, "userId"+userDomain);
        environment.setProperty(DirContext.SECURITY_CREDENTIALS, "wrongPassword");

        try {
            DirContext context = new InitialDirContext(environment);
            System.out.println("Authentication Successful !!!\n\n");
        } catch (NamingException e) {
            System.out.println("Authentication Failed !!!\n\n");
            e.printStackTrace();
        }
        return "Method executed successfully";

    }

在提供了错误的密码之后,如果我执行这个代码,它就会打印出来 Authentication Failed !!! 这是预期的,但当我在控制器的方法中插入相同的代码时,它会打印出来 Authentication Successful !!! .
两个人的行为不应该是一样的吗?我觉得这种行为很奇怪。也许,我忽略了什么?
编辑1:开始
它显示了设置 SECURITY_PRINCIPAL 在Spring控制器的情况下被注解掉了。我已经注解掉了那部分代码。这就引出了另一个问题,为什么它从来没有抛出任何异常?不知道我是否应该在另一个帖子里问这个问题。
通过传递进行身份验证是否合适 Username (就像@xyz.com)作为 SECURRITY_PRINCIPAL 还是应该通过入口通道?
编辑1:结束

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题