diff --git a/pom.xml b/pom.xml
index a043c369c..d18a94df7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -45,7 +45,7 @@
maven-war-plugin
3.3.2
- src/main/webapp/web.xml
+ src/main/webapp/WEB-INF/web.xml
diff --git a/src/main/java/taxi/controller/LoginController.java b/src/main/java/taxi/controller/LoginController.java
new file mode 100644
index 000000000..8298cb45d
--- /dev/null
+++ b/src/main/java/taxi/controller/LoginController.java
@@ -0,0 +1,38 @@
+package taxi.controller;
+
+import java.io.IOException;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import taxi.exception.AuthenticationException;
+import taxi.lib.Injector;
+import taxi.model.Driver;
+import taxi.service.AuthenticationService;
+
+public class LoginController extends HttpServlet {
+ private static final Injector injector = Injector.getInstance("taxi");
+ private final AuthenticationService authenticationService = (AuthenticationService)
+ injector.getInstance(AuthenticationService.class);
+
+ @Override
+ public void doGet(HttpServletRequest req, HttpServletResponse resp)
+ throws ServletException, IOException {
+ req.getRequestDispatcher("/WEB-INF/views/login.jsp").forward(req, resp);
+ }
+
+ @Override
+ public void doPost(HttpServletRequest req, HttpServletResponse resp)
+ throws ServletException, IOException {
+ String login = req.getParameter("login");
+ String password = req.getParameter("password");
+ try {
+ Driver driver = authenticationService.login(login, password);
+ req.getSession().setAttribute("driver_id", driver.getId());
+ resp.sendRedirect(req.getContextPath() + "/index");
+ } catch (AuthenticationException e) {
+ req.setAttribute("errorMsg", "Login or password are incorrect");
+ req.getRequestDispatcher("/WEB-INF/views/login.jsp").forward(req, resp);
+ }
+ }
+}
diff --git a/src/main/java/taxi/controller/LogoutController.java b/src/main/java/taxi/controller/LogoutController.java
new file mode 100644
index 000000000..238e85f72
--- /dev/null
+++ b/src/main/java/taxi/controller/LogoutController.java
@@ -0,0 +1,16 @@
+package taxi.controller;
+
+import java.io.IOException;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+public class LogoutController extends HttpServlet {
+ @Override
+ public void doGet(HttpServletRequest req, HttpServletResponse resp)
+ throws ServletException, IOException {
+ req.getSession().invalidate();
+ resp.sendRedirect(req.getContextPath() + "/login");
+ }
+}
diff --git a/src/main/java/taxi/controller/driver/AddDriverController.java b/src/main/java/taxi/controller/driver/AddDriverController.java
index 1db67730b..e6da4dd22 100644
--- a/src/main/java/taxi/controller/driver/AddDriverController.java
+++ b/src/main/java/taxi/controller/driver/AddDriverController.java
@@ -24,7 +24,9 @@ public void doGet(HttpServletRequest req, HttpServletResponse resp)
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
String name = req.getParameter("name");
String licenseNumber = req.getParameter("license_number");
- Driver driver = new Driver(name, licenseNumber);
+ String login = req.getParameter("login");
+ String password = req.getParameter("password");
+ Driver driver = new Driver(name, licenseNumber, login, password);
driverService.create(driver);
resp.sendRedirect(req.getContextPath() + "/drivers/add");
}
diff --git a/src/main/java/taxi/controller/driver/GetMyCurrentCarsController.java b/src/main/java/taxi/controller/driver/GetMyCurrentCarsController.java
new file mode 100644
index 000000000..280e4e0d8
--- /dev/null
+++ b/src/main/java/taxi/controller/driver/GetMyCurrentCarsController.java
@@ -0,0 +1,25 @@
+package taxi.controller.driver;
+
+import java.io.IOException;
+import java.util.List;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import taxi.lib.Injector;
+import taxi.model.Car;
+import taxi.service.CarService;
+
+public class GetMyCurrentCarsController extends HttpServlet {
+ private static final Injector injector = Injector.getInstance("taxi");
+ private final CarService carService = (CarService) injector.getInstance(CarService.class);
+
+ @Override
+ public void doGet(HttpServletRequest req, HttpServletResponse resp)
+ throws ServletException, IOException {
+ List cars = carService.getAllByDriver((Long) req.getSession()
+ .getAttribute("driver_id"));
+ req.setAttribute("cars", cars);
+ req.getRequestDispatcher("/WEB-INF/views/cars/all.jsp").forward(req, resp);
+ }
+}
diff --git a/src/main/java/taxi/controller/filter/AuthenticationFilter.java b/src/main/java/taxi/controller/filter/AuthenticationFilter.java
new file mode 100644
index 000000000..be00f2909
--- /dev/null
+++ b/src/main/java/taxi/controller/filter/AuthenticationFilter.java
@@ -0,0 +1,40 @@
+package taxi.controller.filter;
+
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.Set;
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+public class AuthenticationFilter implements Filter {
+ private static Set allowedUrls;
+
+ @Override
+ public void init(FilterConfig filterConfig) throws ServletException {
+ allowedUrls = new HashSet<>();
+ allowedUrls.add("/login");
+ allowedUrls.add("/drivers/add");
+ }
+
+ @Override
+ public void doFilter(ServletRequest servletRequest,
+ ServletResponse servletResponse, FilterChain filterChain)
+ throws IOException, ServletException {
+ HttpServletRequest req = (HttpServletRequest) servletRequest;
+ HttpServletResponse resp = (HttpServletResponse) servletResponse;
+ HttpSession httpSession = req.getSession();
+ Long driverId = (Long) httpSession.getAttribute("driver_id");
+ if (driverId != null || allowedUrls.contains(req.getServletPath())) {
+ filterChain.doFilter(req, resp);
+ return;
+ }
+ resp.sendRedirect(req.getContextPath() + "/login");
+ }
+}
diff --git a/src/main/java/taxi/dao/CarDaoImpl.java b/src/main/java/taxi/dao/CarDaoImpl.java
index 586ccb595..aface2ddd 100644
--- a/src/main/java/taxi/dao/CarDaoImpl.java
+++ b/src/main/java/taxi/dao/CarDaoImpl.java
@@ -188,7 +188,7 @@ private void deleteAllDrivers(Car car) {
}
private List getAllDriversByCarId(Long carId) {
- String query = "SELECT id, name, license_number "
+ String query = "SELECT id, name, license_number, login, password "
+ "FROM cars_drivers cd "
+ "JOIN drivers d ON cd.driver_id = d.id "
+ "WHERE car_id = ? AND is_deleted = false";
@@ -211,10 +211,14 @@ private Driver parseDriverFromResultSet(ResultSet resultSet) throws SQLException
Long driverId = resultSet.getObject("id", Long.class);
String name = resultSet.getString("name");
String licenseNumber = resultSet.getString("license_number");
+ String login = resultSet.getString("login");
+ String password = resultSet.getString("password");
Driver driver = new Driver();
driver.setId(driverId);
driver.setName(name);
driver.setLicenseNumber(licenseNumber);
+ driver.setLogin(login);
+ driver.setPassword(password);
return driver;
}
diff --git a/src/main/java/taxi/dao/DriverDao.java b/src/main/java/taxi/dao/DriverDao.java
index 83440d530..e9c38d2a5 100644
--- a/src/main/java/taxi/dao/DriverDao.java
+++ b/src/main/java/taxi/dao/DriverDao.java
@@ -1,6 +1,8 @@
package taxi.dao;
+import java.util.Optional;
import taxi.model.Driver;
public interface DriverDao extends GenericDao {
+ Optional findByLogin(String login);
}
diff --git a/src/main/java/taxi/dao/DriverDaoImpl.java b/src/main/java/taxi/dao/DriverDaoImpl.java
index f5e18f2a2..2fe2ffaf7 100644
--- a/src/main/java/taxi/dao/DriverDaoImpl.java
+++ b/src/main/java/taxi/dao/DriverDaoImpl.java
@@ -17,13 +17,15 @@
public class DriverDaoImpl implements DriverDao {
@Override
public Driver create(Driver driver) {
- String query = "INSERT INTO drivers (name, license_number) "
- + "VALUES (?, ?)";
+ String query = "INSERT INTO drivers (name, license_number, login, password) "
+ + "VALUES (?, ?, ?, ?)";
try (Connection connection = ConnectionUtil.getConnection();
PreparedStatement statement = connection.prepareStatement(query,
Statement.RETURN_GENERATED_KEYS)) {
statement.setString(1, driver.getName());
statement.setString(2, driver.getLicenseNumber());
+ statement.setString(3, driver.getLogin());
+ statement.setString(4, driver.getPassword());
statement.executeUpdate();
ResultSet resultSet = statement.getGeneratedKeys();
if (resultSet.next()) {
@@ -71,14 +73,16 @@ public List getAll() {
@Override
public Driver update(Driver driver) {
String query = "UPDATE drivers "
- + "SET name = ?, license_number = ? "
+ + "SET name = ?, license_number = ?, login = ?, password = ? "
+ "WHERE id = ? AND is_deleted = FALSE";
try (Connection connection = ConnectionUtil.getConnection();
PreparedStatement statement
= connection.prepareStatement(query)) {
statement.setString(1, driver.getName());
statement.setString(2, driver.getLicenseNumber());
- statement.setLong(3, driver.getId());
+ statement.setString(3, driver.getLogin());
+ statement.setString(4, driver.getPassword());
+ statement.setLong(5, driver.getId());
statement.executeUpdate();
return driver;
} catch (SQLException e) {
@@ -102,10 +106,31 @@ private Driver parseDriverFromResultSet(ResultSet resultSet) throws SQLException
Long id = resultSet.getObject("id", Long.class);
String name = resultSet.getString("name");
String licenseNumber = resultSet.getString("license_number");
+ String login = resultSet.getString("login");
+ String password = resultSet.getString("password");
Driver driver = new Driver();
driver.setId(id);
driver.setName(name);
driver.setLicenseNumber(licenseNumber);
+ driver.setLogin(login);
+ driver.setPassword(password);
return driver;
}
+
+ @Override
+ public Optional findByLogin(String login) {
+ String query = "SELECT * FROM drivers WHERE login = ? AND is_deleted = FALSE";
+ try (Connection connection = ConnectionUtil.getConnection();
+ PreparedStatement statement = connection.prepareStatement(query)) {
+ statement.setString(1, login);
+ ResultSet resultSet = statement.executeQuery();
+ Driver driver = null;
+ if (resultSet.next()) {
+ driver = parseDriverFromResultSet(resultSet);
+ }
+ return Optional.ofNullable(driver);
+ } catch (SQLException e) {
+ throw new DataProcessingException("Can't get driver by login " + login, e);
+ }
+ }
}
diff --git a/src/main/java/taxi/exception/AuthenticationException.java b/src/main/java/taxi/exception/AuthenticationException.java
new file mode 100644
index 000000000..393b46c1b
--- /dev/null
+++ b/src/main/java/taxi/exception/AuthenticationException.java
@@ -0,0 +1,8 @@
+package taxi.exception;
+
+public class AuthenticationException extends Exception {
+
+ public AuthenticationException(String message) {
+ super(message);
+ }
+}
diff --git a/src/main/java/taxi/model/Driver.java b/src/main/java/taxi/model/Driver.java
index 9c375f94c..fa54edf70 100644
--- a/src/main/java/taxi/model/Driver.java
+++ b/src/main/java/taxi/model/Driver.java
@@ -6,6 +6,8 @@ public class Driver {
private Long id;
private String name;
private String licenseNumber;
+ private String login;
+ private String password;
public Driver() {
}
@@ -15,6 +17,12 @@ public Driver(String name, String licenseNumber) {
this.licenseNumber = licenseNumber;
}
+ public Driver(String name, String licenseNumber, String login, String password) {
+ this(name, licenseNumber);
+ this.login = login;
+ this.password = password;
+ }
+
public Long getId() {
return id;
}
@@ -39,6 +47,22 @@ public void setLicenseNumber(String licenseNumber) {
this.licenseNumber = licenseNumber;
}
+ public String getLogin() {
+ return login;
+ }
+
+ public void setLogin(String login) {
+ this.login = login;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
@Override
public boolean equals(Object o) {
if (this == o) {
@@ -50,11 +74,13 @@ public boolean equals(Object o) {
Driver driver = (Driver) o;
return Objects.equals(id, driver.id)
&& Objects.equals(name, driver.name)
- && Objects.equals(licenseNumber, driver.licenseNumber);
+ && Objects.equals(licenseNumber, driver.licenseNumber)
+ && Objects.equals(login, driver.login)
+ && Objects.equals(password, driver.password);
}
@Override
public int hashCode() {
- return Objects.hash(id, name, licenseNumber);
+ return Objects.hash(id, name, licenseNumber, login, password);
}
}
diff --git a/src/main/java/taxi/service/AuthenticationService.java b/src/main/java/taxi/service/AuthenticationService.java
new file mode 100644
index 000000000..e9ffa0eea
--- /dev/null
+++ b/src/main/java/taxi/service/AuthenticationService.java
@@ -0,0 +1,8 @@
+package taxi.service;
+
+import taxi.exception.AuthenticationException;
+import taxi.model.Driver;
+
+public interface AuthenticationService {
+ Driver login(String login, String password) throws AuthenticationException;
+}
diff --git a/src/main/java/taxi/service/AuthenticationServiceImpl.java b/src/main/java/taxi/service/AuthenticationServiceImpl.java
new file mode 100644
index 000000000..6453dd158
--- /dev/null
+++ b/src/main/java/taxi/service/AuthenticationServiceImpl.java
@@ -0,0 +1,24 @@
+package taxi.service;
+
+import java.util.Optional;
+import taxi.exception.AuthenticationException;
+import taxi.lib.Inject;
+import taxi.lib.Service;
+import taxi.model.Driver;
+
+@Service
+public class AuthenticationServiceImpl implements AuthenticationService {
+ @Inject
+ private DriverService driverService;
+
+ @Override
+ public Driver login(String login, String password) throws AuthenticationException {
+ Optional optionalDriver = driverService.findByLogin(login);
+ if (!optionalDriver.orElseThrow(() ->
+ new AuthenticationException("Login or password are incorrect"))
+ .getPassword().equals(password)) {
+ throw new AuthenticationException("Login or password are incorrect");
+ }
+ return optionalDriver.get();
+ }
+}
diff --git a/src/main/java/taxi/service/DriverService.java b/src/main/java/taxi/service/DriverService.java
index faddf81b3..3dbdfe2f3 100644
--- a/src/main/java/taxi/service/DriverService.java
+++ b/src/main/java/taxi/service/DriverService.java
@@ -1,6 +1,8 @@
package taxi.service;
+import java.util.Optional;
import taxi.model.Driver;
public interface DriverService extends GenericService {
+ Optional findByLogin(String login);
}
diff --git a/src/main/java/taxi/service/DriverServiceImpl.java b/src/main/java/taxi/service/DriverServiceImpl.java
index e2f554b3f..cf14b8e39 100644
--- a/src/main/java/taxi/service/DriverServiceImpl.java
+++ b/src/main/java/taxi/service/DriverServiceImpl.java
@@ -2,6 +2,7 @@
import java.util.List;
import java.util.NoSuchElementException;
+import java.util.Optional;
import taxi.dao.DriverDao;
import taxi.lib.Inject;
import taxi.lib.Service;
@@ -38,4 +39,9 @@ public Driver update(Driver driver) {
public boolean delete(Long id) {
return driverDao.delete(id);
}
+
+ @Override
+ public Optional findByLogin(String login) {
+ return driverDao.findByLogin(login);
+ }
}
diff --git a/src/main/java/taxi/util/ConnectionUtil.java b/src/main/java/taxi/util/ConnectionUtil.java
index 9a94e69a2..14134b890 100644
--- a/src/main/java/taxi/util/ConnectionUtil.java
+++ b/src/main/java/taxi/util/ConnectionUtil.java
@@ -6,10 +6,10 @@
import java.util.Properties;
public class ConnectionUtil {
- private static final String URL = "YOUR DATABASE URL";
- private static final String USERNAME = "YOUR USERNAME";
- private static final String PASSWORD = "YOUR PASSWORD";
- private static final String JDBC_DRIVER = "YOUR DRIVER";
+ private static final String URL = "jdbc:mysql://localhost:3306/taxi";
+ private static final String USERNAME = "root";
+ private static final String PASSWORD = "Lhdv23Z7Na61";
+ private static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";
static {
try {
diff --git a/src/main/resources/init_db.sql b/src/main/resources/init_db.sql
index 2acabb883..8cd95e4a2 100644
--- a/src/main/resources/init_db.sql
+++ b/src/main/resources/init_db.sql
@@ -11,6 +11,8 @@ CREATE TABLE `drivers` (
`id` BIGINT(0) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`license_number` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
+ `login` VARCHAR(255) NOT NULL,
+ `password` VARCHAR(255) NOT NULL,
`is_deleted` BIT(1) NOT NULL DEFAULT b'0',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
diff --git a/src/main/webapp/WEB-INF/views/cars/add.jsp b/src/main/webapp/WEB-INF/views/cars/add.jsp
index c23ba0b4f..b652732ea 100644
--- a/src/main/webapp/WEB-INF/views/cars/add.jsp
+++ b/src/main/webapp/WEB-INF/views/cars/add.jsp
@@ -28,5 +28,6 @@
+<%@include file="/WEB-INF/views/logout.jsp" %>