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.xmlejb.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 实际列出用户拥有的所有角色。您将需要遍历固定的角色列表并使用isCallerInRoleisUserInRole。有一些方法可以降低Principal 然后获取角色列表,但我认为它不是可移植的(我不记得确切的这个)。 其实,Ron Monzillo's blog offers a portable solution 得到了Principal 的角色。

以上是关于Java EE 服务器上的动态角色的主要内容,如果未能解决你的问题,请参考以下文章

Java EE 身份验证和授权 [关闭]

Java EE 身份验证和授权 [关闭]

使用Windows 10在Eclipse ee上的Glassfish 4的位置

微服务与Java EE

手动创建Servlet--J2EE学习笔记

Java EE 和应用程序服务器 - 我能做啥?