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个ADMINISTRATOR或DESIGNER.所以它是用户和角色之间的一对一地图.在托管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可以监督在两个项目A和B).我希望在运行时,当我创建用户时,我可以专门设置他/她可以看到的项目.有没有办法实现这个目标? 注意:不仅仅有两个项目,上面的示例仅用于演示.
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的文章
| 归档时间: |
|
| 查看次数: |
3301 次 |
| 最近记录: |