Spring Security 6 ja JWT-todennus · Oppitunti

Roolipohjainen käyttöoikeuksien hallinta (RBAC)

Toteuttakaa roolipohjainen valtuutus, jolla käyttö tiettyihin resursseihin rajataan käyttäjäroolien ja käyttöoikeuksien perusteella.

Oppitunti 1/412 vaihetta

Roolipohjainen käyttöoikeuksien hallinta (RBAC) on ilmainen Spring Security 6 ja JWT-todennus-oppitunti CoddyKitissä. Tämä on oppitunti 1/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 Spring Security 6 ja JWT-todennus-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Spring Security 6 ja JWT-todennus-kurssilla on yhteensä 4 oppituntia.

RBAC:n perusteiden ymmärtäminen

Tervetuloa! Perehdymme tänään roolipohjaiseen käyttöoikeuksien hallintaan (Role-Based Access Control, RBAC). Se on keskeinen tietoturvakonsepti, jolla hallitaan, kuka voi tehdä sovelluksessa mitäkin.

Kuvitelkaa koulu: oppilaat voivat tarkastella arvosanoja, opettajat voivat julkaista arvosanoja ja ylläpitäjät voivat hallita kaikkia käyttäjiä. Jokaisella ryhmällä on tietty ”rooli” ja siihen liittyvät ”käyttöoikeudet”.

  • Rooli: Käyttöoikeuksien kokonaisuus.
  • Käyttöoikeus: Mahdollisuus suorittaa tietty toiminto (esimerkiksi lukea, kirjoittaa tai poistaa).

Roolit Spring Securityssä

Spring Security käyttää rooleja valtuutuksen toteuttamiseen. Kun määrittelette käyttäjän, määritätte hänelle myös yhden tai useamman roolin.

Spring Security käsittelee rooleja sisäisesti myönnettyinä valtuutuksina (Granted Authorities). Käytännössä roolien eteen lisätään usein etuliite ROLE_ (esimerkiksi ROLE_ADMIN ja ROLE_USER). Tämä auttaa erottamaan ne muuntyyppisistä valtuutuksista.

Roolien määrittäminen käyttäjille

Ennen RBAC:n käyttöä käyttäjille on määritettävä roolit! Kun käyttäjä kirjautuu sisään, Spring Securityn todennusprosessi hakee hänelle määritetyt roolit.

Roolit ladataan yleensä tietokannasta UserDetailsService-palvelun avulla tai yksinkertaisemmissa tapauksissa määritetään suoraan muistiin. Esimerkeissämme käytämme muistissa olevia käyttäjiä, jotta asiat pysyvät selkeinä.

URL-osoitteiden suojaaminen `hasRole()`-metodilla

Spring Securityn verkkosovellusten RBAC:n ytimessä on HttpSecurity-komponentin määrittäminen. Käytämme esimerkiksi hasRole()-metodin kaltaisia metodeja määrittämään, mitkä roolit voivat käyttää tiettyjä URL-malleja.

Voisitte suojata esimerkiksi ylläpitäjän sivun kirjoittamalla: .requestMatchers("/admin/**").hasRole("ADMIN"). Spring Security lisää automaattisesti ROLE_-etuliitteen, kun käytätte hasRole()-metodia.

RBAC-verkkoturvallisuuden määritys

Katsotaan yksinkertaista Spring Security -määritystä. Tässä kokoonpanossa määritetään kaksi muistissa olevaa käyttäjää (user ja admin) ja suojataan kaksi päätepistettä: /user ja /admin.

Kokeilkaa suorittaa tämä koodi ja käyttää näitä URL-osoitteita!

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class Main {

  public static void main(String[] args) {
    SpringApplication.run(Main.class, args);
  }

  @GetMapping("/user")
  public String userEndpoint() {
    return "Hello, User!";
  }

  @GetMapping("/admin")
  public String adminEndpoint() {
    return "Hello, Admin!";
  }

  @Configuration
  @EnableWebSecurity
  static class WebSecurityConfig {

    @Bean
    public UserDetailsService userDetailsService() {
      UserDetails user = User.withDefaultPasswordEncoder()
          .username("user")
          .password("password")
          .roles("USER")
          .build();
      UserDetails admin = User.withDefaultPasswordEncoder()
          .username("admin")
          .password("password")
          .roles("ADMIN", "USER")
          .build();
      return new InMemoryUserDetailsManager(user, admin);
    }

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
      http
          .authorizeHttpRequests(authorize -> authorize
              .requestMatchers("/user/**").hasRole("USER")
              .requestMatchers("/admin/**").hasRole("ADMIN")
              .anyRequest().authenticated()
          )
          .formLogin(org.springframework.security.config.Customizer.withDefaults());
      return http.build();
    }
  }
}

RBAC-määrityksen testaaminen

Kun edellinen esimerkki on käynnissä, avatkaa selain ja kokeilkaa seuraavia URL-osoitteita:

  • http://localhost:8080/user: Kirjautukaa tunnuksilla user/password tai admin/password. Molempien pitäisi toimia!
  • http://localhost:8080/admin: Kirjautukaa tunnuksilla admin/password. Tämän pitäisi toimia.
  • http://localhost:8080/admin: Kirjautukaa tunnuksilla user/password. Teidän pitäisi nähdä ”Access Denied” -virhe (403 Forbidden).

