Erlang OTP: hajautettujen ja vikasietoisten järjestelmien ohjelmointi · Oppitunti

Todentaminen ja käyttöoikeuksien hallinta

Toteuttakaa vankat todentamis- ja käyttöoikeuksien hallintamekanismit prosesseille ja käyttäjille, jotka käyttävät Erlang-palveluitanne.

Oppitunti 2/411 vaihetta

Todentaminen ja käyttöoikeuksien hallinta on ilmainen Erlang OTP: hajautettujen ja vikasietoisten järjestelmien ohjelmointi-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Erlang OTP: hajautettujen ja vikasietoisten järjestelmien ohjelmointi-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Erlang OTP: hajautettujen ja vikasietoisten järjestelmien ohjelmointi-kurssilla on yhteensä 4 oppituntia.

AuthN ja AuthZ selitetty

Hajautetuissa järjestelmissä on tietoturvan kannalta olennaista tietää, kuka käyttää palveluitanne ja mitä he saavat tehdä. Tässä tarvitaan todennusta ja valtuutusta.

  • Todennus (AuthN): Varmistaa käyttäjän tai prosessin henkilöllisyyden. Se vastaa kysymykseen "Kuka olet?"
  • Valtuutus (AuthZ): Määrittää, onko todennetulla käyttäjällä tai prosessilla lupa suorittaa tietty toiminto tai käyttää resurssia. Se vastaa kysymykseen "Mitä saat tehdä?"

Ne toimivat yhdessä Erlang-sovellustenne suojaamiseksi.

Käyttäjien tunnistaminen

Käyttäjän todentamisessa tarkistetaan yleensä tunnistetiedot, kuten käyttäjänimi ja salasana. Erlangissa voitte käyttää erillistä palvelua (usein GenServer-prosessia), joka vastaa käyttäjätilien hallinnasta ja kirjautumisyritysten tarkistamisesta.

Palvelu vastaanottaa kirjautumispyynnön, vertaa annettuja tunnistetietoja tallennettuihin tietoihin ja vastaa joko onnistumisesta tai epäonnistumisesta. Onnistuneen kirjautumisen jälkeen se voi antaa istuntotunnisteen tai tunnuksen.

Auth GenServerin rakentaminen

Luodaan hyvin yksinkertainen auth_service GenServerin avulla. Yksinkertaisuuden vuoksi se tallentaa kiinteästi määritetyn käyttäjän ja salasanan. Todellisessa järjestelmässä käyttäisitte tietokantaa ja tiivistäisitte salasanat turvallisesti.

auth_service-palvelussamme on login/2-funktio, jota asiakkaat voivat kutsua todentamista varten.

Suoritettava Auth-palvelu

Kokeilkaa tämän yksinkertaisen todennuspalvelun suorittamista. Kutsukaa funktioita auth_service:login("user", "pass") ja auth_service:login("wrong", "pass") nähdäksenne erilaiset vastaukset.

-module(auth_service).
-behaviour(gen_server).

-export([start_link/0, login/2]).
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
             terminate/2, code_change/3]).

% Client API
start_link() ->
    gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).

login(Username, Password) ->
    gen_server:call(?MODULE, {login, Username, Password}).

% GenServer Callbacks
init([]) ->
    % Store a simple user/pass for demonstration
    Users = #{<<"user">> => <<"pass">>},
    {ok, Users}.

handle_call({login, Username, Password}, _From, State) ->
    case maps:get(Username, State, undefined) of
        Password ->
            {reply, {ok, <<"authenticated">>}, State};
        _ ->
            {reply, {error, <<"invalid_credentials">>}, State}
    end;
handle_call(_Request, _From, State) ->
    {reply, {error, unknown_request}, State}.

handle_cast(_Msg, State) ->
    {noreply, State}.

handle_info(_Info, State) ->
    {noreply, State}.

terminate(_Reason, _State) ->
    ok.

code_change(_OldVsn, State, _Extra) ->
    {ok, State}.

Mitä saatte tehdä?

Kun käyttäjä on todennettu, seuraava vaihe on valtuutus. Siinä päätetään, mitä toimintoja käyttäjä saa suorittaa. Yleinen tapa hallita tätä on roolipohjainen käyttöoikeuksien hallinta (RBAC).

  • Roolit: Käyttöoikeuksien ryhmiä (esimerkiksi admin, editor, viewer).
  • Käyttöoikeudet: Yksittäisiä toimintoja (esimerkiksi create_post, edit_post, delete_post).

