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