Jakarta ee JAAS中的编程授权

Jakarta ee JAAS中的编程授权,jakarta-ee,glassfish,jaas,java-ee-7,glassfish-4.1,Jakarta Ee,Glassfish,Jaas,Java Ee 7,Glassfish 4.1,我需要以编程方式添加授权(authority)约束(这里不是身份验证)。我有一个应用程序范围的CDI托管bean,如下所示 @Named @ApplicationScoped public class Bean { @Inject private Service service; private List<Entity>list; public Bean() {} @PostConstruct private void init()

我需要以编程方式添加授权(authority)约束(这里不是身份验证)。我有一个应用程序范围的CDI托管bean,如下所示

@Named
@ApplicationScoped
public class Bean {
    @Inject
    private Service service;
    private List<Entity>list;

    public Bean() {}

    @PostConstruct
    private void init() {
        initialize();
    }

    private void initialize() {
        // Initialize the list on application start up.
        // The service.getList() method in an EJB is authenticated anonymously
        // for the first time on application start up.
        list=service.getList();

        // Do something programmatically to enforce the authority ROLE_ADMIN afterwords.
    }

    // This method is only invoked by an admin (ROLE_ADMIN) as and when required.
    // The @PostConstruct method may however be invoked by an anonymous user on start up.
    public void action() {
        initialize();
    }
}

我目前正在使用GlassFish Server 4.1,但如果答案是容器不可知的,那就更好了。

我不确定是否有效,但您可以尝试以下方法。创建一个接收SessionContext的EJB Bean,然后使用方法isCallerInRole(role)


在类中注入这个bean,然后检查角色。这里的问题是它的类(ApplicationScoped)的范围,因此不确定它是否会工作

也许我认为这在
@ApplicationScoped
bean的上下文中没有多大意义。@peeskillet:整个页面仅仅描述了
@DeclareRoles
@RolesAllowed
@RunAs
的用法。它没有说任何关于在运行时动态分配权限/角色的内容,即“以编程方式”。@SteveC:我完全没有找到你。这个bean是
@ApplicationScoped
。所有用户都将访问同一实例,它的
@PostConstruct
方法将只被调用一次(每个应用程序节点)。您要求根据第一个访问它的用户所具有的角色对其进行初始化。问题的性质完全不同。这与用户的权限检查或权限检查无关。方法
getList()
所在的EJB在第一次调用时进行匿名身份验证,因为它是在应用程序启动时调用的(在
@PostConstruct
方法中,每个应用程序范围只能延迟或急切地调用一次)。如果以声明方式(使用
@RolesAllowed(value={“role\u ADMIN”})
为方法本身或相关EJB分配了角色/权限,它将因安全异常而失败这里的要点是,应该在
@PostConstruct
方法完成之前分配权限
ROLE\u ADMIN
,以便该方法或EJB可以在之后被授予权限
ROLE\u ADMIN
,即EJB方法
getList()第一次加载应用程序作用域bean时,应匿名调用
,但在每次调用该方法时(从
@PostConstruct
方法的第一次调用除外),应授予其权限
ROLE\u ADMIN
。这是一个非常特殊的情况,并不总是需要HttpServletRequest#isUserInRole(“角色管理”)在web层本身上模拟代码>。没有必要在web层上使用
SessionContext
EjbContext
来实现这一点。Ok@Tiny,真的没有这样理解您的问题。事实上,用户的角色在web层和ejb中都可以看到,但后来认为制作ejb是合适的,因为您可以删除角色允许的注释,然后通过同一方法中的SessionContext查看谁是用户及其权限。如果您的需求不允许删除RollsAllowed,那么可以尝试使用反射、aop或字节码操作(javaassist)在运行时添加或删除注释,例如,添加PermitAll注释,然后将其删除。我不知道这是否可行,因为服务器已经完全处理EJB,但这是一种尝试。
@Stateless
@DeclareRoles(value = {"ROLE_ADMIN", "ROLE_USER"})
@RolesAllowed(value = {"ROLE_ADMIN"})
public class Skeleton implements Service {

    @Override
    public List<Entity> getList() {
        return entityManager.createQuery("SELECT e FROM Entity e").getResultList();
    }
}
@Stateless
public class AuthorizationBean {
    @Resource
    private SessionContext sessionContext;

    public Boolean isCallerInRole(String role){
     return this.sessionContext.isCallerInRole(role);
    }
}