Preskoči na glavno vsebino

Externá autorizácia

Ako vykonať externú autorizáciu cez API?

Avtor: Petr Pech

ABRA Flexi štandardne overuje používateľov voči internej databáze používateľov. Overovať je však možné aj proti externým systémom, napríklad LDAP. Na tieto účely existuje rozhranie v jazyku Java — takto napísaný kód pobeží ako súčasť servera a overenie zabezpečí za ABRA Flexi.

🚨 Toto rozhranie je experimentálne a v cloude ho použiť nemožno — vyžaduje vlastnú inštaláciu servera, do ktorej classpath sa doplní vaša knižnica. Ak chcete túto funkciu nasadiť, obráťte sa vopred na našu podporu.


Rozhranie cz.winstrom.auth.Auth

Základom všetkého je rozhranie 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);

...
}

⚠️ Pre priamu implementáciu vždy dediť od triedy cz.winstrom.auth.AuthBase alebo cz.winstrom.auth.AuthBaseV2. Umožní nám to rozhranie meniť a pritom zachovať spätnú kompatibilitu, prípadne vám preddefinovať niektoré metódy.


Vlastná implementácia

Samotná implementácia autorizačnej triedy môže vyzerať 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;
}
}


Dvojfázové overenie

ABRA Flexi podporuje zabezpečenie pomocou dvojfaktorovej autentizácie. Táto funkcionalita je k dispozícii v novšej triede cz.winstrom.auth.AuthBaseV2. Nasledujúci príklad predpokladá, že overovanie 2FA hesla necháte na predvolenej implementácii vo 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();
}
}


Nastavenie servera

Ktorú triedu má server použiť na overovanie, sa určuje voľbou authClass v súbore flexibee-server.xml (kde ho nájsť):

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

Doplňujúce súbory je nutné pridať do classpath. Na Linuxe to vykonáte tak, že v súbore /etc/default/flexibee odkomentujete a naplníte premennú CLASSPATH:

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


Súvisiace

Ste s tem dobili odgovor na svoje vprašanje?