Externí autorizace

Ekonomický systém FlexiBee normálně ověřuje uživatele vůči interní databázi uživatelů. Je samozřejmě možné ověřovat i proti externím systémům (např. LDAP). Pro tyto účely jsme připravili rozhraní v Jazyce Java, které Vám toto umožní. Takto napsaný kód pak poběží jako součást serveru a umožní ověření proti externím systémům.

Pozor: toto rozhraní je experimentální a není jej možné používat v cloudu. Pokud budete chtít tuto funkci použít, kontaktujte nás.

Základem všeho je rozhraní cz.winstrom.auth.Auth:

package cz.winstrom.auth;

import cz.winstrom.vo.UserInfo;
import java.sql.Connection;

/**
 *
 * Základní rozhraní pro ověřování uživatelů proti jiným službám. Její nastavení se provede pomocí nastavení flexibee-server.xml:
 *
 * <entry key="authClass">cz.winstrom.auth.AuthSimple</entry>
 *
 * Jako parametr je zde název třídy, kterou je nutné dostat do CLASSPATH serveru.
 *
 * V tuto chvíli umí aplikace pouze ověření plain heslem. 
 *
 * Kvůli změnám v tomto rozhraní doporučujeme, aby implementátoři dědily od abstraktní třídy "AuthBase".
 *
 * @author fers
 */
public interface Auth {
    /**
     * Autorizuj uživatele dle jména a hesla.
     *
     * @param connection napojení do databáze centralServer
     * @param userInfo informace o uživateli z centralServer.csuzivatel. Pokud je null, žádný takový uživatel neexistuje v hlavní databázi uživatelů FlexiBee. Při úspěšné autorizaci bude vytvořen.
     * @param username jméno uživatele
     * @param password heslo uživatele
     * @return true pokud bylo heslo zadáno správně.
     */
    boolean authenticate(Connection connection, UserInfo userInfo, String username, String password);

    /**
     * Pokud se povede autorizace, ale uživatel neexistuje v databází centralServer.csuzivatel, bude založen. Autorizační systém může ovlivnit informace o založeném uživateli tím,
     * že vyplní třídu UserInfo.
     *
     * ID se nesmí měnit (má hodnotu -1) i heslo doporučujeme nevyplňovat, protože ověření proběhne vždy vúči autorizačnímu systému.
     *
     * Obvykle se vyplňují pouze přístupová práva (založení firmy, smazání firmy, ...)
     *
     * @param connection napojení do databáze centralServer
     * @param userInfo informace o uživateli, které by měli být vráceny (může být vrácena i jiná instance, ale musí být správně vyplněna.
     * @return informace o uživateli, které budou uloženy do databáze. Obvykle se vrací upravený parametr userInfo.
     */
    public UserInfo getUserInfo(Connection connection, UserInfo userInfo);
}

Nicméně pro přímou implementaci používejte vždy dědění od třídy cz.winstrom.auth.AuthBase, která nám umožní měnit toto rozhraní a přitom zachovat zpětnou kompatibilitu, případně předimplementovat některé metody.

Samotná implementace autorizační třídy může vypadat takto:

public class AuthSimple extends AuthBase {

    public boolean authenticate(Connection connection, UserInfo userInfo, String username, String password) {
	// jednoduché ověření: jméno a heslo se rovnají 
        return username.equalsIgnoreCase(password);
    }

    @Override
    public UserInfo getUserInfo(Connection connection, UserInfo userInfo) {
        userInfo.setCreateCompany(true); // novému uživateli povolíme založení firmy

        return userInfo;
    }
}

A pro kompletnost už jen výchozí implementace ověřování z FlexiBee serveru:

/**
 * Základní ověřovací mechanizmus, který používá obvykle FlexiBee. Ověřuje jméno a heslo oproti tabulce centralServer.csuzivatel.
 */
public class AuthDefault extends AuthBase {
    
    /**
     * Ověří uživatele podle hesla v centralServer.csuzivatel.
     * Pokud uživatel neexistuje, je userInfo null.
     *
     * @param connection
     * @param userInfo
     * @param username
     * @param password
     * @return
     */
    public boolean authenticate(Connection connection, UserInfo userInfo, String username, String password) {
        if (userInfo == null) {
            return false;
        }

        String md5password = DigestUtils.md5Hex(password);
        if (!md5password.equalsIgnoreCase(userInfo.getHeslo())) {
            return false;
        }

        return true;
    }
}

To, jaká třída se má použít pro ověřování serveru se určuje pomocí proměnné <entry key="authClass">cz.winstrom.auth.AuthSimple</entry> v souboru flexibee-server.xml.

Doplňující soubory je nutné přidat do classpath. To např. na Linuxu můžete provést tak, že upravíte soubor /etc/default/flexibee a přidáte proměnnou CLASSPATH:

export CLASSPATH="cesta/ke/knihovne-1.0.jar:cesta/k/auth.jar"