Security 如何以编程方式获取@DeclareRoles定义的角色

Security 如何以编程方式获取@DeclareRoles定义的角色,security,jakarta-ee,Security,Jakarta Ee,将JavaEE应用程序部署为WAR文件时(使用WAS Liberty Profile应用程序服务器),应用程序角色和用户组之间的映射在server.xml中定义。我们选择通过一个ejbbean拦截器来实现安全性,该拦截器将方法注释上声明的权限与分配给用户的一组权限进行比较。 这个想法基于Java杂志上的一篇原创文章 为了更进一步,我们希望将与用户关联的角色映射到更细粒度的权限集。不幸的是,(目前)没有办法轻松获得与用户关联的角色列表。和提出了两种建议的方法 我突然想到,如果我能够获得@Decla

将JavaEE应用程序部署为WAR文件时(使用WAS Liberty Profile应用程序服务器),应用程序角色和用户组之间的映射在server.xml中定义。我们选择通过一个ejbbean拦截器来实现安全性,该拦截器将方法注释上声明的权限与分配给用户的一组权限进行比较。 这个想法基于Java杂志上的一篇原创文章

为了更进一步,我们希望将与用户关联的角色映射到更细粒度的权限集。不幸的是,(目前)没有办法轻松获得与用户关联的角色列表。和提出了两种建议的方法

我突然想到,如果我能够获得@DeclareRoles()注释定义的角色列表,我就可以为每个角色使用request.isUserInRole(role)方法,而不必自己维护单独的角色列表


有没有人使用过这种方法,或者自本文撰写以来,有没有更好的方法来实现更细粒度的安全模型?

当然,您可以这样做:

@Stateless
@LocalBean
@DeclareRoles({ ROLE1, ROLE2, ROLE3 })
public class IsCallerInRoleDemoSessionBean {

    @Resource
    private SessionContext sessionContext;

    @PermitAll
    public Set<String> discoverRoles() {
        Set<String> roleNames = new HashSet<>();
        DeclareRoles declaredRoles = IsCallerInRoleDemoSessionBean.class.getAnnotation(DeclareRoles.class);
        for (String roleName : declaredRoles.value())
            if (sessionContext.isCallerInRole(roleName))
                roleNames.add(roleName);
        return roleNames;
    }

}
@无状态
@本地豆
@申报单({ROLE1,ROLE2,ROLE3})
公共类是CallerInroleDemosessionBean{
@资源
非公开会话上下文会话上下文;
@佩尔米塔尔
公共集合发现角色(){
Set roleNames=new HashSet();
DeclareRoles declaredRoles=iscalerInroledemositionbean.class.getAnnotation(DeclareRoles.class);
for(字符串roleName:declaredRoles.value())
if(sessionContext.isCallerInRole(roleName))
添加(roleName);
返回角色名称;
}
}
这是几年前我为某人做的一件旧衣服


理想情况下,这也会检查超级类。

你的意思是什么?谢谢Steve,你的回答非常正确,我更新了我的问题。