diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 282f50ac5..ead0ef36a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,10 +8,10 @@ jobs: steps: - uses: actions/checkout@v2 - - name: Set up JDK 17 + - name: Set up JDK 11 uses: actions/setup-java@v2 with: - java-version: '17' + java-version: '11' distribution: 'adopt' cache: maven - name: Build with Maven diff --git a/src/main/java/taxi/controller/LoginController.java b/src/main/java/taxi/controller/LoginController.java new file mode 100644 index 000000000..11c38743a --- /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 + protected void doGet(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + req.getRequestDispatcher("/WEB-INF/views/login.jsp").forward(req, resp); + } + + @Override + protected 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("/index"); + } catch (AuthenticationException e) { + req.setAttribute("errorMessage", e.getMessage()); + 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..c06c6023a --- /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 + protected void doGet(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + req.getSession().invalidate(); + req.getRequestDispatcher("/WEB-INF/views/login.jsp").forward(req, resp); + } +} diff --git a/src/main/java/taxi/controller/car/GetAllCarsController.java b/src/main/java/taxi/controller/car/GetAllCarsController.java index df01c7083..9831d755d 100644 --- a/src/main/java/taxi/controller/car/GetAllCarsController.java +++ b/src/main/java/taxi/controller/car/GetAllCarsController.java @@ -17,8 +17,8 @@ public class GetAllCarsController extends HttpServlet { @Override public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - List cars = carService.getAll(); - req.setAttribute("cars", cars); + List allCars = carService.getAll(); + req.setAttribute("cars", allCars); req.getRequestDispatcher("/WEB-INF/views/cars/all.jsp").forward(req, resp); } } diff --git a/src/main/java/taxi/controller/car/GetMyCurrentCarsController.java b/src/main/java/taxi/controller/car/GetMyCurrentCarsController.java new file mode 100644 index 000000000..67deae1b7 --- /dev/null +++ b/src/main/java/taxi/controller/car/GetMyCurrentCarsController.java @@ -0,0 +1,22 @@ +package taxi.controller.car; + +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.lib.Injector; +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 + protected void doGet(HttpServletRequest req, HttpServletResponse resp) + throws ServletException, IOException { + Long driverId = (Long) req.getSession().getAttribute("driver_id"); + req.setAttribute("cars", carService.getAllByDriver(driverId)); + req.getRequestDispatcher("/WEB-INF/views/cars/all.jsp").forward(req, resp); + } +} 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/GetAllDriversController.java b/src/main/java/taxi/controller/driver/GetAllDriversController.java index b847b17f2..fe4819850 100644 --- a/src/main/java/taxi/controller/driver/GetAllDriversController.java +++ b/src/main/java/taxi/controller/driver/GetAllDriversController.java @@ -18,8 +18,8 @@ public class GetAllDriversController extends HttpServlet { @Override public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - List drivers = driverService.getAll(); - req.setAttribute("drivers", drivers); + List allDrivers = driverService.getAll(); + req.setAttribute("drivers", allDrivers); req.getRequestDispatcher("/WEB-INF/views/drivers/all.jsp").forward(req, resp); } } diff --git a/src/main/java/taxi/controller/manufacturer/GetAllManufacturersController.java b/src/main/java/taxi/controller/manufacturer/GetAllManufacturersController.java index 68b727e41..9cb925df3 100644 --- a/src/main/java/taxi/controller/manufacturer/GetAllManufacturersController.java +++ b/src/main/java/taxi/controller/manufacturer/GetAllManufacturersController.java @@ -18,8 +18,8 @@ public class GetAllManufacturersController extends HttpServlet { @Override public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - List manufacturers = manufacturerService.getAll(); - req.setAttribute("manufacturers", manufacturers); + List allManufacturers = manufacturerService.getAll(); + req.setAttribute("manufacturers", allManufacturers); req.getRequestDispatcher("/WEB-INF/views/manufacturers/all.jsp").forward(req, resp); } } diff --git a/src/main/java/taxi/dao/CarDaoImpl.java b/src/main/java/taxi/dao/CarDaoImpl.java index 586ccb595..29ac0a3a0 100644 --- a/src/main/java/taxi/dao/CarDaoImpl.java +++ b/src/main/java/taxi/dao/CarDaoImpl.java @@ -106,7 +106,7 @@ public Car update(Car car) { } catch (SQLException e) { throw new DataProcessingException("Can't update car " + car, e); } - deleteAllDrivers(car); + deleteAllDriversExceptList(car); insertAllDrivers(car); return car; } @@ -148,14 +148,14 @@ public List getAllByDriver(Long driverId) { cars.add(parseCarFromResultSet(resultSet)); } } catch (SQLException e) { - throw new DataProcessingException("Can't get all cars for driver with id: " - + driverId, e); + throw new DataProcessingException("Can't get all cars", e); } cars.forEach(car -> car.setDrivers(getAllDriversByCarId(car.getId()))); return cars; } private void insertAllDrivers(Car car) { + Long carId = car.getId(); List drivers = car.getDrivers(); if (drivers.size() == 0) { return; @@ -164,7 +164,7 @@ private void insertAllDrivers(Car car) { try (Connection connection = ConnectionUtil.getConnection(); PreparedStatement statement = connection.prepareStatement(query)) { - statement.setLong(1, car.getId()); + statement.setLong(1, carId); for (Driver driver : drivers) { statement.setLong(2, driver.getId()); statement.executeUpdate(); @@ -174,21 +174,21 @@ private void insertAllDrivers(Car car) { } } - private void deleteAllDrivers(Car car) { + private void deleteAllDriversExceptList(Car car) { + Long carId = car.getId(); String query = "DELETE FROM cars_drivers WHERE car_id = ?"; try (Connection connection = ConnectionUtil.getConnection(); PreparedStatement statement = connection.prepareStatement(query)) { - statement.setLong(1, car.getId()); + statement.setLong(1, carId); statement.executeUpdate(); } catch (SQLException e) { - throw new DataProcessingException("Can't delete drivers " + car.getDrivers() - + " of car with id: " + car.getId(), e); + throw new DataProcessingException("Can't delete drivers " + car.getDrivers(), e); } } 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"; @@ -209,25 +209,29 @@ private List getAllDriversByCarId(Long carId) { 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 name = resultSet.getNString("name"); + String licenseNumber = resultSet.getNString("license_number"); + String login = resultSet.getNString("login"); + String password = resultSet.getNString("password"); Driver driver = new Driver(); driver.setId(driverId); driver.setName(name); driver.setLicenseNumber(licenseNumber); + driver.setLogin(login); + driver.setPassword(password); return driver; } private Car parseCarFromResultSet(ResultSet resultSet) throws SQLException { Long manufacturerId = resultSet.getObject("manufacturer_id", Long.class); - String manufacturerName = resultSet.getString("manufacturer_name"); - String manufacturerCountry = resultSet.getString("manufacturer_country"); + String manufacturerName = resultSet.getNString("manufacturer_name"); + String manufacturerCountry = resultSet.getNString("manufacturer_country"); Manufacturer manufacturer = new Manufacturer(); manufacturer.setId(manufacturerId); manufacturer.setName(manufacturerName); manufacturer.setCountry(manufacturerCountry); Long carId = resultSet.getObject("id", Long.class); - String model = resultSet.getString("model"); + String model = resultSet.getNString("model"); Car car = new Car(); car.setId(carId); car.setModel(model); 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..ecd56e5ad 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()) { @@ -31,7 +33,8 @@ public Driver create(Driver driver) { } return driver; } catch (SQLException e) { - throw new DataProcessingException("Can't create driver " + driver, e); + throw new DataProcessingException("Couldn't create " + + driver + ". ", e); } } @@ -48,7 +51,24 @@ public Optional get(Long id) { } return Optional.ofNullable(driver); } catch (SQLException e) { - throw new DataProcessingException("Can't get driver by id " + id, e); + throw new DataProcessingException("Couldn't get driver by id " + id, e); + } + } + + @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("Couldn't get driver by id " + login, e); } } @@ -64,25 +84,29 @@ public List getAll() { } return drivers; } catch (SQLException e) { - throw new DataProcessingException("Can't get a list of drivers.", e); + throw new DataProcessingException("Couldn't get a list of drivers from driversDB.", + e); } } @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) { - throw new DataProcessingException("Can't update driver" + driver, e); + throw new DataProcessingException("Couldn't update " + + driver + " in driversDB.", e); } } @@ -94,7 +118,7 @@ public boolean delete(Long id) { statement.setLong(1, id); return statement.executeUpdate() > 0; } catch (SQLException e) { - throw new DataProcessingException("Can't delete driver with id " + id, e); + throw new DataProcessingException("Couldn't delete driver with id " + id, e); } } @@ -102,10 +126,14 @@ 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; } } diff --git a/src/main/java/taxi/dao/ManufacturerDaoImpl.java b/src/main/java/taxi/dao/ManufacturerDaoImpl.java index c32fbc3bd..bf52a1045 100644 --- a/src/main/java/taxi/dao/ManufacturerDaoImpl.java +++ b/src/main/java/taxi/dao/ManufacturerDaoImpl.java @@ -28,7 +28,7 @@ public Manufacturer create(Manufacturer manufacturer) { } return manufacturer; } catch (SQLException e) { - throw new DataProcessingException("Can't create manufacturer " + manufacturer, e); + throw new DataProcessingException("Couldn't create manufacturer. " + manufacturer, e); } } @@ -45,7 +45,7 @@ public Optional get(Long id) { } return Optional.ofNullable(manufacturer); } catch (SQLException e) { - throw new DataProcessingException("Can't get manufacturer by id " + id, e); + throw new DataProcessingException("Couldn't get manufacturer by id " + id, e); } } @@ -61,7 +61,8 @@ public List getAll() { } return manufacturers; } catch (SQLException e) { - throw new DataProcessingException("Can't get a list of manufacturers.", e); + throw new DataProcessingException("Couldn't get a list of manufacturers " + + "from manufacturers table. ", e); } } @@ -76,7 +77,7 @@ public Manufacturer update(Manufacturer manufacturer) { statement.executeUpdate(); return manufacturer; } catch (SQLException e) { - throw new DataProcessingException("Can't update a manufacturer " + throw new DataProcessingException("Couldn't update a manufacturer " + manufacturer, e); } } @@ -89,7 +90,7 @@ public boolean delete(Long id) { statement.setLong(1, id); return statement.executeUpdate() > 0; } catch (SQLException e) { - throw new DataProcessingException("Can't delete a manufacturer by id " + id, e); + throw new DataProcessingException("Couldn't delete a manufacturer by id " + id, 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..a80dfd9e9 --- /dev/null +++ b/src/main/java/taxi/exception/AuthenticationException.java @@ -0,0 +1,7 @@ +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..144f8fbcd 100644 --- a/src/main/java/taxi/model/Driver.java +++ b/src/main/java/taxi/model/Driver.java @@ -6,13 +6,17 @@ public class Driver { private Long id; private String name; private String licenseNumber; + private String login; + private String password; public Driver() { } - public Driver(String name, String licenseNumber) { + public Driver(String name, String licenseNumber, String login, String password) { this.name = name; this.licenseNumber = licenseNumber; + this.login = login; + this.password = password; } public Long getId() { @@ -39,6 +43,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 +70,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..3f84c764f --- /dev/null +++ b/src/main/java/taxi/service/AuthenticationServiceImpl.java @@ -0,0 +1,23 @@ +package taxi.service; + +import java.util.Optional; +import taxi.dao.DriverDao; +import taxi.exception.AuthenticationException; +import taxi.lib.Inject; +import taxi.lib.Service; +import taxi.model.Driver; + +@Service +public class AuthenticationServiceImpl implements AuthenticationService { + @Inject + private DriverDao driverDao; + + @Override + public Driver login(String login, String password) throws AuthenticationException { + Optional driver = driverDao.findByLogin(login); + if (driver.isEmpty() || !driver.get().getPassword().equals(password)) { + throw new AuthenticationException("Login or password was incorrect"); + } + return driver.get(); + } +} diff --git a/src/main/java/taxi/service/CarServiceImpl.java b/src/main/java/taxi/service/CarServiceImpl.java index 48de7d6e2..31992f8bf 100644 --- a/src/main/java/taxi/service/CarServiceImpl.java +++ b/src/main/java/taxi/service/CarServiceImpl.java @@ -1,7 +1,6 @@ package taxi.service; import java.util.List; -import java.util.NoSuchElementException; import taxi.dao.CarDao; import taxi.lib.Inject; import taxi.lib.Service; @@ -37,9 +36,7 @@ public Car create(Car car) { @Override public Car get(Long id) { - return carDao.get(id).orElseThrow(() -> - new NoSuchElementException("Can't get car by id: " + id) - ); + return carDao.get(id).get(); } @Override 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..4ba93e703 100644 --- a/src/main/java/taxi/service/DriverServiceImpl.java +++ b/src/main/java/taxi/service/DriverServiceImpl.java @@ -1,7 +1,7 @@ package taxi.service; import java.util.List; -import java.util.NoSuchElementException; +import java.util.Optional; import taxi.dao.DriverDao; import taxi.lib.Inject; import taxi.lib.Service; @@ -19,9 +19,12 @@ public Driver create(Driver driver) { @Override public Driver get(Long id) { - return driverDao.get(id).orElseThrow(() -> - new NoSuchElementException("Can't get driver by id: " + id) - ); + return driverDao.get(id).get(); + } + + @Override + public Optional findByLogin(String login) { + return driverDao.findByLogin(login); } @Override diff --git a/src/main/java/taxi/service/ManufacturerServiceImpl.java b/src/main/java/taxi/service/ManufacturerServiceImpl.java index a62f02e84..9f903d433 100644 --- a/src/main/java/taxi/service/ManufacturerServiceImpl.java +++ b/src/main/java/taxi/service/ManufacturerServiceImpl.java @@ -1,7 +1,6 @@ package taxi.service; import java.util.List; -import java.util.NoSuchElementException; import taxi.dao.ManufacturerDao; import taxi.lib.Inject; import taxi.lib.Service; @@ -19,9 +18,7 @@ public Manufacturer create(Manufacturer manufacturer) { @Override public Manufacturer get(Long id) { - return manufacturerDao.get(id).orElseThrow(() -> - new NoSuchElementException("Can't get manufacturer by id: " + id) - ); + return manufacturerDao.get(id).get(); } @Override diff --git a/src/main/java/taxi/util/ConnectionUtil.java b/src/main/java/taxi/util/ConnectionUtil.java index 9a94e69a2..0a4669848 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?serverTimezone=UTC"; + private static final String USERNAME = "root"; + private static final String PASSWORD = "1999mysql"; + private static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver"; static { try { diff --git a/src/main/java/taxi/web/filter/AuthenticationFilter.java b/src/main/java/taxi/web/filter/AuthenticationFilter.java new file mode 100644 index 000000000..0e45f5c73 --- /dev/null +++ b/src/main/java/taxi/web/filter/AuthenticationFilter.java @@ -0,0 +1,38 @@ +package taxi.web.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 final Set allowedUrls = new HashSet<>(); + + @Override + public void init(FilterConfig filterConfig) { + 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 session = req.getSession(); + Long driverId = (Long) session.getAttribute("driver_id"); + if (driverId == null && !allowedUrls.contains(req.getServletPath())) { + resp.sendRedirect("/login"); + return; + } + filterChain.doFilter(req, resp); + } +} diff --git a/src/main/resources/init_db.sql b/src/main/resources/init_db.sql index 2acabb883..b01f5ea7a 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) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, + `password` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci 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..9be8ceea0 100644 --- a/src/main/webapp/WEB-INF/views/cars/add.jsp +++ b/src/main/webapp/WEB-INF/views/cars/add.jsp @@ -8,6 +8,7 @@ Add car +<%@include file="../header.jsp"%>

Add car:

diff --git a/src/main/webapp/WEB-INF/views/cars/all.jsp b/src/main/webapp/WEB-INF/views/cars/all.jsp index 84f046299..f80cbfc0e 100644 --- a/src/main/webapp/WEB-INF/views/cars/all.jsp +++ b/src/main/webapp/WEB-INF/views/cars/all.jsp @@ -8,6 +8,7 @@ All cars +<%@include file="../header.jsp"%>

All cars:

@@ -34,7 +35,7 @@
- ${driver.id} ${driver.name} ${driver.licenseNumber}
+ ${driver.id} ${driver.name} ${driver.login} ${driver.licenseNumber}
diff --git a/src/main/webapp/WEB-INF/views/cars/drivers/add.jsp b/src/main/webapp/WEB-INF/views/cars/drivers/add.jsp index d281d5d72..26bdf3b26 100644 --- a/src/main/webapp/WEB-INF/views/cars/drivers/add.jsp +++ b/src/main/webapp/WEB-INF/views/cars/drivers/add.jsp @@ -8,6 +8,7 @@ Add driver to car +<%@include file="../../header.jsp"%>

Add driver to car:

diff --git a/src/main/webapp/WEB-INF/views/drivers/add.jsp b/src/main/webapp/WEB-INF/views/drivers/add.jsp index 4ad7cee44..b21c43ec2 100644 --- a/src/main/webapp/WEB-INF/views/drivers/add.jsp +++ b/src/main/webapp/WEB-INF/views/drivers/add.jsp @@ -8,6 +8,7 @@ All drivers +<%@include file="../header.jsp"%>

Add driver:

@@ -15,6 +16,8 @@ + + + +
Name License number AddLoginPassword
@@ -26,6 +29,12 @@ + + + +
diff --git a/src/main/webapp/WEB-INF/views/drivers/all.jsp b/src/main/webapp/WEB-INF/views/drivers/all.jsp index 776101f73..7b5da805b 100644 --- a/src/main/webapp/WEB-INF/views/drivers/all.jsp +++ b/src/main/webapp/WEB-INF/views/drivers/all.jsp @@ -8,12 +8,14 @@ All drivers +<%@include file="../header.jsp"%>

All drivers:

+ @@ -27,6 +29,9 @@ + diff --git a/src/main/webapp/WEB-INF/views/header.jsp b/src/main/webapp/WEB-INF/views/header.jsp new file mode 100644 index 000000000..786531947 --- /dev/null +++ b/src/main/webapp/WEB-INF/views/header.jsp @@ -0,0 +1,12 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + + Logout + + +Logout + + diff --git a/src/main/webapp/WEB-INF/views/index.jsp b/src/main/webapp/WEB-INF/views/index.jsp index b9b5e9d2b..a4f94ce17 100644 --- a/src/main/webapp/WEB-INF/views/index.jsp +++ b/src/main/webapp/WEB-INF/views/index.jsp @@ -7,6 +7,7 @@ My team +<%@include file="header.jsp"%>

Hello, mates

ID Name License numberLogin Delete
+ + DELETE
@@ -15,6 +16,7 @@ + diff --git a/src/main/webapp/WEB-INF/views/login.jsp b/src/main/webapp/WEB-INF/views/login.jsp new file mode 100644 index 000000000..5b52f92cd --- /dev/null +++ b/src/main/webapp/WEB-INF/views/login.jsp @@ -0,0 +1,38 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + + Login page + + +

${errorMessage}

+ +

Login

+
Display All Drivers
Display All Cars
Display My All Cars
Display All Manufacturers
Create new Driver
Create new Car
+ + + + + + + + + + + + + +
LoginPassword
+ + + + + +
+ Register +
+ + diff --git a/src/main/webapp/WEB-INF/views/manufacturers/add.jsp b/src/main/webapp/WEB-INF/views/manufacturers/add.jsp index 108d3541c..72db16e73 100644 --- a/src/main/webapp/WEB-INF/views/manufacturers/add.jsp +++ b/src/main/webapp/WEB-INF/views/manufacturers/add.jsp @@ -8,6 +8,7 @@ Manufacturers +<%@include file="../header.jsp"%>

Add manufacturer:

diff --git a/src/main/webapp/WEB-INF/views/manufacturers/all.jsp b/src/main/webapp/WEB-INF/views/manufacturers/all.jsp index fd3eafdbf..7aea488ae 100644 --- a/src/main/webapp/WEB-INF/views/manufacturers/all.jsp +++ b/src/main/webapp/WEB-INF/views/manufacturers/all.jsp @@ -8,6 +8,7 @@ All manufacturers +<%@include file="../header.jsp"%>

All manufacturers:

diff --git a/src/main/webapp/web.xml b/src/main/webapp/web.xml index 284381048..1f5fa359e 100644 --- a/src/main/webapp/web.xml +++ b/src/main/webapp/web.xml @@ -16,6 +16,24 @@ / + + login + taxi.controller.LoginController + + + login + /login + + + + logout + taxi.controller.LogoutController + + + logout + /logout + + allDrivers taxi.controller.driver.GetAllDriversController @@ -52,6 +70,15 @@ /cars + + allCurrentDriverCars + taxi.controller.car.GetMyCurrentCarsController + + + allCurrentDriverCars + /drivers/cars + + addCar taxi.controller.car.AddCarController @@ -105,4 +132,13 @@ deleteManufacturer /manufacturers/delete + + + authenticationFilter + taxi.web.filter.AuthenticationFilter + + + authenticationFilter + /* +