问题 Java EE服务器上的动态角色


我想在专用的应用程序中管理用户和角色。例如,该应用程序的用户(“customerX boss”)可以创建新角色“customerX employee”。如果员工访问Java EE应用程序服务器(GlassFish 3),他应该获得“customerX employee”角色。

这听起来很简单,但Java EE不支持它,因为组在启动时映射到角色,而应用程序中的角色是静态的。

在Java EE(6)环境中在运行时管理用户角色的最佳方法是什么?


4015
2018-02-09 16:36


起源

我创造了 java.net/jira/browse/JAVAEE_SPEC-20 支持(以及其他)此用例。如果您或其他任何人仍然对Java EE角色缺乏活力感到困扰,请投票或发表评论。 - Arjan Tijms


答案:


Java EE中的声明性安全性确实不适合这种要求。安全问题可以分为两类:

  • 认证
  • 授权

我曾经有过类似的要求。我们使用内置身份验证来设置主体,然后依赖于默认的Java EE登录机制。但我们最终在应用级别手动管理授权部分。

实际上,即使是将被加载并与委托人相关联的角色(isUserInRole 对于网络和 isCallerInRole 对于EJB)需要在中指定 web.xml 要么 ejb.xml 这没有提供足够的灵活性。然后我们从LDAP或ActiveDirectory手动加载角色(根据主体)。然后我们使用EJB3拦截器和Servlet过滤器来自己执行安全检查。

但是,我强烈建议坚持使用基于角色的访问控制(RBAC),而不是实现更加花哨的东西。有几个框架可以帮助处理自制的RBAC。

我们也看过了 JSecurity 和 Acegi安全 他们似乎很有趣


11
2018-02-09 17:32



感谢您的回答,尤其是提示甚至动态设置角色必须在web.xml或ejb.xml中静态声明!这对我来说可能是下一个陷阱。我将查看JSecurity是Spring Security(Acegi的继承者) static.springsource.org/spring-security/site/index.html。 - deamon
JSecurity现在被称为“Shiro”。 cwiki.apache.org/confluence/display/SHIRO/Index - deamon
是的,声明的角色 <security-role> 要么 @DeclaredRoles 实际上是符号名称,应该使用映射到外部目录(例如LDAP)中的角色 <security-role-mapping>。如果映射是1对1,Glassfish有一个选项“默认主体到角色映射”,但这只是解决方案的一半,你仍然必须在某处列出角色。 - ewernli
也无法实际列出用户使用JEE API的所有角色。您将需要迭代固定的角色列表并使用 isCallerInRole 要么 isUserInRole。有一些方法可以贬低 Principal 然后获取角色列表,但我认为它不可移植(我不记得这个角色)。 - ewernli
其实, Ron Monzillo的博客提供便携式解决方案 得到一个 Principal的角色。 - Laird Nelson