Je voudrais utiliser @peuthorize annotations pour sécuriser des méthodes dans le contrôleur de repos à ressort, à l'aide des paramètres de la méthode, par exemple
@RequestMapping("/something/{myParam}") @PreAuthorize("@security.check(#myParam)") public String getSomething(@PathVariable("myParam") @P("myParam) Integer myParam) { //... }
4 Réponses :
La configuration suivante n'a pas été testée, mais basée sur la recherche de sources de sécurité de printemps , Ainsi, essayez de changer votre configuration de sécurité de printemps XML comme suit
<security:global-method-security pre-post-annotations="enabled"> <security:expression-handler ref="expressionHandler"/> </security:global-method-security> <bean id="expressionHandler" class="org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler"> <property name="parameterNameDiscoverer" ref="parameterNameDiscoverer"/> </bean> <bean id="parameterNameDiscoverer" class="org.springframework.security.core.parameters.AnnotationParameterNameDiscoverer"> <constructor-arg> <list> <value>org.springframework.web.bind.annotation.PathVariable</value> </list> </constructor-arg> </bean>
Merci! Cette solution fonctionne et je l'ai utilisée dans ma configuration, avec certaines modifications: 1. Le paramètre Constructor devrait être une liste (déjà modifié votre réponse). 2. Ces haricots doivent être définis dans MVC-Dispatcher-serlet.xml ou partout où les contrôleurs de repos sont définis.
de la sécurité de printemps officiel Docs GlobalMethodsecurityConfiguration
Parfois, vous devrez peut-être effectuer des opérations plus compliquées que possible avec le
@enableGlobalMethodSecurity code> Annotation Autoriser. Pour ces cas, vous pouvez étendre la
globalmethodsecurityconfiguration code> en veillant à ce que le
@enableGlobalMethodSecurity code> Annotation est présent sur votre sous-classe. Par exemple, si vous vouliez fournir une coutume
MéthodesCholdExpressionHandler code>, vous pouvez utiliser ce qui suit Configuration: p> blockQuote>
xxx pré> comme dans l'exemple ci-dessus, vous pouvez écrire votre
méthodorecurityExpressionhandler code> ou utilisez le
defaultmethodsecurityexpressionHerler code> et Set Votre personnalisation ParameNameDiscoverer étendue le Par défautSecurityParameNameDiscoverer (ou non) P>
@EnableGlobalMethodSecurity(prePostEnabled = true) public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration { @Override protected MethodSecurityExpressionHandler createExpressionHandler() { DefaultMethodSecurityExpressionHandler expressionHandler = new DefaultMethodSecurityExpressionHandler(); expressionHandler.setParameterNameDiscoverer(new CustomParameterNameDiscoverer()); return expressionHandler; } }
Merci! J'ai utilisé cette solution dans ma configuration de test - non pas avec un découvreur de nom de paramètre personnalisé, mais avec ANNOATIONPARAMETERNAMEDISCOVERER CODE>, réglage des annotations souhaitées à utiliser:
Nouvelle annotationParameNameDiscoverer (pathvariable.class.getName (), P.class.getName ()) code>. Ça marche.
En bref, vous devez remplacer la création de SecurityExpressionHandler code>
dans la méthode GlobalMethodsecurityConfiguration # CreeEeExpressionHandler Code> A > Donc, pour que votre propre
paraméternameCouverer code>
en personnalisé GlobalMethodsecurityConfiguration code>
. 2016-06-06 17:09:01.635 INFO 2871 --- [nio-8080-exec-4] c.s.so.q37435824.SecurityService: myParam value from PathVariable equals 1
Ceci est une solution similaire à la réponse de Vzamanillo, sans aucun paramétrage personnalisé. En fait, j'ai déjà mis en œuvre presque identique. Cependant, je ne définis pas ApplicationContext sur le gestionnaire d'expression. Est-ce nécessaire ici?
@PKALINOW, oui, il est nécessaire de définir ApplicationContext, sinon vous obtiendrez le résolveur sans haricot enregistré dans le contexte pour résoudre l'accès au haricot 'Securityservice' Code> SpelevaluationException lors de l'évaluation de l'expression spel
Je n'ai pas une telle erreur. Peut-être que parce que j'utilise également une autre @configuration Code> Classe pour la sécurité Web - Extension
WebsecurityConfigurierAdapter code>?
du responsable de la sécurité de printemps Documentation L'usecase demandée peut être atteinte. Mais pour utiliser, vous devez passer à la source du printemps 4.1.0, je n'ai pas essayé par on dirait que ceci est réalisable p>
Je connaissais cette méthode, mais ce n'est pas exactement ce dont j'avais besoin. Je souhaite utiliser la méthode des annotations sur les contrôleurs et non les modèles URI.
Quelle version du printemps-noyau utilisez-vous?
@Romansandarkin 4.1.6.Release
Merci. Il semble que j'ai trouvé une solution)