9
votes

Comment utiliser @pathvariable pour résoudre le nom du paramètre dans la sécurité du printemps?

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) {
  //...
}


3 commentaires

Quelle version du printemps-noyau utilisez-vous?


@Romansandarkin 4.1.6.Release


Merci. Il semble que j'ai trouvé une solution)


4 Réponses :


2
votes

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>


1 commentaires

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.



3
votes

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;
    }
}


1 commentaires

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 , réglage des annotations souhaitées à utiliser: Nouvelle annotationParameNameDiscoverer (pathvariable.class.getName (), P.class.getName ()) . Ça marche.



5
votes

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


3 commentaires

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' 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 Classe pour la sécurité Web - Extension WebsecurityConfigurierAdapter ?



0
votes

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


1 commentaires

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.