Rollebaseret adgangskontrol
Konfigurér rollebaseret autorisation for at definere detaljerede adgangstilladelser for forskellige brugerroller.
Rollebaseret adgangskontrol er en gratis Spring Boot 4-mikrotjenester og REST-API'er-lektion på CoddyKit. Dette er lektion 3 af 3. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Spring Boot 4-mikrotjenester og REST-API'er, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Spring Boot 4-mikrotjenester og REST-API'er-kurset indeholder 3 lektioner i alt.
Introduktion til rollebaseret adgang
Rollebaseret adgangskontrol (RBAC) er en metode til at begrænse systemadgang baseret på de enkelte brugeres roller.
I stedet for at tildele tilladelser direkte til brugere tildeler du tilladelser til roller og tildeler derefter rollerne til brugere.
- Forenkler administrationen af sikkerheden.
- Forbedrer håndhævelsen af sikkerhedspolitikker.
- Er lettere at revidere og vedligeholde.
Fordele ved RBAC
RBAC giver flere fordele, når dine applikationer skal sikres:
- Skalerbarhed: Administrer nemt adgangen for mange brugere og ressourcer, efterhånden som din applikation vokser.
- Fleksibilitet: Roller kan ændres eller opdateres uden at ændre de enkelte brugertilladelser.
- Overholdelse af regler: Hjælper med at opfylde lovmæssige krav ved tydeligt at definere, hvem der må gøre hvad.
Repræsentation af brugerroller
I Spring Security repræsenteres roller typisk som simple strenge, ofte med præfikset ROLE_ (f.eks. ROLE_ADMIN, ROLE_USER).
Det er god praksis at definere disse som konstanter eller enum-typer for at undgå tastefejl.
public enum UserRole {
ADMIN,
USER
}Spring Security tilføjer automatisk præfikset ROLE_, når du bruger udtryk som hasRole('ADMIN').
public enum UserRole {
ADMIN,
USER
}Grundlæggende sikkerhedsopsætning
For at aktivere sikkerhed på metodeniveau og konfigurere brugere med roller opsætter vi en SecurityFilterChain-bean.
Dette eksempel definerer en bruger 'admin' i hukommelsen med ROLE_ADMIN og en bruger 'user' med 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!";
}
}Anvendelse af rollebegrænsninger
Spring Securitys @PreAuthorize-annotation giver dig mulighed for at definere adgangsregler direkte på controllermetoder.
Den bruger Spring Expression Language (SpEL) til at evaluere betingelser, før en metode udføres.
@PreAuthorize("hasRole('ADMIN')")Det sikrer, at kun brugere med rollen ADMIN kan kalde metoden.
@PreAuthorize("hasRole('ADMIN')")Eksklusiv administratoradgang
Lad os oprette et endpoint, som kun brugere med rollen ADMIN kan få adgang til. Hvis en USER forsøger at få adgang, får vedkommende en 403 Forbidden-fejl.
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!";
}
}Tildeling af flere roller
Nogle gange skal et endpoint være tilgængeligt for mere end én rolle. Du kan bruge hasAnyRole() til dette.
Et dashboard kan f.eks. være synligt for både rollerne ADMIN og almindelig 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.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!";
}
}Brugerdefinerede adgangsafgørelser
Selvom hasRole() og hasAnyRole() dækker mange tilfælde, giver Spring Security mulighed for mere komplekse adgangsregler.
Du kan bruge SpEL til at kontrollere flere betingelser, f.eks. hasRole('ADMIN') and hasIpAddress('192.168.1.0/24').
Ved meget kompleks eller dynamisk logik kan du implementere brugerdefinerede PermissionEvaluator-beans.
Test af din RBAC
Du kan teste din RBAC-konfiguration ved at køre din Spring Boot-applikation og bruge et værktøj som Postman eller curl:
- Log ind som 'admin' (bruger: admin, adgangskode: password), og prøv at få adgang til alle endpoints.
- Log ind som 'user' (bruger: user, adgangskode: password), og kontrollér adgangen til brugerendpoints, men ikke til dem, der kun er til administratorer.
- Prøv uden godkendelse for at se, om adgangen afvises.
RBAC-adgangskontrol
Se på følgende Spring Security-konfiguration og controllermetode:
@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";
}
}Hvilken eller hvilke brugere kan få adgang til endpointet /report?
@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";
}
}Opsummering af RBAC-lektionen
I denne lektion undersøgte vi rollebaseret adgangskontrol (RBAC) i Spring Boot-mikrotjenester.
- Vi lærte, hvordan man definerer og tildeler roller til brugere.
- Vi konfigurerede Spring Security til at genkende disse roller ved hjælp af
SecurityFilterChain. - Vi brugte
@PreAuthorizesammen medhasRole()oghasAnyRole()til at sikre API-endpoints baseret på brugerroller.
RBAC er en effektiv måde at administrere adgangskontrol på i dine applikationer, både effektivt og sikkert.
Lær Java med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 24
- Lektioner
- 93
Ofte stillede spørgsmål
Er lektionen “Rollebaseret adgangskontrol” gratis?
Ja — hele teksten til “Rollebaseret adgangskontrol” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Spring Boot 4-mikrotjenester og REST-API'er-kurset, skal du opgradere til CoddyKit PRO. Spring Boot 4-mikrotjenester og REST-API'er-kurset indeholder 3 lektioner i alt.
Hvad lærer jeg i “Rollebaseret adgangskontrol”?
Konfigurér rollebaseret autorisation for at definere detaljerede adgangstilladelser for forskellige brugerroller. Du øver dig i Spring Boot 4-mikrotjenester og REST-API'er med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Spring Boot 4-mikrotjenester og REST-API'er?
Der kræves ingen tidligere erfaring. Spring Boot 4-mikrotjenester og REST-API'er på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 3.
Hvor lang tid tager lektionen “Rollebaseret adgangskontrol”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Spring Boot 4-mikrotjenester og REST-API'er-lektion?
Ja. Alle Spring Boot 4-mikrotjenester og REST-API'er-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Grundlæggende OAuth2 og JWT
- Sikring af REST-endpoints
- Rollebaseret adgangskontrol