Spring Boot 4 -mikropalvelut ja REST-sovellusliittymät · Oppitunti

Roolipohjainen käyttöoikeuksien hallinta

Määrittäkää roolipohjainen valtuutus eri käyttäjäroolien yksityiskohtaisten käyttöoikeuksien hallintaa varten.

Oppitunti 3/311 vaihetta

Roolipohjainen käyttöoikeuksien hallinta on ilmainen Spring Boot 4 -mikropalvelut ja REST-sovellusliittymät-oppitunti CoddyKitissä. Tämä on oppitunti 3/3. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Spring Boot 4 -mikropalvelut ja REST-sovellusliittymät-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Spring Boot 4 -mikropalvelut ja REST-sovellusliittymät-kurssilla on yhteensä 3 oppituntia.

Roolipohjaisen käytön esittely

Roolipohjainen käyttöoikeuksien hallinta (RBAC) on menetelmä, jolla järjestelmän käyttöä rajoitetaan käyttäjien roolien perusteella.

Käyttöoikeuksia ei määritetä suoraan käyttäjille, vaan rooleille, jotka puolestaan määritetään käyttäjille.

  • Yksinkertaistaa tietoturvan hallintaa.
  • Parantaa tietoturvakäytäntöjen noudattamisen valvontaa.
  • Helpottaa tarkastamista ja ylläpitoa.

RBAC:n hyödyt

RBAC tarjoaa sovellusten suojaamiseen useita etuja:

  • Skaalautuvuus: Hallitse monien käyttäjien ja resurssien käyttöoikeuksia helposti sovelluksen kasvaessa.
  • Joustavuus: Roolia voidaan muuttaa tai päivittää ilman yksittäisten käyttäjien käyttöoikeuksien muokkaamista.
  • Vaatimustenmukaisuus: Auttaa täyttämään sääntelyvaatimukset määrittämällä selkeästi, kuka voi tehdä mitäkin.

Käyttäjäroolien esittäminen

Spring Securityssä roolit esitetään yleensä yksinkertaisina merkkijonoina, joiden alussa on usein ROLE_-etuliite (esim. ROLE_ADMIN, ROLE_USER).

On hyvä käytäntö määrittää nämä vakioina tai enumeraatioina kirjoitusvirheiden välttämiseksi.

public enum UserRole {
  ADMIN,
  USER
}

Spring Security lisää automaattisesti ROLE_-etuliitteen, kun käytät esimerkiksi lauseketta hasRole('ADMIN').

public enum UserRole {
  ADMIN,
  USER
}

Tietoturvan perusmääritys

Ota käyttöön metoditason tietoturva ja määritä rooleilla varustetut käyttäjät määrittämällä SecurityFilterChain-bean.

Tässä esimerkissä määritetään muistissa oleva käyttäjä 'admin' roolilla ROLE_ADMIN ja käyttäjä 'user' roolilla ROLE_USER.

package com.coddykit;

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.method.configuration.EnableMethodSecurity;
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
@Configuration
@EnableWebSecurity
@EnableMethodSecurity(prePostEnabled = true) // Enable @PreAuthorize
public class RbacApplication {

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

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .csrf(csrf -> csrf.disable())
            .authorizeHttpRequests(authorize -> authorize
                .anyRequest().authenticated()
            )
            .httpBasic(org.springframework.security.config.Customizer.withDefaults());
        return http.build();
    }

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

@RestController
class PlaceholderController {
    @GetMapping("/")
    public String home() {
        return "Welcome to RBAC Demo!";
    }
}

Roolirajoitusten soveltaminen

Spring Securityn @PreAuthorize-annotaation avulla käyttöoikeussäännöt voidaan määrittää suoraan ohjainmetodeihin.

Se käyttää Spring Expression Language -kieltä (SpEL) ehtojen arviointiin ennen metodin suorittamista.

@PreAuthorize("hasRole('ADMIN')")

Tämä varmistaa, että vain käyttäjät, joilla on ADMIN-rooli, voivat kutsua metodia.

@PreAuthorize("hasRole('ADMIN')")

Vain ylläpitäjän käyttöoikeus

Luodaan päätepiste, jota voivat käyttää vain käyttäjät, joilla on ADMIN-rooli. Jos USER yrittää käyttää sitä, hän saa virheen 403 Forbidden.

package com.coddykit;

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.access.prepost.PreAuthorize;
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
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
@Configuration
@EnableWebSecurity
@EnableMethodSecurity(prePostEnabled = true)
public class RbacApplication {

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

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .csrf(csrf -> csrf.disable())
            .authorizeHttpRequests(authorize -> authorize
                .anyRequest().authenticated()
            )
            .httpBasic(org.springframework.security.config.Customizer.withDefaults());
        return http.build();
    }

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

@RestController
class AdminController {

    @GetMapping("/admin/dashboard")
    @PreAuthorize("hasRole('ADMIN')")
    public String getAdminDashboard() {
        return "Welcome, Admin! This is your dashboard.";
    }

    @GetMapping("/")
    public String home() {
        return "Welcome to RBAC Demo!";
    }
}

Useiden roolien myöntäminen

Joskus päätepisteen tulee olla useamman kuin yhden roolin käytettävissä. Tähän voidaan käyttää metodia hasAnyRole().

Esimerkiksi koontinäyttö voi olla sekä ADMIN- että tavallisen USER-roolin käytettävissä.

package com.coddykit;

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.access.prepost.PreAuthorize;
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
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
@Configuration
@EnableWebSecurity
@EnableMethodSecurity(prePostEnabled = true)
public class RbacApplication {

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

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .csrf(csrf -> csrf.disable())
            .authorizeHttpRequests(authorize -> authorize
                .anyRequest().authenticated()
            )
            .httpBasic(org.springframework.security.config.Customizer.withDefaults());
        return http.build();
    }

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

