Jakarta ee JAAS中的编程授权
我需要以编程方式添加授权(authority)约束(这里不是身份验证)。我有一个应用程序范围的CDI托管bean,如下所示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()
@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);
}
}