Сегодня я собираюсь взять чистую систему 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, чтобы помочь в защите от атак методом «грубой силы».