Figured out how to avoid needing access to the annotation class using
"DotName". I guess I could do the same thing for ANY of the shiro
classes I reference. I don't know enough to know the ins/outs of when
that is better vs using .class.
This is my minimal processor class in the deployment module of the
extension:
package com.example.quarkus.shiro.deployment;
import io.quarkus.arc.deployment.AdditionalBeanBuildItem;
import io.quarkus.arc.deployment.AnnotationsTransformerBuildItem;
import io.quarkus.deployment.annotations.BuildProducer;
import io.quarkus.deployment.annotations.BuildStep;
import io.quarkus.deployment.builditem.FeatureBuildItem;
import jakarta.annotation.security.DenyAll;
import jakarta.annotation.security.PermitAll;
import jakarta.annotation.security.RolesAllowed;
import org.apache.shiro.authz.annotation.RequiresAuthentication;
import org.apache.shiro.authz.annotation.RequiresGuest;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.apache.shiro.authz.annotation.RequiresRoles;
import org.apache.shiro.authz.annotation.RequiresUser;
import org.apache.shiro.cdi.ShiroSecurityInterceptor;
import org.jboss.jandex.AnnotationInstance;
import org.jboss.jandex.AnnotationTransformation;
import org.jboss.jandex.DotName;
class QuarkusShiroProcessor {
private static final String FEATURE = "quarkus-shiro";
@BuildStep
FeatureBuildItem feature() {
return new FeatureBuildItem(FEATURE);
}
@BuildStep
AnnotationsTransformerBuildItem transformAnnotations() {
return new
AnnotationsTransformerBuildItem(AnnotationTransformation.builder()
.whenAnyMatch(RequiresAuthentication.class,
RequiresAuthentication.class,
RequiresGuest.class, RequiresPermissions.class,
RequiresRoles.class, RequiresUser.class,
RolesAllowed.class, PermitAll.class,
DenyAll.class)
.transform(t ->
t.add(AnnotationInstance.builder(DotName.createSimple("org.apache.shiro.cdi.ShiroSecureAnnotation")).build()))
);
}
@BuildStep
void buildCdiBeans(BuildProducer<AdditionalBeanBuildItem>
additionalBean) {
additionalBean.produce(AdditionalBeanBuildItem.unremovableOf(ShiroSecurityInterceptor.class));
}
}
On 3/10/2025 2:29 PM, [email protected] wrote:
I *think* if the ShiroSecureAnnotation were public I wouldn't need
any of that but I need to reference that annotation class to add it to
classes/methods in the BuildStep in a similar way you guys do in the
CDI Extension so the interceptor works.