Käyttäjille määritetään rooleja ja rooleille määritetään käyttöoikeuksia.

Roolipohjainen käyttöoikeuksien hallinta

Voimme laajentaa auth_service-palvelua (tai käyttää erillistä palvelua) roolien ja käyttöoikeuksien hallintaa varten. Sen on tunnettava seuraavat asiat:

  • Mitä rooleja käyttäjällä on.
  • Mitä käyttöoikeuksia kukin rooli myöntää.

Kun palvelun on tarkistettava, voiko käyttäjä suorittaa toiminnon, se kysyy valtuutuspalvelulta.

RBAC:tä käyttävä Auth-palvelu

Tässä on päivitetty auth_service, joka sisältää yksinkertaisen RBAC-mekanismin. Se määrittelee roolit ja käyttöoikeudet sekä mahdollistaa sen tarkistamisen, onko käyttäjällä tietty käyttöoikeus.

Kokeilkaa kutsuja auth_service:check_permission("user", "read_data") ja auth_service:check_permission("user", "delete_data") kirjautumisen jälkeen.

-module(auth_service).
-behaviour(gen_server).

-export([start_link/0, login/2, check_permission/2]).
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
             terminate/2, code_change/3]).

% Client API
start_link() ->
    gen_server:start_link({local, ?MODULE}, ?MODULE, [], []).

login(Username, Password) ->
    gen_server:call(?MODULE, {login, Username, Password}).

check_permission(Username, Permission) ->
    gen_server:call(?MODULE, {check_permission, Username, Permission}).

