Java EE安全模型是否支持ACL?

Tha*_*ham 8 java security acl glassfish java-ee

我使用了Java EE 6和Glassfish v3.0.1,我想知道Java EE安全模型是否支持ACL,如果是的话,它是如何获得细粒度的?

编辑
我使用jdbc realm通过glassfish v3实现安全性,运行时领域查看数据库中的表USER以检查身份验证,通过查看password字段查看字段和授权role.角色字段仅包含2个ADMINISTRATORDESIGNER.所以它是用户和角色之间的一对一地图.在托管bean级别,我实现了这一点

private Principal getLoggedInUser()
{
    HttpServletRequest request =
            (HttpServletRequest) FacesContext.getCurrentInstance().
                getExternalContext().getRequest();
    if(request.isUserInRole("ADMINISTRATORS")){
        admin = true;
    }else{
        admin = false;
    }
    return request.getUserPrincipal();
}

public boolean isUserNotLogin()
{
    Principal loginUser = getLoggedInUser();
    if (loginUser == null)
    {
        return true;
    }
    return false;
}

public String getLoginUserName()
{
    Principal loginUser = getLoggedInUser();
    if (loginUser != null)
    {
        return loginUser.getName();
    }
    return "None";
} 
Run Code Online (Sandbox Code Playgroud)

通过调用isUserInRole,我可以确定用户是否admin,然后JSF将render适当的内容.但是,这还不够精细(真正的快速背景信息:有多个项目,一个项目包含多个图纸).因为如果你是个DESIGNER,你可以看到所有的项目(如果我只希望所有的图纸tom上的项目工作A,同时peter将项目工作B,Cindy可以监督在两个项目AB).我希望在运行时,当我创建用户时,我可以专门设置他/她可以看到的项目.有没有办法实现这个目标? 注意:不仅仅有两个项目,上面的示例仅用于演示.

Pet*_*ans 5

Java EE安全模型对"Principal"进行身份验证,该"Principal"可能具有一个或多个"角色".

在另一个维度,您拥有需要可配置的"权限"或"功能"的服务和资源.

在配置中,您可以确定哪些"主体"或"角色"具有"权限"或"功能".

换句话说,是的,它支持ACL,它可以像你想要的那样细粒度,但你必须习惯这个术语.

Vineet的答案是根据项目ID创建"角色"的绝佳建议.由于人们无论如何都必须被分配到项目中,因此当时将人员添加到这些组中是很简单的.或者,定时脚本可以根据角色更新组成员身份.后一种方法可以是可取的,因为它更容易验证的安全性,如果这些决定是在一个地方,而不是分散在各地的管理代码.

或者您可以使用"粗粒度"的角色如设计师,并利用数据库(或程序逻辑)来限制登录的用户的意见

SELECT p.* FROM projects p, assignments a WHERE p.id = a.projectId AND a.finishdate < NOW();
Run Code Online (Sandbox Code Playgroud)

要么

@Stateless class SomeThing {

    @Resource SessionContext ctx;

    @RolesAllowed("DESIGNER")
    public void doSomething(Project project) {
        String userName = ctx.getCallerPrincipal.getName();

        if (project.getTeamMembers().contains(userName) {
            // do stuff
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

请注意,粗粒度访问控制在这里使用注释而不是代码完成.这可以很难从代码中测试样板并节省大量时间.

有类似的功能可以呈现网页,您可以使用标签基于当前用户呈现屏幕的某些部分.

此外,由于安全性是一个广泛关注的问题,我认为最好使用提供的功能来获取上下文,而不是传递像isAdmin这样的一组布尔标志,因为这很快变得非常混乱.它增加了耦合,这使得类更难以进行单元测试.

在许多JSF实现中,有一些标记可以帮助渲染可选的东西.以下是richfaces和seam的示例:

<!-- richfaces -->
<rich:panel header="Admin panel" rendered="#{rich:isUserInRole('admin')}">
  Very sensitive information
</rich:panel>

<!-- seam -->
<h:commandButton value="edit" rendered="#{isUserInRole['admin']}"/>.
Run Code Online (Sandbox Code Playgroud)

这是一篇解释如何将其添加到ADF的文章