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

贾斯 JDBC 身份验证

孙成益
2023-03-14

我们的项目包括一个JavaFX应用程序,它通过RMI协议调用JEE服务器。我们使用Payara应用服务器,一个Glassfish分叉。我们想使用带有数据库的JAAS来管理授权给用户的身份验证和权限。

我们不了解如何将创建的JDBC领域与我们的应用程序绑定以与数据库交互。

我们可以像这里一样以编程方式调用领域或直接查询数据库吗?

启动LoginContext的服务:

@Stateless
public class AuthenticationService implements IAuthenticationService {
    @Override
    public boolean login(User user) {
        try {
            LoginContext lc = new LoginContext(
                "JDBCLoginModule",
                new JDBCCallbackHandler(user.getUsername(), user.getPassword())
            );

            lc.login();

            Subject subject = lc.getSubject();

            return true;

        } catch (LoginException ex) {
            ex.printStacktrace();
        }
        return false;
    }
}

登录模块:

public class JDBCLoginModule implements LoginModule {
    private Subject subject;
    private CallbackHandler callbackHandler;
    private Map sharedState;
    private Map options;

    private boolean succeeded = false;

    @Override
    public void initialize(Subject subject, CallbackHandler callbackHandler, Map<String, ?> sharedState, Map<String, ?> options) {
        this.subject            = subject;
        this.callbackHandler    = callbackHandler;
        this.sharedState        = sharedState;
        this.options            = options;
        succeeded               = false;
    }

    @Override
    public boolean login() throws LoginException {
        if (callbackHandler == null)
            throw new LoginException("The callbackHandler is null");

        Callback[] callbacks = new Callback[2];
        callbacks[0] = new NameCallback("name:");
        callbacks[1] = new PasswordCallback("password:", false);

        try {
            callbackHandler.handle(callbacks);
        } catch (IOException e) {
            throw new LoginException("IOException calling handle on callbackHandler");
        }
        catch (UnsupportedCallbackException e) {
            throw new LoginException("UnsupportedCallbackException calling handle on callbackHandler");
        }

        NameCallback nameCallback           = (NameCallback) callbacks[0];
        PasswordCallback passwordCallback   = (PasswordCallback) callbacks[1];

        String name = nameCallback.getName();
        String password = new String(passwordCallback.getPassword());

        // Call the JDBC Realm
        /*if ("myName".equals(name) && "myPassword".equals(password)) {
            succeeded = true;
            return succeeded;
        }
        else {
            succeeded = false;
            throw new FailedLoginException("Sorry! No login for you.");
        }*/
    }

    @Override
    public boolean commit() throws LoginException {
        return succeeded;
    }

    @Override
    public boolean abort() throws LoginException {
        return false;
    }

    @Override
    public boolean logout() throws LoginException {
        return false;
    }
}

CallBackHandler:

public class JDBCCallbackHandler implements CallbackHandler {
    private final String username;
    private final String password;

    public JDBCCallbackHandler(String username, String password) {
        this.username = username;
        this.password = password;
    }

    @Override
    public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
        for (int i = 0; i < callbacks.length; i++) {
            if (callbacks[i] instanceof NameCallback) {
                NameCallback nameCallback = (NameCallback) callbacks[i];
                nameCallback.setName(username);
            }
            else if (callbacks[i] instanceof PasswordCallback) {
                PasswordCallback passwordCallback = (PasswordCallback) callbacks[i];
                passwordCallback.setPassword(password.toCharArray());
            }
            else {
                throw new UnsupportedCallbackException(callbacks[i], "The submitted Callback is unsupported");
            }
        }
    }
}

我们在应用服务器上创建了一个JDBC领域:JDBC领域图像

共有1个答案

潘彦
2023-03-14

如果您期望通过调用AuthenticationService#login您将登录(经过身份验证)JavaEE服务器(Payara),那么这绝对是错误的方法。

在调用< code>lc.login()之后; Java EE服务器根本不知道该调用。用new操作符实例化的随机< code>LoginContext不会神奇地连接到Java EE环境。

如果您正在进行远程EJB调用,您需要为该调用提供身份验证数据(从JavaFx应用程序),然后以GlassFish/Payara特定的方式为(远程)EJB配置身份验证。与servlet相反,Java EE中没有标准的方法来验证EJB(对于servlet,您可以使用JASPIC来实现)。

也没有标准的< code >登录模块。GlassFish确实使用了< code>LoginModule接口,但是以一种高度特定于GlassFish的方式。如果您只想使用JDBC领域(领域是“身份存储”的另一个术语,也是“登录模块”的另一个术语),您“只”需要使用glassfish specific glassfish-EJ b-jar . XML文件进行配置。不幸的是,几乎没有人知道如何确切地做到这一点,但我认为您需要查看< code>ior-security-config并从那里开始研究。

或者,您可以使用ProgrammaticLogin类,它是特定于GlassFish的EJB,相当于标准的HttpServletRequest#login。

请参阅JavaEE 6 Application Client登录

 类似资料:
  • 使用这个例子,我的连接几乎可以工作 http://blogs.nologin.es/rickyepoderi/index.php?/archives/105-oracle-driver-and-kerberos.html 我使用的是Java7,但使用另一个没有问题。有没有一种方法可以用jvm正确读取票证(参见jdk中的kinit不要创建正确的票证)

  • 我正在进行JDBC身份验证,当我尝试访问API时,它会在不询问用户名和密码的情况下给出“禁止”。 这是我的安全配置。 当我给出正确的身份验证时,我无法登录,错误是, 模型实体为: 数据库中的条目是 用户表 user_id名密码 1 jack 角色表 role_id角色 1 ADMIN 2 USER 3 LEAD user_role表 user_idrole_id 1 1 1 2 1 3

  • 我正在尝试让JDBC身份验证与我的小辅助项目一起工作,从表面上看,它应该可以工作,但它没有。所有的配置都遵循贝娄。 如果我切换到具有相同用户名/密码的inMemory身份验证,它就会非常工作。 这是我记录输出时得到的结果:

  • 我正在尝试使用smtplib在python 2.7中发送邮件。下面的代码非常简单: 现在当我执行下面的代码时,我不断得到这个异常:

  • 问题内容: 大家好,我想创建一个与jdbc领域和自定义登录表单(基于表单的身份验证登录约束方法)捆绑在一起的应用程序登录功能。 请提供链接或任何帮助,我们将不胜感激。 请帮忙。 谢谢。 问题答案: 您使用哪种容器?jBoss?Tomcat?Derby? 您还需要使用持久性存储->是,需要DBMS。它是哪一个?MySQL,Sysbase,Oracle PL / SQL,MS SQL? 此处提供了可供

  • 身份验证 PDF版下载 企业应用中的URL链接可以通过OAuth2.0验证接口来获取员工的身份信息。 通过此接口获取员工身份会有一定的时间开销。对于频繁获取员工身份的场景,建议采用如下方案: 企业应用中的URL链接直接填写企业自己的页面地址; 员工跳转到企业页面时,企业校验是否有代表员工身份的cookie,此cookie由企业生成; 如果没有获取到cookie,重定向到OAuth验证链接,获取员工