簡體   English   中英

Jaas JDBC 認證

[英]Jaas JDBC Authentication

我們的項目由一個 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;
    }
}

回調處理程序:

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 Realm Image

如果您期望通過調用AuthenticationService#login您將登錄(驗證)Java EE 服務器(Payara),那么這絕對是錯誤的方法。

在調用lc.login(); Java EE 服務器絲毫不知道該調用。 使用 new 運算符實例化的隨機LoginContext不會神奇地連接到 Java EE 環境。

如果您進行遠程 EJB 調用,則需要通過該調用(來自 JavaFx 應用程序)提供身份驗證數據,然后以 GlassFish/Payara 特定方式為(遠程)EJB 配置身份驗證。 與 Servlet 不同,Java EE 中沒有標准的方法來驗證 EJB(對於 Servlet,您將為此使用 JASPIC)。

也沒有標准LoginModule這樣的東西。 GlassFish 確實使用了LoginModule接口,但是以一種高度特定於 GlassFish 的方式。 如果您只想使用 JDBC 領域(領域是此處“身份存儲”的另一個術語,它是“登錄模塊”的另一個術語),您“僅”需要使用 glassfish 特定的glassfish-ejb-jar.xml對其進行配置文件。 不幸的是,幾乎沒有人知道如何准確地做到這一點,但我認為您需要查看ior-security-config並從那里進行研究。

或者,您可以使用ProgrammaticLogin類,它是 GlassFish 特定的 EJB,相當於標准HttpServletRequest#login

請參閱Java EE 6 應用程序客戶端登錄

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM