如何在GlassFish 2上保护Web服务?

时间:2011-01-27 16:57:59

标签: java web-services security glassfish ejb-3.0

我们在GlassFish 2服务器上部署了一些不透明的EJB(EJB3),它们通过@Webmethod注释将它们的一些方法公开为webservices。

现在我们要保护这些Web服务方法,以便只有经过身份验证的客户端才能调用它。什么是实现这一目标的好方法?

3 个答案:

答案 0 :(得分:5)

像善良的牧师所说的那样。以下示例使用文件域进行身份验证。

@Stateless
@WebService(name = "MyAppServices")
@RolesAllowed({"user"})
public class ItemEJB {
    ...
}

您还需要 sun-ejb-jar.xml ,例如

<sun-ejb-jar>
<security-role-mapping>
            <!-- as defined in @RolesAllowed -->
    <role-name>user</role-name>
            <!-- glassfish group created in file realm -->
    <group-name>user</group-name>
</security-role-mapping>
<enterprise-beans>
    <ejb>
        <ejb-name>ItemEJB</ejb-name>
        <webservice-endpoint>
            <!-- equivalent to name attribute of @WebService -->
            <port-component-name>MyAppServices</port-component-name>
            <login-config>
                <auth-method>BASIC</auth-method>
                <realm>file</realm>
            </login-config>
        </webservice-endpoint>
    </ejb>
</enterprise-beans>

在glassfish的文件领域中创建一个组是微不足道的(管理控制台)。但是,您可以创建自己的自定义领域和登录模块

答案 1 :(得分:3)

您可以使用安全注释授权角色列表以访问方法或整个bean:

E.g。

@Stateless
@RolesAllowed({"user", "employee", "admin"})
public class ItemEJB {
    ...
}

有关详细信息,请参阅以下链接:

http://java.sun.com/developer/technicalArticles/J2EE/security_annotation/

答案 2 :(得分:1)

  

现在我们想要保护这些网络服务   方法只有经过身份验证   客户可以打电话给它。

我认为这与ssl无关。所以:
1)客户端登录,提供用户名和密码
2)如果用户名和密码正确(存储在数据库中),则用户被视为已登录,并且在回复中,Web服务会生成一个唯一的会话令牌(以某种方式与用户名和密码相关),并在回复。
此令牌与时间戳信息以及用户名和密码一起存储 3)每次客户端发送请求时,令牌将与其他参数一起发回。如果令牌有效,则表示请求来自经过身份验证的客户端 4)应该期望所有请求都具有包含其余参数的会话令牌 因此,未经身份验证的客户端将无法发送令牌。