如果有人能帮助我回答以下问题,我将非常感激:
- @RolesAllowed和@DeclareRoles注释之间有什么区别?
- 我开发了一个登录功能,可以检查用户名和密码是否与数据库中的信息匹配。但是我想知道如何为经过身份验证的用户分配角色,以便与上述注释一起使用。
如果有人能帮助我回答以下问题,我将非常感激:
您的问题的第二部分如下:
我已经开发了一个登录功能,用于检查用户名和密码是否与数据库中的信息匹配。但是,我想问一下如何为经过身份验证的用户分配角色以供上述注释使用。
在这种情况下,需要注意的一般点是,除非您的用例确实需要它,否则我的首选方法是不使用编程安全性。在大多数情况下,如果可以通过声明性安全实现要求,则最好使用它,因为编程安全性要求您跟踪isCallerInRole
方法调用,并且没有这样的调用可能导致安全漏洞。无论哪种方式,在您的情况下,您需要使容器首先识别数据库中的组和主体作为可用于访问控制检查的角色。
简而言之,EJB客户端(Java SE应用程序、Servlet或另一个EJB)必须首先对容器的安全机制进行身份验证,以建立调用者的Principal
。因此,成功使用声明性或编程安全性取决于成功的身份验证过程。在您的情况下,您需要配置容器以识别数据库中的组和用户,并将其转换为可以用于以声明性或编程方式强制执行访问控制的Principal
对象。大多数容器支持一种或多种JAAS登录模块,用于此目的;例如,Glassfish 3.1可以使用JDBCRealm实现此目的,而JBoss 6.0则支持DatabaseServerLoginModule。因此,您需要确定您的容器是否支持此类登录模块,并将其配置为使用您的数据库。
请注意,在某些情况下,容器提供的登录模块可能无法满足您的需求。这种情况下,您需要编写自己的登录模块(如果需要,可以针对容器的接口进行编写)。
另外,您还需要将应用程序使用的角色映射到 JAAS 领域中的用户和组。例如,如果您的数据库是由 JAAS 领域使用:
U1
、U2
、U3
、U4
和 U5
,以及G1
、G2
和 G3
,分别包含 U1
、U2
、U3
,@RolesAllowed
注解定义的角色 R1
、R2
和 R3
的用户访问其方法,那么您需要将角色映射到 JAAS 领域中的主体(用户和组)。即使角色名称与主体名称相同,也必须进行映射;Glassfish 通过支持默认主体到角色映射来简化此过程,直接将具有类似名称的主体(用户或组)映射到角色。此外,映射的过程是容器特定的,并且正如您所想象的那样,此映射是在容器特定的部署描述符中执行而不是在 EJB 部署描述符(ejb-jar.xml
)中执行。
@Stateless
@DeclareRoles({"committer", "contributor"})
@RolesAllowed({"committer"})
public class OpenSourceProjectBean implements Project {
public String svnCommit(String s) {
return s;
}
public String svnCheckout(String s) {
return s;
}
@RolesAllowed({"contributor"})
public String submitPatch(String s) {
return s;
}
}
编辑:
这里是SQLLoginModule的代码片段。您可以使用此模块作为登录模块。通过这种方式,您可以遵循JAAS标准。
在提交中,它将调用此函数以添加主体。
subject.getPrincipals().addAll(allPrincipals);
此外,您可以在此处查看更多详细信息http://openejb.apache.org/3.0/security.html。
该网页列出了其他可供选择的选项。