Tämä havainnollistaa, miten roolit rajoittavat käyttöoikeuksia!

Useita rooleja: `hasAnyRole()`

Mitä jos päätepistettä voi käyttää useampi kuin yksi rooli? Spring Security tarjoaa tätä varten hasAnyRole()-metodin.

Sen sijaan että luettelisitte useita hasRole()-kutsuja, voitte kirjoittaa: .requestMatchers("/dashboard/**").hasAnyRole("USER", "ADMIN"). Käyttöoikeus myönnetään, jos todennetulla käyttäjällä on JOKO USER-rooli TAI ADMIN-rooli.

`hasRole()` vs `hasAuthority()`

Saatatte nähdä käytettävän myös hasAuthority()-metodia. Mikä niiden ero on?

  • hasRole("ADMIN"): Lisää implisiittisesti ROLE_-etuliitteen, joten se tarkistaa arvon ROLE_ADMIN.
  • hasAuthority("ROLE_ADMIN"): Edellyttää täsmälleen kyseistä valtuutusmerkkijonoa, mukaan lukien ROLE_-etuliitteen, jos se kuuluu valtuutuksen nimeen.

Yleensä hasRole()-metodia suositellaan selkeyden vuoksi, kun käsitellään ROLE_-etuliitteellä määritettyjä rooleja.

Tiettyjen HTTP-metodien suojaaminen

RBAC-menetelmää voidaan soveltaa myös tietyn polun tiettyihin HTTP-metodeihin. Tämä on hyödyllistä REST-rajapinnoissa, joissa eri toiminnot (GET, POST, PUT, DELETE) edellyttävät erilaisia käyttöoikeuksia.

Voit ketjuttaa requestMatchers()-metodin ja HttpMethod-tyypin:

.requestMatchers(HttpMethod.POST, "/products/**").hasRole("ADMIN")
.requestMatchers(HttpMethod.GET, "/products/**").hasAnyRole("USER", "ADMIN")

Tässä vain ADMIN voi luoda tuotteita, mutta sekä USER että ADMIN voivat tarkastella niitä.

RBAC:n parhaat käytännöt

Jotta RBAC olisi tehokas ja helposti hallittava:

  • Pidä roolit yksinkertaisina: Älä luo liian monia rooleja. Roolien tulisi vastata selkeästi erottuvia työtehtäviä.
  • Vähimpien oikeuksien periaate: Myönnä käyttäjille vain tarvittavat roolit ja käyttöoikeudet.
  • Keskitetty hallinta: Hallitse rooleja ja niiden määrityksiä yhdestä suojatusta paikasta.
  • Tarkista säännöllisesti: Tarkista roolimääritykset ja käyttöoikeudet säännöllisin väliajoin varmistaaksesi, että ne ovat edelleen asianmukaiset.

RBAC-tietojen tarkistus

Olet oppinut toteuttamaan roolipohjaista käyttöoikeuksien hallintaa Spring Securityssä. Testataanpa nopeasti ymmärryksesi!

Kertaus: roolipohjainen käyttöoikeuksien hallinta

Hienoa työtä! Tässä oppitunnissa opit:

  • mikä RBAC on ja miksi se on tärkeä käyttöoikeuksien hallinnassa.
  • miten Spring Security käyttää rooleja (tyyppinä GrantedAuthority).
  • miten URL-osoitteisiin perustuva RBAC määritetään HttpSecurity-komponentilla.
  • miten päätepisteitä suojataan metodeilla hasRole() ja hasAnyRole().
  • miten hasRole() ja hasAuthority() eroavat toisistaan.
  • miten RBAC:tä sovelletaan tiettyihin HTTP-metodeihin.
  • tehokkaan RBAC-toteutuksen keskeiset parhaat käytännöt.

Sinulla on nyt vankka perusta käyttöoikeuksien hallintaan käyttäjäroolien perusteella!

Aloita maksutta

Opi Java 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 ”Roolipohjainen käyttöoikeuksien hallinta (RBAC)” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Spring Security 6 ja JWT-todennus-oppimispolun 3 oppituntia, myös oppitunnin “Roolipohjainen käyttöoikeuksien hallinta (RBAC)”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Spring Security 6 ja JWT-todennus-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Roolipohjainen käyttöoikeuksien hallinta (RBAC)”?

Toteuttakaa roolipohjainen valtuutus, jolla käyttö tiettyihin resursseihin rajataan käyttäjäroolien ja käyttöoikeuksien perusteella. Harjoittelet Spring Security 6 ja JWT-todennus-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Spring Security 6 ja JWT-todennus-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Spring Security 6 ja JWT-todennus-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.

Kuinka kauan ”Roolipohjainen käyttöoikeuksien hallinta (RBAC)”-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ä Spring Security 6 ja JWT-todennus-oppitunnilla?

Kyllä. Jokainen Spring Security 6 ja JWT-todennus-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. Roolipohjainen käyttöoikeuksien hallinta (RBAC)
  2. Metoditason suojaus annotaatioilla
  3. HttpSecurity-määrityksen perusteellinen käsittely
  4. Päätepisteiden suojaaminen mukautetuilla käyttöoikeussäännöillä
← Takaisin: Spring Security 6 ja JWT-todennus