So verhindern Sie eine unsichere Direktobjektreferenz (IDOR) mit selbstgegebenem JWT
Posted: 02 Apr 2025, 01:29
Ich habe die Spring -Dokumentation zur Autorisierung von httpServletRequests und jwts . /api/v1/mietants/{meenantID}/user/{userId}/Einstellungen
Ich muss sicherstellen, dass der Benutzer 123 von Mieter 1 nur ihre eigenen Einstellungen herausholen kann. Weder die Einstellungen anderer Benutzer desselben Mieters noch der Einstellungen von Benutzern anderer Mieter.
Ich habe darüber nachgedacht, allen meinen Benutzern einen Scope scope_tenant zu geben: {Tenantid} Bei der Ausgabe ihres JWT und der Durchführung von so etwas (ihre Benutzername ist ihre E-Mail-Adresse.
Ich suche jedoch nach einer besseren Lösung, da dies eine Menge Code -Duplikation bedeuten würde und daher fehleranfällig und schwer zu pflegen wäre.>
Ich muss sicherstellen, dass der Benutzer 123 von Mieter 1 nur ihre eigenen Einstellungen herausholen kann. Weder die Einstellungen anderer Benutzer desselben Mieters noch der Einstellungen von Benutzern anderer Mieter.
Code: Select all
@Configuration
@EnableWebSecurity
public class DirectlyConfiguredJwkSetUri {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(authorize -> authorize
.requestMatchers("/contacts/**").access(hasScope("contacts"))
.requestMatchers("/messages/**").access(hasScope("messages"))
.anyRequest().authenticated()
)
.oauth2ResourceServer(oauth2 -> oauth2
.jwt(Customizer.withDefaults())
);
return http.build();
}
}
< /code>
Oder auf der Methodenebene: < /p>
@PreAuthorize("hasAuthority('SCOPE_messages')")
public List getMessages(...) {}
Code: Select all
@PreAuthorize("hasAuthority('TENANT:' + #tenantId) or hasAuthority('ADMIN')")
@GetMapping("{tenantId}/users/{userId}/settings")
public ResponseEntity getTenantResources(@PathVariable long tenantId,
@PathVariable long userId Authentication authentication) {
User user = (User) authentication.getPrincipal();
if (user.getId != userId) {
throw new IdConflicException;
}
// Retrieve and return settings from DB using the userId
}