Přeskočit na hlavní obsah

Externí autorizace

Jak přes API provést externí autorizaci?

Autor: Petr Pech

ABRA Flexi normálně ověřuje uživatele vůči interní databázi uživatelů. Ověřovat je ale možné i proti externím systémům, například LDAP. Pro tyto účely existuje rozhraní v jazyce Java — takto napsaný kód poběží jako součást serveru a ověření obstará za ABRA Flexi.

🚨 Toto rozhraní je experimentální a v cloudu jej použít nelze — vyžaduje vlastní instalaci serveru, do jejíž classpath se doplní vaše knihovna. Chcete-li funkci nasadit, obraťte se předem na naši podporu.


Rozhraní cz.winstrom.auth.Auth

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ů ABRA Flexi. 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ázi
* 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ěly 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);

...
}

⚠️ Pro přímou implementaci vždy děďte od třídy cz.winstrom.auth.AuthBase nebo cz.winstrom.auth.AuthBaseV2. Umožní nám to rozhraní měnit a přitom zachovat zpětnou kompatibilitu, případně vám předimplementovat některé metody.


Vlastní implementace

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

public class AuthSimple extends AuthBase {

@Override
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;
}
}


Dvoufázové ověření

ABRA Flexi podporuje zabezpečení pomocí dvoufaktorové autentizace. Tato funkcionalita je k dispozici v novější třídě cz.winstrom.auth.AuthBaseV2. Následující příklad předpokládá, že ověřování 2FA hesla necháte na výchozí implementaci ve Flexi:

public class OTPAuth extends AuthBaseV2 {

@Override
public boolean authenticate(UserAuthenticationFacade facade, String password, String otp) throws WSNotAuthorizedException, WSBlockedException {
String username = facade.getUsername();
return username.equals("admin") && password.equals("admin") && facade.verifyOtp(otp);
}

@Override
public boolean isTwoPhaseAuthEnabled(UserAuthenticationFacade facade, String username) {

final UserInfo userInfo = facade.getUserInfo();
return userInfo.isTwoPhaseAuthEnabled();
}
}


Nastavení serveru

Kterou třídu má server pro ověřování použít, se určuje volbou authClass v souboru flexibee-server.xml (kde jej najít):

<entry key="authClass">cz.winstrom.auth.AuthSimple</entry>

Doplňující soubory je nutné přidat do classpath. Na Linuxu to provedete tak, že v souboru /etc/default/flexibee odkomentujete a naplníte proměnnou CLASSPATH:

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


Související

Dostali jste odpověď na svou otázku?