对于Java EE6项目使用glassfish 3.1.1,glassfish-web.xml
中定义的安全角色映射不会影响'用户 - 角色'映射。
致电request.isUserInRole("USER")
以及request.isUserInRole("ADMIN")
始终会返回false
。
的glassfish-web.xml中
<glassfish-web-app>
<security-role-mapping>
<role-name>ADMIN</role-name>
<group-name>ADMIN</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>USER</role-name>
<group-name>USER</group-name>
</security-role-mapping>
</glassfish-web-app>
使用LoginBean.java
注释@DeclareRoles
,如下所示,角色按预期分配。
LoginBean.java
...
@DeclareRoles({"ADMIN", "USERS"})
@Named(value = "loginBean")
@RequestScoped
public class LoginBean implements Serializable { ...
为什么我需要@DeclareRoles
中的LoginBean.java
才能获得request.isUserInRole
的“用户 - 角色”映射?
答案 0 :(得分:4)
A similar question on Coderanch引用 17.2.5.3 Bean代码引用的安全角色声明 EJB 3.1 specification:
Bean Provider负责使用DeclareRoles 注释或部署的
security-role-ref
元素 描述符,用于声明在中使用的所有安全角色名称 企业bean代码。在{上指定DeclareRoles
注释 bean类,用于声明可以通过测试的角色 从带注释的类的方法中调用isCallerInRole
。 声明安全角色允许 Bean Provider, Application Assembler或Deployer用于链接这些安全角色名称 在代码中用于为汇编定义的安全角色 申请。[...]
如果未使用
DeclareRoles
注释,Bean Provider必须 使用部署描述符的security-role-ref
元素 声明代码中引用的安全角色。
(强调我的)
所以这只是对Deployer的一个简单提示,他们不必解释代码来获取已使用角色的列表。如果开发人员使用来自其他方法或来自非常复杂逻辑的角色名称调用isUserInRole()
方法,那可能会非常困难。
这也很有用(来自 17.3 Bean Provider和/或Application Assembler的责任):
提供企业安全视图的主要原因 bean是为了简化Deployer的工作。在没有安全措施的情况下 对于一个应用程序的视图,Deployer需要详细的知识 应用程序以安全地部署应用程序。例如, 部署者必须知道每种业务方法的作用 确定哪些用户可以调用它。由...定义的安全视图 Bean Provider或Application Assembler提供了更加整合的功能 查看部署人员,让部署人员不那么熟悉 申请。
(我看到问题是关于一个Web应用程序,但我认为背后的原因是相同的,并且servlet规范不是那么详细。)
来自部署者的责任:安全角色的分配(17.4.2):
部署者分配校长和/或校长团队(例如 用于管理安全性的个人用户或用户组 操作环境到通过安全角色定义的安全角色
DeclareRoles
和RolesAllowed
元数据注释和/或 部署描述符的security-role
个元素。
因此,根据规范,glassfish-web.xml
由Deployer(而不是Bean Provider或Application Assembler)创建,而对于Deployer的工作,他需要来自“DeclareRoles
和{{1}的角色名称元数据注释和/或部署描述符的RolesAllowed
元素。“
答案 1 :(得分:1)
glassfish-web.xml中的角色映射将Java EE应用程序的安全角色名称转换为部署环境用户/组机制。角色是抽象的......在您的应用程序使用角色之前,映射是不必要的,不需要参考。