[ https://issues.apache.org/jira/browse/ARIES-1316?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14622544#comment-14622544 ]
Pavel Alekhin edited comment on ARIES-1316 at 7/10/15 4:30 PM: --------------------------------------------------------------- It's injected by blueprint config. <reference id="echoService" interface="biz.lorien.umrp.kb.properties.EchoService" /> <shell:command> <shell:action class="biz.lorien.umrp.kb.command.EchoCommand"> <shell:property name="echoService" ref="echoService" /> </shell:action> </shell:command> As I understood, exploring the code, the problem is that when bundle starts with <authz:enable> in blueprint, AnnotationParser looks for security annotations in a class (SimpleEchoService in our case): private boolean isSecured(Class<?> clazz) { if (clazz == Object.class) { return false; } if (clazz.getAnnotation(RolesAllowed.class) != null || clazz.getAnnotation(DenyAll.class) != null) { return true; } for (Method m : clazz.getMethods()) { if (m.getAnnotation(RolesAllowed.class) != null) { return true; } if (m.getAnnotation(DenyAll.class) != null) { return true; } } return false; } But later then in runtime AuthorizationInterceptor looks for security annotations in an interface methods: public Object preCall(ComponentMetadata cm, Method m, Object... parameters) throws Throwable { Annotation ann = new SecurityAnotationParser().getEffectiveAnnotation(m); ... } Here it gets "Method m" from the interface. was (Author: kuvalda): It's injected by blueprint config. <reference id="echoService" interface="biz.lorien.umrp.kb.properties.EchoService" /> <shell:command> <br> <shell:action class="biz.lorien.umrp.kb.command.EchoCommand"> <shell:property name="echoService" ref="echoService" /> </shell:action> </shell:command> As I understood, exploring the code, the problem is that when bundle starts with <authz:enable> in blueprint, AnnotationParser looks for security annotations in a class (SimpleEchoService in our case): private boolean isSecured(Class<?> clazz) { if (clazz == Object.class) { return false; } if (clazz.getAnnotation(RolesAllowed.class) != null || clazz.getAnnotation(DenyAll.class) != null) { return true; } for (Method m : clazz.getMethods()) { if (m.getAnnotation(RolesAllowed.class) != null) { return true; } if (m.getAnnotation(DenyAll.class) != null) { return true; } } return false; } But later then in runtime AuthorizationInterceptor looks for security annotations in an interface methods: public Object preCall(ComponentMetadata cm, Method m, Object... parameters) throws Throwable { Annotation ann = new SecurityAnotationParser().getEffectiveAnnotation(m); ... } Here it gets "Method m" from the interface. > Problem with intercepting authorizing annotations of a class declared as an > interface > ------------------------------------------------------------------------------------- > > Key: ARIES-1316 > URL: https://issues.apache.org/jira/browse/ARIES-1316 > Project: Aries > Issue Type: Bug > Components: Blueprint > Affects Versions: blueprint-authz-1.0.0 > Reporter: Pavel Alekhin > Assignee: Christian Schneider > Priority: Minor > > Using of interface variable causes empty roles' list error {color:red}Method > call interface EchoService.echo denied. Roles allowed are []{color}, when > interface doesn't have method authorizing annotations, while implementing > class has. > Code example: > {code:title=EchoService.java|borderStyle=solid} > public interface EchoService { > //@RolesAllowed("admin") > public String echo(String message); > } > {code} > {code:title=SimpleEchoService.java|borderStyle=solid} > public class SimpleEchoService implements EchoService { > @RolesAllowed("admin") > @Override > public String echo(String message) { > return message; > } > } > {code} > {code:title=EchoCommand.java|borderStyle=solid} > @Command(scope = "kb", name = "echo") > public class EchoCommand extends OsgiCommandSupport { > private EchoService echoService; > public EchoService getEchoService() { > return echoService; > } > public void setEchoService(EchoService echoService) { > this.echoService = echoService; > } > @Argument(index = 0, name = "message", required = true, multiValued = > false) > private String message; > @Override > protected Object doExecute() throws Exception { > return echoService.echo(message); > } > } > {code} -- This message was sent by Atlassian JIRA (v6.3.4#6332)