printemps-sécurité d'accès refusé d'exception
Je vais avoir un problème avec une méthode annotée avec @sécurisé de printemps-sécurité
@Secured(value = { "LIST_GIFT" })
La méthode a été placé sur une méthode de Contrôleur de spring-mvc de l'application web.
Quand je debug par la UserDetailsService Œuvre, nous avons à la fin de la loadByUserName méthode que j'ai suivantes UserDetails objet:
SecurityDetails [userId=106, username=john@doe.com, enabled=true, accountNonLocked=true, accountNonExpired=true, credentialsNonExpired=true]
Avec la suite accordé authoroties liste:
[LOCK_SERIAL, CALCULATE_BALANCE, REGISTER_FOR_PUSH_NOTIFICATION, TOPUP_BY_POS, LIST_PRODUCTS, LIST_COUPON_ASSIGNMENT, BALANCE, BALANCE_HISTORY, LIST_GIFT, LIST_PROGRAMS, ASSIGN_COUPON, DISTRIBUTE_COUPON, CAN_CONFIGURE_GIFTS]
HTTP reviens toujours 403 Forbidden. Quand j'ai activer la journalisation je vois les suivantes:
DEBUG: org.springframework.security.access.intercept.aopalliance.MethodSecurityInterceptor - Secure object: ReflectiveMethodInvocation: public com.foo.products.sva.cc.customer.domain.AccountBalance com.foo.products.sva.cc.customer.controllers.AccountController.getBalance(java.lang.String); target is of class [com.foo.products.sva.cc.customer.controllers.AccountController]; Attributes: [LIST_GIFT]
DEBUG: org.springframework.security.access.intercept.aopalliance.MethodSecurityInterceptor - Previously Authenticated: org.springframework.security.authentication.UsernamePasswordAuthenticationToken@380cef3f: Principal: SecurityDetails [userId=106, username=john@doe.com, enabled=true, accountNonLocked=true, accountNonExpired=true, credentialsNonExpired=true]; Credentials: [PROTECTED]; Authenticated: true; Details: org.springframework.security.web.authentication.WebAuthenticationDetails@fffed504: RemoteIpAddress: 127.0.0.1; SessionId: F5EAAB76CD6CC8530F3E7E844A13D635; Granted Authorities: CALCULATE_BALANCE, REGISTER_FOR_PUSH_NOTIFICATION, TOPUP_BY_POS, CAN_CONFIGURE_GIFTS, DISTRIBUTE_COUPON, ASSIGN_COUPON, LIST_COUPON_ASSIGNMENT, LIST_GIFT, BALANCE_HISTORY, LIST_PRODUCTS, LOCK_SERIAL, LIST_PROGRAMS, BALANCE
DEBUG: org.springframework.security.access.vote.AffirmativeBased - Voter: org.springframework.security.access.vote.RoleVoter@2059dcd9, returned: 0
DEBUG: org.springframework.security.access.vote.AffirmativeBased - Voter: org.springframework.security.access.vote.AuthenticatedVoter@6bb23b26, returned: 0
DEBUG: org.springframework.security.web.access.ExceptionTranslationFilter - Access is denied (user is not anonymous); delegating to AccessDeniedHandler
org.springframework.security.access.AccessDeniedException: Access is denied
at org.springframework.security.access.vote.AbstractAccessDecisionManager.checkAllowIfAllAbstainDecisions(AbstractAccessDecisionManager.java:70)
at org.springframework.security.access.vote.AffirmativeBased.decide(AffirmativeBased.java:88)
at org.springframework.security.access.intercept.AbstractSecurityInterceptor.beforeInvocation(AbstractSecurityInterceptor.java:205)
at org.springframework.security.access.intercept.aopalliance.MethodSecurityInterceptor.invoke(MethodSecurityInterceptor.java:59)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:622)
at com.foo.products.sva.cc.customer.controllers.AccountController$$EnhancerByCGLIB$$b72ae4b0.getBalance(<generated>)
Je n'ai aucune idée sur le pourquoi de ce qui se passe.
Vous devez vous connecter pour publier un commentaire.
Il ressemble à aucune des
AccessDecisionVoter
s sont vote pour accorder l'accès (ils sont tous en s'abstenant), et donc on vous refuse l'accès.La raison pour cela est que, par défaut, le
RoleVoter
qui fait partie de la configuration par défaut, ne répond qu'aux autorités qui commencent par le préfixe "ROLE_". Puisque aucun de vous le faites, il ne trouve pas tout ce qu'il sait à ce sujet. Cette FAQ a certains plus d'informations.Une alternative est de permettre l'expression basée sur la sécurité et l'utilisation de la
@exiger une autorisation préalable
annotation au lieu de cela, ce qui est plus flexible. Quelque chose commedevrait travailler hors de la boîte, si vous activez les annotations comme décrit.
Le problème est que lorsque vous chargez votre Utilisateur
GrantedAuthority
éléments dans la session, vous devriez les nommer différemment pour la différenciation de l'autorisation de l'utilisateur à partir des profils.ROLE
préfixe pour les profils UtilisateurPERM
préfixe pour les autorisations de l'UtilisateurDe sorte que vous devez appeler votre permission
PERM_LIST_GIFT
et l'utilisation de lahasAuthority
annotation à la place. Je vous recommande également de mettre l'permissionas comme un CRUD ; donc, pour la liste des cadeaux que vous auriez une permission de lire des cadeaux: PERM_READ_GIFT. Et pour améliorer cet accès, vous pouvez faire d'annotations personnalisées pour indiquer que quelqu'un a des autorisations d'accès (au moins pour la lecture uniquement) vos dons d'objets. Quelque chose comme:De sorte que vous pourrait annoter toutes les fonctions avec cela, et si les changements de politique sur l'accès à votre cadeau éléments, vous n'avez qu'à changer une fois. Son meilleur et plus facile à manipuler.