% GenServer Callbacks
init([]) ->
    Users = #{
        <<"user">> => #{
            password => <<"pass">>,
            roles => [<<"viewer">>, <<"editor">>]
        },
        <<"admin">> => #{
            password => <<"admin_pass">>,
            roles => [<<"admin">>, <<"viewer">>]
        }
    },
    Roles = #{
        <<"viewer">> => [<<"read_data">>],
        <<"editor">> => [<<"read_data">>, <<"write_data">>],
        <<"admin">> => [<<"read_data">>, <<"write_data">>, <<"delete_data">>]
    },
    {ok, #{users => Users, roles => Roles}}.

handle_call({login, Username, Password}, _From, State) ->
    Users = maps:get(users, State),
    case maps:get(Username, Users, undefined) of
        #{password := Password} ->
            {reply, {ok, <<"authenticated">>}, State};
        _ ->
            {reply, {error, <<"invalid_credentials">>}, State}
    end;

handle_call({check_permission, Username, Permission}, _From, State) ->
    Users = maps:get(users, State),
    Roles = maps:get(roles, State),
    case maps:get(Username, Users, undefined) of
        #{roles := UserRoles} ->
            HasPermission = lists:any(
                fun(Role) ->
                    case maps:get(Role, Roles, []) of
                        RolePermissions when is_list(RolePermissions) ->
                            lists:member(Permission, RolePermissions);
                        _ -> false
                    end
                end,
                UserRoles
            ),
            {reply, HasPermission, State};
        _ ->
            {reply, false, State} % User not found or not authenticated
    end;

handle_call(_Request, _From, State) ->
    {reply, {error, unknown_request}, State}.

handle_cast(_Msg, State) ->
    {noreply, State}.

handle_info(_Info, State) ->
    {noreply, State}.

terminate(_Reason, _State) ->
    ok.

code_change(_OldVsn, State, _Extra) ->
    {ok, State}.

Palvelujenne suojaaminen

Kun käytössänne on todennus- ja valtuutuspalvelu, järjestelmän muut palvelut voivat käyttää sitä. Tyypillinen työnkulku on seuraava:

  1. Asiakas todentaa itsensä: Kutsuu funktiota auth_service:login/2.
  2. Istunto/tunnus vastaanotetaan: Onnistuneen todennuksen jälkeen asiakas saa istuntotunnisteen tai tunnuksen (esimerkiksi prosessitunnisteen tai monimutkaisemman JWT:n).
  3. Asiakas tekee valtuutetun pyynnön: Kutsuessaan toista palvelua (esimerkiksi data_service) asiakas lähettää istunto- tai tunnistetietonsa sekä suoritettavan toiminnon.
  4. Palvelu valtuuttaa pyynnön: data_service kutsuu funktiota auth_service:check_permission/2 käyttäen asiakkaan henkilöllisyyttä ja pyydettyä toimintoa.
  5. Palvelu vastaa: Jos toiminto on valtuutettu, se suoritetaan. Muussa tapauksessa palautetaan virhe.

Perustason todennusta pidemmälle

Vaikka esimerkkimme ovat yksinkertaisia, todelliset järjestelmät tarvitsevat muutakin:

  • Salasanojen tiivistäminen: Älkää koskaan tallentako salasanoja selväkielisinä. Käyttäkää vahvoja tiivistealgoritmeja, kuten bcrypt tai pbkdf2.
  • Istuntojen hallinta: Luokaa, tallentakaa ja vahvistakaa istuntotunnisteet turvallisesti. Varmistakaa, että ne vanhenevat ja että ne voidaan mitätöidä.
  • Auditointi: Kirjatkaa kaikki todennusyritykset ja valtuutustarkistukset tietoturvan valvontaa ja rikosteknistä tutkintaa varten.
  • Ulkoiset identiteetintarjoajat: Integroikaa OAuth2/OpenID Connect kertakirjautumista varten.

Erlangin samanaikaisuusominaisuudet tekevät siitä erinomaisen alustan vankkojen todennuspalveluiden rakentamiseen.

AuthN:n ja AuthZ:n tarkistus

Ajatellaan käyttäjää, joka yrittää käyttää suojattua asiakirjaa Erlang-sovelluksessa.

Kertaus: palveluiden suojaaminen

Käsittelimme Erlangin todennuksen ja valtuutuksen perusteet:

  • Todennus (AuthN) varmistaa henkilöllisyyden ("Kuka olet?").
  • Valtuutus (AuthZ) määrittää käyttöoikeudet ("Mitä saat tehdä?").
  • Rakensimme yksinkertaisen auth_service-palvelun GenServerin avulla käyttäjien kirjautumista ja roolipohjaista käyttöoikeuksien hallintaa (RBAC) varten.
  • Näiden palveluiden integroinnin ymmärtäminen on tärkeää suojattujen ja vankkojen hajautettujen Erlang-sovellusten rakentamisessa.

Seuraavaksi tutustukaa siihen, miten itse arkaluonteisia tietoja suojataan Erlang-sovelluksissanne.

Aloita maksutta

Opi Erlang tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
12
Oppitunnit
48

Usein kysytyt kysymykset

Onko oppitunti ”Todentaminen ja käyttöoikeuksien hallinta” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Erlang OTP: hajautettujen ja vikasietoisten järjestelmien ohjelmointi-oppimispolun 3 oppituntia, myös oppitunnin “Todentaminen ja käyttöoikeuksien hallinta”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Erlang OTP: hajautettujen ja vikasietoisten järjestelmien ohjelmointi-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Todentaminen ja käyttöoikeuksien hallinta”?

Toteuttakaa vankat todentamis- ja käyttöoikeuksien hallintamekanismit prosesseille ja käyttäjille, jotka käyttävät Erlang-palveluitanne. Harjoittelet Erlang OTP: hajautettujen ja vikasietoisten järjestelmien ohjelmointi-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Erlang OTP: hajautettujen ja vikasietoisten järjestelmien ohjelmointi-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Erlang OTP: hajautettujen ja vikasietoisten järjestelmien ohjelmointi-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.

Kuinka kauan ”Todentaminen ja käyttöoikeuksien hallinta”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Erlang OTP: hajautettujen ja vikasietoisten järjestelmien ohjelmointi-oppitunnilla?

Kyllä. Jokainen Erlang OTP: hajautettujen ja vikasietoisten järjestelmien ohjelmointi-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Suojattu solmujen välinen viestintä (TLS)
  2. Todentaminen ja käyttöoikeuksien hallinta
  3. Arkaluonteisten tietojen suojaaminen
  4. Hajautuksen cookien ja solmupääsyn vahvistaminen
← Takaisin: Erlang OTP: hajautettujen ja vikasietoisten järjestelmien ohjelmointi