Java EE 服务器上的动态角色
Posted
技术标签:
【中文标题】Java EE 服务器上的动态角色【英文标题】:dynamic roles on a Java EE server 【发布时间】:2011-01-14 21:37:45 【问题描述】:我想在专用应用程序中管理用户和角色。例如,此应用程序的用户(“customerX boss”)可以创建一个新角色“customerX employee”。如果员工访问 Java EE 应用程序服务器 (GlassFish 3),他应该获得“customerX 员工”角色。
听起来很简单,但 Java EE 不支持,因为组在启动时映射到角色,而应用程序中的角色是静态的。
在 Java EE (6) 环境中在运行时管理用户角色的最佳方式是什么?
【问题讨论】:
我创建了java.net/jira/browse/JAVAEE_SPEC-20 以支持(以及其他)这个用例。如果您或其他任何人仍然对 Java EE 角色缺乏活力感到困扰,请投票或发表评论。 【参考方案1】:Java EE 中的声明式安全性确实不适合这种要求。安全问题可以分为两部分:
身份验证 授权我曾经有过类似的要求。我们使用内置身份验证来设置主体,然后依赖默认的 Java EE 登录机制。但我们最终在应用程序级别手动管理授权部分。
事实上,即使是要加载并与主体相关联的角色(isUserInRole
用于 Web,isCallerInRole
用于 EJB)也需要在 web.xml
或 ejb.xml
中指定,但这还不够灵活性。然后我们必须从 LDAP 或 ActiveDirectory 手动加载角色(根据主体)。然后我们使用 EJB3 拦截器和 Servlet 过滤器自己执行安全检查。
不过,我强烈建议坚持使用基于角色的访问控制 (RBAC),而不是实现更花哨的东西。有几个框架可以帮助处理自制的 RBAC。
我们还查看了JSecurity 和Acegi Security,它们看起来很有趣。
【讨论】:
感谢您的回答,尤其是提示即使是动态设置的角色也必须在 web.xml 或 ejb.xml 中静态声明!那将是我的下一个陷阱。我将检查 JSecurity 和 Spring Security(Acegi 的继任者)static.springsource.org/spring-security/site/index.html。 JSecurity 现在被称为“Shiro”。 cwiki.apache.org/confluence/display/SHIRO/Index 是的,用<security-role>
或@DeclaredRoles
声明的角色实际上是符号名称,应该使用<security-role-mapping>
映射到外部目录(例如LDAP)中的角色。如果映射是 1 对 1,Glassfish 有一个选项“默认主体到角色映射”,但这只是解决方案的一半,您仍然必须在某处列出角色。
也无法通过 JEE API 实际列出用户拥有的所有角色。您将需要遍历固定的角色列表并使用isCallerInRole
或isUserInRole
。有一些方法可以降低Principal
然后获取角色列表,但我认为它不是可移植的(我不记得确切的这个)。
其实,Ron Monzillo's blog offers a portable solution 得到了Principal
的角色。以上是关于Java EE 服务器上的动态角色的主要内容,如果未能解决你的问题,请参考以下文章