tomcat waffle-filter with auth-constraint

Jun 1, 2011 at 6:36 PM

Hello everyone,

first of all thank you for the interesting waffle project.

I started with a clean tomcat 6 and got the waffle-filter example running with waffle-version 1.4 beta.

After that I tried to add a contraint that only authenticated users from our domain are allowed to access the site (e.g. NT-AUTORITÄT\Diese Organisation (S-1-5-15) ).
It seems that there is a small missing link in my understanding to achieve this.

In addition to the provided waffle-filter sample I added the security lines to the web.xml of the waffle-filter-application. The web.xml now looks like this:

<?xml version="1.0" encoding="ISO-8859-1"?>

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   version="2.5">

  <security-role>
    <role-name>S-1-5-15</role-name>
  </security-role>

  <security-constraint>
    <display-name>Waffle Security Constraint</display-name>
    <web-resource-collection>
      <web-resource-name>Protected Area</web-resource-name>
      <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
      <role-name>S-1-5-15</role-name>
    </auth-constraint>
  </security-constraint>

  <filter>
    <filter-name>WaffleSecurityFilter</filter-name>
    <filter-class>waffle.servlet.NegotiateSecurityFilter</filter-class>   
    <init-param>
    	<param-name>principalFormat</param-name>
    	<param-value>fqn</param-value>
    </init-param>
    <init-param>
    	<param-name>roleFormat</param-name>
    	<param-value>both</param-value>
    </init-param>
    <init-param>
    	<param-name>allowGuestLogin</param-name>
    	<param-value>false</param-value>
    </init-param>
    <init-param>
    	<param-name>securityFilterProviders</param-name>
    	<param-value>
    		waffle.servlet.spi.NegotiateSecurityFilterProvider
    		waffle.servlet.spi.BasicSecurityFilterProvider
    	</param-value>
    </init-param>
    <init-param>
    	<param-name>waffle.servlet.spi.NegotiateSecurityFilterProvider/protocols</param-name>
    	<param-value>
    		Negotiate
    		NTLM
    	</param-value>
    </init-param>
    <init-param>    
    	<param-name>waffle.servlet.spi.BasicSecurityFilterProvider/realm</param-name>
    	<param-value>WaffleFilterDemo</param-value>
    </init-param>
  </filter>
  <filter-mapping>
    <filter-name>WaffleSecurityFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>    
  
</web-app>

When I again call the site via IE 9 or Firefox 4 which are both configured as described at the troubleshooting site I get following message:

HTTP Status 403 - Access to the requested resource has been denied

So I downloaded the ieIPHeaders Tool which prodices following output when I try to access the secured waffle-filter site:

GET /waffle-filter/ HTTP/1.1
Accept: text/html, application/xhtml+xml, */*
Accept-Language: de-DE
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
Accept-Encoding: gzip, deflate
Host: localhost:8080
Connection: Keep-Alive

HTTP/1.1 403 Forbidden
Server: Apache-Coyote/1.1
Pragma: No-cache
Cache-Control: no-cache
Expires: Thu, 01 Jan 1970 01:00:00 CET
Content-Type: text/html;charset=utf-8
Content-Length: 1108
Date: Wed, 01 Jun 2011 17:29:25 GMT

 

I am stuck by now. :( Can anyone tell me what I am doing wrong?

Kind regards,

Sebastian

Jun 3, 2011 at 9:45 AM

I just found the post http://waffle.codeplex.com/discussions/219894 and it really seems that the auth-constraints do only work with the waffle-negotiate sample.

I tried the negotiate sample and here I can add auth-constraints.

I added some lines to the jsp-page which print out the list of user-roles like in the waffle-filter sample:

<!--
 Licensed to the Apache Software Foundation (ASF) under one or more
 contributor license agreements.  See the NOTICE file distributed with
 this work for additional information regarding copyright ownership.
 The ASF licenses this file to You under the Apache License, Version 2.0
 (the "License"); you may not use this file except in compliance with
 the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
-->
<%@page import="java.security.Principal" %>
<%@page import="waffle.apache.GenericWindowsPrincipal" %>
<%@page import="waffle.windows.auth.WindowsAccount" %>
<%
  if (request.getParameter("logoff") != null) {
    session.invalidate();
    response.sendRedirect("index.jsp");
    return;
  }
%>
<html>
 <head>
  <title>Protected Page for Examples</title>
 </head>
 <body bgcolor="white">
  You are logged in as remote user <b><%= request.getRemoteUser() %></b> in session <b><%= session.getId() %></b>.<br>
  <br><br>
  <%
	if (request.getUserPrincipal() != null) {
  %>
  Your user principal name is <b><%= request.getUserPrincipal().getName() %></b>.
  <br><br>
  <%
   } else {
  %>
   No user principal could be identified.
   <br><br>
  <%
  }
  %>
  <%
  String role = request.getParameter("role");
  if (role == null)
    role = "";
  if (role.length() > 0) {
    if (request.isUserInRole(role)) {
  %>
  You have been granted role <b><%= role %></b>.
  <br><br>
  <%
   } else {
  %>
  You have <i>not</i> been granted role <b><%= role %></b>.
  <br><br>
  <%
   }
  }
  %>
  To check whether your username has been granted a particular role, enter it here:
  <form method="GET" action='<%= response.encodeURL("index.jsp") %>'>
   <input type="text" name="role" value="<%= role %>">
  </form>
  <br><br> 
  You can logoff by clicking
  <a href='<%= response.encodeURL("index.jsp?logoff=true") %>'>here</a>.
  This should cause automatic re-logon with Waffle and a new session ID.
  <br><br>
  All user groups:
  <ul>
  <%
  Principal principal = request.getUserPrincipal();
  if (principal instanceof GenericWindowsPrincipal) {
	  GenericWindowsPrincipal genericWindowsPrincipal = (GenericWindowsPrincipal) principal;
	  for(WindowsAccount account : genericWindowsPrincipal.getGroups().values()) {
		  %>
		  <li><%= account.getFqn() %> (<%= account.getSidString() %>)
		  <%
	  }
  }
  %>
  </ul>
 </body>
</html>

Best regards,

Sebastian