~~
~~ 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.
~~

Authentication and Authorization guide

  LensServer uses authentication model from Hive service.
  The same configuration parameters available in hive can be set for lens server.
  Hive auth documentation is available at:
  {{{https://cwiki.apache.org/confluence/display/Hive/Setting+Up+HiveServer2} Hive Doc}} and 
  {{{http://www.cloudera.com/content/cloudera-content/cloudera-docs/CDH4/4.3.0/CDH4-Security-Guide/cdh4sg_topic_9_1.html} Cloudera doc}}
  
  For enabling LDAP authentication on lens server, admin should set following params in lens-site.xml

*--+--+
|hive.server2.authentication|LDAP|
*--+--+---+--+
|hive.server2.authentication.ldap.url|ldap://host:port/|
*--+--+---+--+
|hive.server2.authentication.ldap.security.protocol|ssl|
*--+--+


