gpt4 book ai didi

java-ee-6 - 没有可用于 sessionContext.isCallerInRole() 的角色引用的映射

转载 作者:行者123 更新时间:2023-12-02 23:00:29 24 4
gpt4 key购买 nike

我有一个方法,如果该人具有特定角色并且他们与 JIRA 中的特定组相关联,则可以调用该方法。由于 JIRA 中的组是动态的,因此我无法为每个 JIRA 组分配一个角色。

@DeclareRoles({
FileServerRoles.FILE_ADDER,
FileServerRoles.FILE_ADDER_ALL,
FileServerRoles.FILE_VIEWER,
FileServerRoles.FILE_VIEWER_ALL})
public final class FileServerRoles {

/**
* A user that can add files to the system.
*/
public static final String FILE_ADDER = "file-adder";
/**
* A user that can add any files to the system.
*/
public static final String FILE_ADDER_ALL = "file-adder-all";
/**
* A user that can view files in the system.
*/
public static final String FILE_VIEWER = "file-viewer";
/**
* A user that can view all files in the system.
*/
public static final String FILE_VIEWER_ALL = "file-viewer-all";
}

我使用 @DeclareRoles 声明所有角色。

@Decorator
public class FileServerServiceProjectAuthorizationDecorator implements FileServerService {

private static Logger LOGGER = LoggerFactory.getLogger(FileServerServiceProjectAuthorizationDecorator.class);
@Inject
@Delegate
@Any
FileServerService delagate;
@Inject
@CurrentUser
Set<JiraProjectReference> currentUserProjectReferences;
@Resource
SessionContext sessionContext;

void verifyProjectKey(final String projectKey) {
for (final JiraProjectReference projectReference : currentUserProjectReferences) {
if (projectReference.getKey().equalsIgnoreCase(projectKey)) {
return;
}
}
throw new IllegalArgumentException("user not in the project");
}

@RolesAllowed({FileServerRoles.FILE_ADDER, FileServerRoles.FILE_ADDER_ALL})
@Override
public FileAddStatus addFileToRepository(final String projectKey, final String issueKey, final String fileName, final String mimeType, final File file) {
if (!sessionContext.isCallerInRole(FileServerRoles.FILE_ADDER_ALL)) {
verifyProjectKey(projectKey);
}
return delagate.addFileToRepository(projectKey, issueKey, fileName, mimeType, file);
}

@RolesAllowed({FileServerRoles.FILE_VIEWER, FileServerRoles.FILE_VIEWER_ALL})
@Override
public FileDescriptor retrieveFileFromRepository(final String projectKey, final String issueKey, final UUID uuid, final String fileName) {
if (!sessionContext.isCallerInRole(FileServerRoles.FILE_VIEWER_ALL)) {
verifyProjectKey(projectKey);
}

return delagate.retrieveFileFromRepository(projectKey, issueKey, uuid, fileName);
}
}

!sessionContext.isCallerInRole(FileServerRoles.FILE_VIEWER_ALL) 总是抛出 IllegalStateException:

Caused by: java.lang.IllegalStateException: No mapping available for role reference file-viewer-all
at com.sun.ejb.containers.EJBContextImpl.isCallerInRole(EJBContextImpl.java:458)
at edu.wvu.esd.swordfish.web.service.FileServerServiceProjectAuthorizationDecorator.retrieveFileFromRepository(FileServerServiceProjectAuthorizationDecorator.java:59)
... 89 more

对于 @RolesAllowed 中引用的任何角色,我都没有遇到任何问题。我还尝试将角色声明移至 web.xml 中。谷歌上没有太多关于该错误的引用。

有人看过这个吗?你的解决方案是什么?

最佳答案

在 GlassFish 3.1 中的 EJB 中调用 isCallerInRole(roleName) 方法时,我收到了相同的“没有可用于角色引用的映射”错误。对我来说解决这个问题的方法是向我的 EJB 添加适当的 @DeclareRoles 注释。如果传递给 isCallerInRole 的角色名称不在 @DeclareRoles 中,则会抛出 IllegalStateException。我不确定装饰器中的安全性如何工作,但 @DeclareRoles 对我来说是关键。

这是一个简单的例子:

@Stateless
@LocalBean
@DeclareRoles({"user", "admin"})
public class ExampleEJB {
@Resource
private SessionContext sessionContext;

public boolean isUserInRole(String roleName) {
return sessionContext.isCallerInRole(roleName);
}
}

关于java-ee-6 - 没有可用于 sessionContext.isCallerInRole() 的角色引用的映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5266589/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com