Přeskočit na hlavní obsah
Externí autorizace

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

Petr Pech avatar
Autor: Petr Pech
Aktualizováno před více než 2 lety

Ekonomický systém ABRA Flexi 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:

cz.winstrom.auth.Auth</code>:</p>

<pre class="brush: java">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:
*
* &lt;entry key="authClass"&gt;cz.winstrom.auth.AuthSimple&lt;/entry&gt;
*
* 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á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 nebo cz.winstrom.auth.AuthBaseV2, 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 {

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

ABRA Flexi podporuje zabezpečení pomocí dvoufázového ověření. 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();
}
}

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, odkomentujete a naplníte proměnnou CLASSPATH:

CLASSPATH="cesta/ke/knihovne-1.0.jar:cesta/k/auth.jar"
Dostali jste odpověď na svou otázku?