धन्यवाद ericacm , लेकिन यह कुछ कारणों से काम नहीं करता है:
- DefaultMethodSecurityExpressionHandler के गुण निजी हैं (प्रतिबिंब दृश्यता कीचड़ अवांछनीय है)
- कम से कम मेरे ग्रहण में, मैं MethodSecurityEvaluationContext ऑब्जेक्ट को हल नहीं कर सकता
अंतर यह है कि हम मौजूदा createEvaluationContext विधि को कॉल करते हैं और फिर अपने कस्टम रूट ऑब्जेक्ट को जोड़ते हैं। अंत में मैंने अभी एक StandardEvaluationContext ऑब्जेक्ट प्रकार लौटाया क्योंकि MethodSecurityEvaluationContext कंपाइलर में हल नहीं होगा (वे दोनों एक ही इंटरफ़ेस से हैं)। यह वह कोड है जो अब मेरे पास उत्पादन में है।
MethodSecurityExpressionHandler हमारे कस्टम रूट का उपयोग करें :
public class CustomMethodSecurityExpressionHandler extends DefaultMethodSecurityExpressionHandler {
// parent constructor
public CustomMethodSecurityExpressionHandler() {
super();
}
/**
* Custom override to use {@link CustomSecurityExpressionRoot}
*
* Uses a {@link MethodSecurityEvaluationContext} as the <tt>EvaluationContext</tt> implementation and
* configures it with a {@link MethodSecurityExpressionRoot} instance as the expression root object.
*/
@Override
public EvaluationContext createEvaluationContext(Authentication auth, MethodInvocation mi) {
// due to private methods, call original method, then override it's root with ours
StandardEvaluationContext ctx = (StandardEvaluationContext) super.createEvaluationContext(auth, mi);
ctx.setRootObject( new CustomSecurityExpressionRoot(auth) );
return ctx;
}
}
यह SecurityExpressionRoot का विस्तार करके डिफ़ॉल्ट रूट को बदलता है । यहाँ मैंने नाम बदल कर hasRole to hasEntitlement:
public class CustomSecurityExpressionRoot extends SecurityExpressionRoot {
// parent constructor
public CustomSecurityExpressionRoot(Authentication a) {
super(a);
}
/**
* Pass through to hasRole preserving Entitlement method naming convention
* @param expression
* @return boolean
*/
public boolean hasEntitlement(String expression) {
return hasRole(expression);
}
}
अंत में SecurityContext.xml को अपडेट करें (और सुनिश्चित करें कि यह आपके applcationContext.xml से संदर्भित है):
<!-- setup method level security using annotations -->
<security:global-method-security
jsr250-annotations="disabled"
secured-annotations="disabled"
pre-post-annotations="enabled">
<security:expression-handler ref="expressionHandler"/>
</security:global-method-security>
<!--<bean id="expressionHandler" class="org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler">-->
<bean id="expressionHandler" class="com.yourSite.security.CustomMethodSecurityExpressionHandler" />
नोट: @ सुरक्षित एनोटेशन इस ओवरराइड को स्वीकार नहीं करेगा क्योंकि यह एक अलग सत्यापन हैंडलर के माध्यम से चलता है। इसलिए, उपरोक्त xml में मैंने बाद के भ्रम को रोकने के लिए उन्हें अक्षम कर दिया।