@RestController
class MultiRoleController {

    @GetMapping("/dashboard")
    @PreAuthorize("hasAnyRole('ADMIN', 'USER')")
    public String getUserDashboard() {
        return "Hello! Welcome to your dashboard.";
    }

    @GetMapping("/admin/settings")
    @PreAuthorize("hasRole('ADMIN')")
    public String getAdminSettings() {
        return "Admin settings page.";
    }

    @GetMapping("/")
    public String home() {
        return "Welcome to RBAC Demo!";
    }
}

Mukautetut käyttöoikeuspäätökset

Vaikka hasRole() ja hasAnyRole() kattavat monia tapauksia, Spring Security mahdollistaa monimutkaisempien käyttöoikeussääntöjen määrittämisen.

Voit käyttää SpEL-kieltä useiden ehtojen tarkistamiseen, esimerkiksi hasRole('ADMIN') and hasIpAddress('192.168.1.0/24').

Hyvin monimutkaista tai dynaamista logiikkaa varten voit toteuttaa mukautettuja PermissionEvaluator-beaneja.

RBAC:n testaaminen

Voit testata RBAC-määrityksesi käynnistämällä Spring Boot -sovelluksen ja käyttämällä esimerkiksi Postmania tai työkalua curl:

  • Kirjaudu käyttäjänä 'admin' (käyttäjä: admin, salasana: password) ja yritä käyttää kaikkia päätepisteitä.
  • Kirjaudu käyttäjänä 'user' (käyttäjä: user, salasana: password) ja varmista, että käyttäjäpäätepisteet ovat käytettävissä mutta vain ylläpitäjille tarkoitetut päätepisteet eivät.
  • Yritä käyttää palvelua ilman todennusta ja tarkista, että pyyntö hylätään.

RBAC-käyttöoikeustarkistus

Tarkastellaan seuraavaa Spring Security -määritystä ja ohjainmetodia:

@Configuration
@EnableMethodSecurity(prePostEnabled = true)
// ... other config ...

@Bean
public UserDetailsService userDetailsService() {
    UserDetails userA = User.withDefaultPasswordEncoder()
        .username("alice").password("pw").roles("USER").build();
    UserDetails userB = User.withDefaultPasswordEncoder()
        .username("bob").password("pw").roles("MANAGER").build();
    return new InMemoryUserDetailsManager(userA, userB);
}

@RestController
class MyController {
    @GetMapping("/report")
    @PreAuthorize("hasAnyRole('USER', 'ADMIN')")
    public String getReport() {
        return "Confidential Report";
    }
}

Mitkä käyttäjät voivat käyttää /report-päätepistettä onnistuneesti?

@Configuration
@EnableMethodSecurity(prePostEnabled = true)
// ... other config ...

@Bean
public UserDetailsService userDetailsService() {
    UserDetails userA = User.withDefaultPasswordEncoder()
        .username("alice").password("pw").roles("USER").build();
    UserDetails userB = User.withDefaultPasswordEncoder()
        .username("bob").password("pw").roles("MANAGER").build();
    return new InMemoryUserDetailsManager(userA, userB);
}

@RestController
class MyController {
    @GetMapping("/report")
    @PreAuthorize("hasAnyRole('USER', 'ADMIN')")
    public String getReport() {
        return "Confidential Report";
    }
}

RBAC-oppitunnin yhteenveto

Tässä oppitunnissa tutustuimme roolipohjaiseen käyttöoikeuksien hallintaan (RBAC) Spring Boot -mikropalveluissa.

  • Opimme määrittämään rooleja ja liittämään niitä käyttäjiin.
  • Määritimme Spring Securityn tunnistamaan nämä roolit SecurityFilterChain-beanin avulla.
  • Käytimme @PreAuthorize-annotaatiota yhdessä metodien hasRole() ja hasAnyRole() kanssa API-päätepisteiden suojaamiseen käyttäjäroolien perusteella.

RBAC on tehokas tapa hallita sovellusten käyttöoikeuksia tehokkaasti ja turvallisesti.

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
24
Oppitunnit
93

Usein kysytyt kysymykset

Onko oppitunti ”Roolipohjainen käyttöoikeuksien hallinta” ilmainen?

Kyllä – oppitunnin ”Roolipohjainen käyttöoikeuksien hallinta” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Spring Boot 4 -mikropalvelut ja REST-sovellusliittymät-kurssin, päivitä CoddyKit PROhon. Spring Boot 4 -mikropalvelut ja REST-sovellusliittymät-kurssilla on yhteensä 3 oppituntia.

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

Määrittäkää roolipohjainen valtuutus eri käyttäjäroolien yksityiskohtaisten käyttöoikeuksien hallintaa varten. Harjoittelet Spring Boot 4 -mikropalvelut ja REST-sovellusliittymät-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Spring Boot 4 -mikropalvelut ja REST-sovellusliittymät-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Spring Boot 4 -mikropalvelut ja REST-sovellusliittymät-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/3.

Kuinka kauan ”Roolipohjainen 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ä Spring Boot 4 -mikropalvelut ja REST-sovellusliittymät-oppitunnilla?

Kyllä. Jokainen Spring Boot 4 -mikropalvelut ja REST-sovellusliittymät-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. OAuth2:n ja JWT:n perusteet
  2. REST-päätepisteiden suojaaminen
  3. Roolipohjainen käyttöoikeuksien hallinta
← Takaisin: Spring Boot 4 -mikropalvelut ja REST-sovellusliittymät