版本: GlassFish Server 3.1.2.2(版本5)
我有一个EAR
项目,其中包含WAR
和一个EAR
。
在EAR的META-INF
文件夹中,我有一个sun-application.xml
文件,可以将一组角色映射到组。
在Glassfish
的默认文件域中,我已配置映射到这些组的用户。
我没有使用默认角色映射,我还没有激活安全管理器。
Access完美无缺。通过删除部署描述符进一步证明了这一点,当尝试在没有它的情况下登录时会导致授权异常。
然而,当我试图访问看似随机(但一致)的EJB选择时,我对臭名昭着的Glassfish" javax.ejb.AccessLocalException: Client not authorized for this invocation
"例外。
我have tried to delete my generated Policy files and redeploy the server,但这不起作用。
当我查看EJB的策略文件时,我立即注意到缺少受影响的EJB授权。
似乎错过了sun-application.xml文件中定义的每个组的一个或两个角色。
为什么Glassfish无法从(经过验证的)sun-application.xml
和(已证明的)@RolesAllowed
定义集生成完整政策文件?
这是部署描述符:
<!DOCTYPE sun-application PUBLIC "-//Sun Microsystems, Inc.//DTD
GlassFish Application Server 3.0 Java EE Application 6.0//EN"
"http://www.sun.com/software/appserver/dtds/sun-application_6_0-0.dtd">
<sun-application>
<security-role-mapping>
<role-name>ViewAllData</role-name>
<role-name>BasicUser</role-name>
<group-name>BasicGroup</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>DataSupervisor</role-name>
<group-name>DatasetSupervisors</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>FindData</role-name>
<role-name>FindSubData</role-name>
<group-name>DatasetUsers</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>ManageData</role-name>
<role-name>ManageSubData</role-name>
<role-name>InvokeDataload</role-name>
<group-name>DatasetManagers</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>ResolveGroup1</role-name>
<role-name>ResolveGroup2</role-name>
<role-name>ResolveGroup3</role-name>
<group-name>Decoders</group-name>
</security-role-mapping>
</sun-application>
由于某种原因,EJB granted.policy文件中缺少角色ResolveGroup1
和ViewAllData
,尽管出现在几个EJB中:
@RolesAllowed({"ResolveGroup1"})
@Stateless(mappedName = "ejb/FindGroupOneController")
@Local(FindRegistrationFragmentController.class)
@Interceptors(SpringBeanAutowiringInterceptor.class)
public class FindGroupOneControllerImpl implements FindGroupOneController{
@RolesAllowed({"ViewAllData"})
@Stateless(mappedName = "ejb/ViewDataController")
@Local(FindRegistrationFragmentController.class)
@Interceptors(SpringBeanAutowiringInterceptor.class)
public class ViewDataControllerImpl implements ViewDataController{
答案 0 :(得分:0)
除非有人能告诉我,否则看起来我遇到问题的原因是因为每<role-name>
只能使用一个<security-role-mapping>
。