Tomcat 7 - 保护webapps文件夹下的文件夹

时间:2013-08-09 07:56:38

标签: security authentication tomcat

我的网络应用程序是'myweb',在此网络应用程序中,我的代码在'files'文件夹下引用'123.pdf',如http:// localhost:8080 / files / 123.pdf

   webapps  
   |  
   |--myweb  
   |  
   |--files  
       |  
       |--123.pdf  

当我尝试通过在浏览器地址中粘贴(http:// localhost:8080 / files / 123.pdf)直接访问时,我希望资源(123.pdf)仅适用于已登录的用户吧,没有登录门户网站,我可以访问该文件。

基本上我想保护'webapps'下的'files'文件夹,这样只有门户网站中经过身份验证的用户才能访问'files'文件夹下的资源。我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:4)

我找到了解决这个问题的方法。这就是我想出来的,

1)将'files'文件夹转换为Web应用程序,并使用tomcat保护文件(例如pdf) 基于表单的身份验证

2)在对'myweb'进行身份验证后 - 这里的身份验证不是基于tomcat容器的,它基于 春天&休眠 -

从'/myweb/customerhomepage.jsp'异步调用'files'web app中的servlet(PopulateServlet.java)并设置tomcat role username& pwd在'文件'网络应用程序会话

每当在'files'web app下有一个受保护的pdf请求时,将调用login.jsp - 在这个jsp中填充隐藏的j_username& j_password字段           来自已由PopulateServlet填充的会话对象。使用jquery ajax,html表单将提交给tomcat           用于资源认证。

'文件'网络应用更改

创建新角色和用户名和密码
    /conf/tomcat-users.xml

    <role rolename="tomcat"/>
    <user username="tomcat" password="tomcat" roles="tomcat"/>

创建WEB-INF / web.xml

    <servlet>
    <servlet-name>Populate</servlet-name>
    <servlet-class>PopulateServlet</servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>Populate</servlet-name>
    <url-pattern>/Populate</url-pattern>
    </servlet-mapping>

    <servlet>
    <servlet-name>Logout</servlet-name>
    <servlet-class>LogOutServlet</servlet-class> <!-- in this servlet, call session.invalidate() -->
    </servlet>
    <servlet-mapping>
    <servlet-name>Logout</servlet-name>
    <url-pattern>/Logout</url-pattern>
    </servlet-mapping>

<security-constraint>
  <display-name>Security Constraint</display-name>
  <web-resource-collection>
     <web-resource-name>Protected Area</web-resource-name>
     <url-pattern>/jsp/security/protected/*</url-pattern>
     <url-pattern>*.pdf</url-pattern>

     <http-method>DELETE</http-method>
     <http-method>GET</http-method>
     <http-method>POST</http-method>
     <http-method>PUT</http-method>
  </web-resource-collection>
  <auth-constraint>
     <role-name>tomcat</role-name>
  </auth-constraint>
</security-constraint>

<login-config>
  <auth-method>FORM</auth-method>
  <realm-name>Form-Based Authentication Area</realm-name>
  <form-login-config>
    <form-login-page>/jsp/security/protected/login.jsp</form-login-page>
    <form-error-page>/jsp/security/protected/error.jsp</form-error-page>
  </form-login-config>
</login-config>

<!-- Security roles referenced by this web application -->
<security-role>
  <role-name>tomcat</role-name>
</security-role>

在/ files / jsp / security / protected /

下创建login.jsp和error.jsp

的login.jsp

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
    $("#secure").submit();
});
</script>
...
<form method="POST" action='<%= response.encodeURL("j_security_check") %>' name="secure" id="secure">
<input type="hidden" name="j_username" value='<%=session.getAttribute("j_username")%>' />
<input type="hidden" name="j_password" value='<%=session.getAttribute("j_password")%>' />
</form>
...

PopulateServlet.java

HttpSession session = request.getSession(true);
session.setAttribute("j_username","tomcat");
session.setAttribute("j_password","tomcat");

'myweb'网络应用更改:     customerhomepage.jsp

$.get('/files/Populate?ts='+new Date().getMilliseconds());

答案 1 :(得分:0)

只需在spring web config中添加其他配置:

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry
            .addResourceHandler("reports/**")
            .addResourceLocations(reportsRootPath);
}

reportsRootPath在属性文件中定义,可以是任何文件系统位置。

可以访问文件;报告/ myReport.pdf

以下是引导我的documentation