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

时间:2017-04-10 17:20:42

标签: security java-ee

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

为了进一步理解,我们希望将与用户关联的角色映射到更精细的权限集。不幸的是,(目前)没有办法轻易获得与用户相关的角色列表。 stack overflow article@Josh {}提出了两种建议的方法。

令我感到震惊的是,如果我能获得@DeclareRoles()注释定义的角色列表,我可以为每个角色使用request.isUserInRole(role)方法,而不必自己维护一个单独的角色列表

自从撰写文章以来,有没有人使用过这种方法,还是有更好的方法来实现更精细的安全模型?

1 个答案:

答案 0 :(得分:1)

嗯,你当然可以这样做:

@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;
    }

}

这是几年前我为某人做的一个旧Arquillian Security Demo

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