Hi,
       I am trying out solr security on my setup from the following links:
http://wiki.apache.org/solr/SolrSecurity
http://www.lucidimagination.com/search/document/d1e338dc452db2e4/how_can_i_protect_the_solr_cores

Following is my configuration:

realms.properties:
admin: admin,server-administrator,content-administrator,admin
other: OBF:1xmk1w261u9r1w1c1xmq
guest: guest,read-only
rakhi: rakhi,RW-role

jetty.xml:
...
<Set name="UserRealms">
<Array type="org.mortbay.jetty.security.UserRealm">
<Item>
<New class="org.mortbay.jetty.security.HashUserRealm">
  <Set name="name">Test Realm</Set>
<Set name="config"><SystemProperty name="jetty.home"
default="."/>/etc/realm.properties</Set>
</New>
</Item>
</Array>
</Set>

...

WebDefault.xml:
<!-- block by default. -->
<security-constraint>
<web-resource-collection>
<web-resource-name>Default</web-resource-name>
<url-pattern>/</url-pattern>
</web-resource-collection>
<auth-constraint/> <!-- BLOCK! -->
</security-constraint>

<!-- Setting admin access. -->
<security-constraint>
   <web-resource-collection>
   <web-resource-name>Solr authenticated application</web-resource-name>
    <url-pattern>/admin/*</url-pattern>
    <url-pattern>/core1/admin/*</url-pattern>
   </web-resource-collection>
   <auth-constraint>
    <role-name>admin</role-name>
    <role-name>FullAccess-role</role-name>
   </auth-constraint>
</security-constraint>

<!-- this constraint has no auth constraint or data constraint => allows
without auth. -->
<security-constraint>
<web-resource-collection>
<web-resource-name>AllowedQueries</web-resource-name>
  <url-pattern>/core1/select/*</url-pattern>
</web-resource-collection>
</security-constraint>

<login-config>
<auth-method>BASIC</auth-method>
  <realm-name>Test Realm</realm-name>
</login-config>
<security-role>
<role-name>Admin-role</role-name>
</security-role>
<security-role>
<role-name>FullAccess-role</role-name>
</security-role>
<security-role>
<role-name>RW-role</role-name>
</security-role>


So Far Everything works good. I get a forbidden exception as soon as i try
to commit documents in solr.
but when i add the following security constraint tag in webdefault.xml,

<!-- this constraint allows access to modify the data in the SOLR service,
with basic auth -->
<security-constraint>
<web-resource-collection>
<web-resource-name>RW</web-resource-name>
<!-- the dataimport handler for each individual core -->
  <url-pattern>/core1/dataimport</url-pattern>
<!-- the update handler (XML over HTTP) for each individual core -->
  <url-pattern>/core1/update/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<!-- Roles of users are defined int the properties file -->
<!-- we allow users with rw-only access -->
<role-name>RW-role</role-name>
<!-- we allow users with full access -->
<role-name>FullAccess-role</role-name>
</auth-constraint>
</security-constraint>

I get the following exception:

org.apache.solr.client.solrj.SolrServerException:
org.apache.commons.httpclient.ProtocolException: Unbuffered entity enclosing
request can not be repeated.
at
org.apache.solr.client.solrj.impl.CommonsHttpSolrServer.request(CommonsHttpSolrServer.java:469)
at
org.apache.solr.client.solrj.impl.CommonsHttpSolrServer.request(CommonsHttpSolrServer.java:243)
at
org.apache.solr.client.solrj.request.AbstractUpdateRequest.process(AbstractUpdateRequest.java:105)
at org.apache.solr.client.solrj.SolrServer.add(SolrServer.java:64)
at Authentication.AuthenticationTest.main(AuthenticationTest.java:35)
Caused by: org.apache.commons.httpclient.ProtocolException: Unbuffered
entity enclosing request can not be repeated.
at
org.apache.commons.httpclient.methods.EntityEnclosingMethod.writeRequestBody(EntityEnclosingMethod.java:487)
at
org.apache.commons.httpclient.HttpMethodBase.writeRequest(HttpMethodBase.java:2114)
at
org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:1096)
at
org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:398)
at
org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171)
at
org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)
at
org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:323)
at
org.apache.solr.client.solrj.impl.CommonsHttpSolrServer.request(CommonsHttpSolrServer.java:416)
... 4 more


My Java code is as follows:
public class AuthenticationTest {
public static void main(String[] args) {
try {
HttpClient client = new HttpClient();
AuthScope scope = new AuthScope(AuthScope.ANY_HOST,AuthScope.ANY_PORT);
client.getState().setCredentials(scope, new
UsernamePasswordCredentials("rakhi","rakhi"));
  SolrServer server = new CommonsHttpSolrServer("
http://localhost:8983/solr/core1/",client);

SolrQuery query = new SolrQuery();
query.setQuery("*:*");
QueryResponse response = server.query(query);
System.out.println(response.getStatus());

SolrInputDocument doc = new SolrInputDocument();
doc.setField("aid", "0");
doc.setField("rct", "Sample Data for authentication");
server.add(doc);
server.commit();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SolrServerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

Any Pointers?
Regards,
Raakhi Khatwani

Reply via email to