2011-02-01 44 views
2

我有一个带EJB模块和Web应用程序模块(servlet)的企业应用程序。我使用URLConnection从EJB访问servlet URL,但希望以一定的安全性保护URL。我不想使用用户名和密码进行身份验证,因为我无法使用任何单一登录解决方案,所以我想如果有一种方法可以限制只能从其企业应用程序访问的URL。请帮忙。在不使用用户名密码认证的情况下保护servlet URL

+0

我试过将常见的类重构成另一个jar,但似乎有太多的其他类的依赖关系,所以它仍然失败,我仍在调查。但是建议将整个jar文件从WEB-INF/lib移动到APP-INF/lib,以便这些类可以被EJB和webapp模块访问?是否会有任何类加载器相关的问题或容器初始化servlet的任何问题? – krish 2011-03-01 04:36:36

+0

请让我知道如果我在上面的评论中的问题应该作为一个单独的问题? – krish 2011-03-01 04:38:08

回答

1

如果它们运行在同一台计算机上,通常的做法是将servlet正在执行的业务作业重构为另一个Java类,然后可以由EJB和Servlet导入/使用该类。

+0

在这种情况下重构代码可能是一个好习惯,但在我的情况下,作业servlet正在执行的操作必须在servlet的上下文中执行。 – krish 2011-02-01 12:28:49

+0

你到底需要什么servlet上下文? – BalusC 2011-02-01 12:29:50

1

可以用来部署你的servlet的应用程序,并使用该用户保护应用程序的应用程序服务器中创建用户凭据(例如使用基本身份验证):

<security-constraint> 
    <web-resource-collection> 
    <web-resource-name> 
     Entire Application 
    </web-resource-name> 
    <url-pattern>/*</url-pattern> 
    </web-resource-collection> 
    <auth-constraint> 
     <role-name>member</role-name> 
    </auth-constraint> 
</security-constraint> 

然后,您可以使用您的EJB认证。

3

有很多的信息,你忽略了:

  • 只有通过你的EJB模块使用的小服务程序,或者它也可用于其他客户端?
  • Servlet和EJB模块是否在同一个容器中运行?同一台物理机器?
  • 您使用的是什么web服务器/ servlet容器/ J2EE容器?

如果servlet仅由EJB模块,它们都在同一台机器上,那么你可以配置你的Web容器只能从localhost接受连接,改变你的EJB模块使用指向的URL在localhost而不是一个公共域名或IP地址。

如果它们位于不同的机器上,或者您的servlet被其他客户端使用,那么您将需要以某种方式验证EJB模块。您可以使用SSL客户端证书(请参阅this question)或配置您的servlet容器以允许来自EJB模块IP地址的连接。

EDIT

使用Servlet过滤器来控制访问是相当简单的。在你的情况下,你想验证请求来自本地主机。如果没有,请将未经授权的消息发送回客户端。

这是应该做的是一个非常简单的doFilter方法实现:

public void doFilter(ServletRequest request, 
        ServletResponse response, 
        FilterChain chain) 
    throws ServletException, IOException 
{ 
    if (!request.getRemoteAddr().equals("127.0.0.1")) { 
     HttpServletResponse rsp = (HttpServletResponse) response; 
     rsp.sendError(HttpServletResponse.SC_FORBIDDEN, "You are not authorized to access this resource."); 
    } 

    chain.doFilter(request, response); 
} 

的东西过滤器添加到您的web.xml类似如下:

<filter> 
    <filter-name>AuthorizationFilter</filter-name> 
    <filter-class>com.foo.bar.AuthorizationFilter</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>AuthorizationFilter</filter-name> 
    <servlet-name>RestrictedServlet</servlet-name> 
</filter-mapping> 

过滤器是顺序执行的,他们出现在web.xml中,因此请确保授权过滤器是第一个列出的。

说了这么多,我在这里和BalusC一致。如果可能的话,您应该重构代码,以便EJB模块直接执行代码而不是进行servlet调用。

相关问题