RoleSecurityDynamicFeature.java
package io.extact.rms.platform.role;
import jakarta.annotation.security.DenyAll;
import jakarta.annotation.security.RolesAllowed;
import jakarta.ws.rs.container.DynamicFeature;
import jakarta.ws.rs.container.ResourceInfo;
import jakarta.ws.rs.core.FeatureContext;
import org.eclipse.microprofile.config.ConfigProvider;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class RoleSecurityDynamicFeature implements DynamicFeature {
@Override
public void configure(ResourceInfo resourceInfo, FeatureContext context) {
if (!enableFilter()) {
log.debug("設定(jwt.filter.enable)がOFFになっているためロールチェックは行いません");
return;
}
// methodのアノテーションから優先して確認
var method = resourceInfo.getResourceMethod();
if (method.getAnnotation(DenyAll.class) != null) {
context.register(new DenyAllRequestFilter());
return;
}
var rolesAllowed = method.getAnnotation(RolesAllowed.class);
if (rolesAllowed != null) {
context.register(new RolesAllowedRequestFilter(rolesAllowed));
return;
}
// classのアノテーションを確認
var clazz = resourceInfo.getResourceClass();
if (clazz.getAnnotation(DenyAll.class) != null) {
context.register(new DenyAllRequestFilter());
return;
}
rolesAllowed = clazz.getAnnotation(RolesAllowed.class);
if (rolesAllowed != null) {
context.register(new RolesAllowedRequestFilter(rolesAllowed));
return;
}
// 上に該当しないDenyAllもRolesAllowedも付いてないメソッドはどのロールでもアクセス可能
}
private boolean enableFilter() {
var config = ConfigProvider.getConfig();
return config.getValue("jwt.filter.enable", Boolean.class);
}
}