Статьи

Настройка базовой аутентификации Apache Tomcat с использованием DataSourceRealm в CentOS 6 с MySQL

Сегодня я собираюсь взять чистую систему CentOS 6.0 и собрать ее, чтобы она работала с Apache Tomcat 6 с базовой аутентификацией с использованием DataSourceRealm . Вы можете прочитать больше о конфигурации области на веб-сайте Apache Tomcat .

В командной строке CentOS 6 введите следующие команды для установки Java OpenJDK (вы можете использовать Oracle JDK, если хотите), Tomcat 6 (вы можете использовать более новый Tomcat 7, если хотите) и MySQL.

$ sudo yum install java-1.6.0-openjdk
$ sudo yum install tomcat6
$ sudo yum install mysql-server
$ service mysqld start

Давайте немного защитим MySQL. Запустите следующую команду:

$ sudo /usr/bin/mysql_secure_installation

Измените пароль root, затем ответьте «да» на все остальное.

Сконфигурируйте MySQL для запуска после перезагрузки, выполнив это:

$ sudo chkconfig mysqld on

Мы создадим две таблицы, необходимые для DataSourceRealm Tomcat в соответствии со структурой, которую они показывают в своей документации . Не стесняйтесь нормализовать этот скрипт, если хотите, хорошее начало — схема, определенная на этом сайте (она также должна работать, но я ее не проверял).

DROP DATABASE IF EXISTS tomcat_realm;
CREATE DATABASE tomcat_realm;
USE tomcat_realm;
CREATE TABLE tomcat_users (
        user_name varchar(20) NOT NULL PRIMARY KEY,
        password varchar(250) NOT NULL
);
CREATE TABLE tomcat_roles (
        user_name varchar(20) NOT NULL,
        role_name varchar(20) NOT NULL,
        PRIMARY KEY (user_name, role_name)
);
INSERT INTO tomcat_users (user_name, password) VALUES ('someuser', '5f4dcc3b5aa765d61d8327deb882cf99');
INSERT INTO tomcat_roles (user_name, role_name) VALUES ('someuser', 'authenticated');
COMMIT;

Сохраните этот сценарий SQL в папке « Документы » как: madeb.sql .

Зайдите в MySQL и создайте базу данных, а также пользователя, который имеет реальный доступ к новым таблицам:

$ mysql -u root -p
mysql> SOURCE ~/Documents/createdb.sql
mysql> use tomcat_realm;
mysql> show tables;
mysql> CREATE USER 'realm_access'@'localhost' IDENTIFIED BY 'password';
mysql> GRANT SELECT ON tomcat_realm.* TO realm_access@localhost;

Примечание. Я уже преобразовал строковый пароль в эквивалент MD5.

Следующим шагом является получение драйвера JDBC MySQL от: http://dev.mysql.com/downloads/connector/j/

Если предположить , что в вашей домашней директории Документы папке:

$ cd .. && cd Downloads
$ wget http://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.1.17.zip/from/http://mysql.mirrors.hoobly.com/

Извлеките файл:

$ unzip mysql-connector-java-5.1.17.zip

Нам понадобится файл jar чуть позже. Сначала давайте настроим конфигурацию Tomcat.

$ cd /usr/share/tomcat6/conf
$ sudo nano server.xml

Добавьте в DataSourceRealm согласно: http://tomcat.apache.org/tomcat-6.0-doc/realm-howto.html#DataSourceRealm

Прокомментируйте следующее:

<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
             resourceName="UserDatabase"/>

Добавьте следующее (также я показал закомментированную часть):

<!--
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
             resourceName="UserDatabase"/>
-->
<Realm className="org.apache.catalina.realm.DataSourceRealm"
   dataSourceName="jdbc/auth"
   digest="MD5"
   userTable="tomcat_users" userNameCol="user_name" userCredCol="password"
   userRoleTable="tomcat_roles" roleNameCol="role_name"/>

Сохраните и выйдите из файла.

Примечание: для дайджеста вы можете использовать: SHA, MD2 или MD5

Переместите файл JAR MySQL JDBC в папку lib Tomcat :

$ cd .. && cd lib
sudo mv ~/Downloads/mysql-connector-java-5.1.17/mysql-connector-java-5.1.17-bin.jar mysql-connector-java-5.1.17-bin.jar

Теперь нам нужно создать источник данных JNDI: http://tomcat.apache.org/tomcat-6.0-doc/jndi-datasource-examples-howto.html

$ cd .. && cd conf
$ sudo nano context.xml

Между элементами контекста добавьте это:

<Resource name="jdbc/auth" auth="Container" type="javax.sql.DataSource"
               maxActive="100" maxIdle="30" maxWait="10000"
               username="realm_access" password="password" driverClassName="com.mysql.jdbc.Driver"
               url="jdbc:mysql://localhost:3306/tomcat_realm"/>

Сохраните и выйдите из файла.

Примечание: Вы также можете поместить это в файл server.xml, если вы хотите, чтобы глобальная видимость веб-приложения.

Создайте новый Java-проект Maven (WAR) в Netbeans 7. Вам не нужно ничего делать, кроме как отредактировать файл web.xml, как показано ниже (отредактируйте, как того требуют ваши собственные настройки проекта):

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 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_3_0.xsd">
    <servlet>
        <servlet-name>DemoServlet</servlet-name>
        <servlet-class>com.giantflyingsaucer.tomcatsecurity.DemoServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>DemoServlet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
 
    <security-constraint>
        <web-resource-collection>
            <web-resource-name>Wildcard means whole app requires authentication</web-resource-name>
            <url-pattern>/*</url-pattern>
            <http-method>GET</http-method>
            <http-method>POST</http-method>
            <http-method>DELETE</http-method>
            <http-method>PUT</http-method>
        </web-resource-collection>
        <auth-constraint>
            <role-name>authenticated</role-name>
        </auth-constraint>
    </security-constraint>  
 
    <security-role>
        <role-name>authenticated</role-name>
    </security-role>   
 
    <login-config>
        <auth-method>BASIC</auth-method>
        <realm-name>tomcat_realm</realm-name>
    </login-config>
</web-app>

Я удалил страницу JSP по умолчанию, которую генерирует Maven, и заменил ее сервлетом, например так:

package com.giantflyingsaucer.tomcatsecurity;
 
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class DemoServlet extends HttpServlet {
 
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Servlet DemoServlet</title>");
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>Servlet DemoServlet</h1>");
            out.println("</body>");
            out.println("</html>");
        } finally {
            out.close();
        }
    }
 
    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }
 
    /**
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }
 
    /**
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
}

Очистите и соберите новый проект, возьмите полученный военный файл и переименуйте его в: ROOT.war

Возьмите файл ROOT.war и переместите его в это место:

/ USR / доли / Tomcat6 / WebApps

Запустите Tomcat 6:


$ sudo service tomcat6 start

Перейдите по адресу : http: // localhost: 8080

Имя пользователя: someuser
Пароль: пароль

Результат:

Вы можете настроить это изрядное количество, это только основы, но может служить отправной точкой.

И последнее замечание: если вы не используете SSL, имя пользователя и пароль в этом методе будут отправлены в виде открытого текста. Вам также следует обратить внимание на реализацию LockOutRealm, чтобы помочь в защите от атак методом «грубой силы».

 

 

С http://www.giantflyingsaucer.com/blog/?p=3174