Si vous souhaitez autoriser avec une logique un peu compliquée dans l'autorisation de méthode Spring Security, vous pouvez appeler la méthode de n'importe quel bean.
À propos, si vous souhaitez ajouter correctement une authentification personnalisée, la mise en œuvre de PermissionEvaluator est probablement une approche légitime. Cet article était facile à comprendre et détaillé sur l'implémentation de PermissionEvaluator. Ceci est recommandé si vous souhaitez ajouter un Evaluator à usage général pour le développement du framework d'extension. https://www.codeflow.site/ja/article/spring-security-create-new-custom-security-expression
Cette fois, la procédure est que vous pouvez écrire d'une manière un peu plus simple.
Controller.java
@PreAuthorize("@customPreAuthorizer.belongGroup(#groupId, authentication.principal)")
@RequestMapping("/group/{groupId}/list")
public String list(Model model, @PathVariable("groupId") Long groupId) {
}
CustomPreAuthorizer.java
@Component
public class CustomPreAuthorizer {
public boolean belongGroup(Long groupId, UserDetails userDetails) {
//Mettez en œuvre votre propre autorisation ici. Renvoie true si elle est autorisée à s'exécuter.
return true;
}
}
Vous pouvez faire référence au bean enregistré en tant que composant en ajoutant @ au début du nom du bean dans l'expression de PreAuthorize.
@customPreAuthorizer
Les informations utilisateur de l'utilisateur authentifié peuvent être passées à l'argument avec ʻauthentication.principal`.
Si la description passée à l'argument dans PreAuthorize est redondante, la même chose peut être obtenue en appelant SecurityContext dans la méthode, afin qu'elle puisse être récupérée dans la méthode.
CustomPreAuthorizer.java
@Component
public class CustomPreAuthorizer {
public boolean belongGroup(Long groupId) {
var userDetails = (UserDetails)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
return true;
}
}
Après cela, si vous étendez les détails de l'utilisateur et disposez des informations nécessaires lors de la connexion, vous pouvez implémenter et fournir l'autorisation d'origine étendue.