День добрый. Подскажите пожалуйста в каком направлении идти.
У меня есть проект где разделен функционал пользователей и администраторов. Хочу настроить:
Просто пока не улавливаю логику как это должно работать. Ниже приведен код авторизации пользователей и определение их ролей.
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String userName = request.getParameter("login");
String password = request.getParameter("password");
HttpSession session = request.getSession();
UsersService usersService = new UsersService();
int id_user = usersService.getRoleUser(userName, password);
Calendars calendars = new Calendars();
if (id_user != 0) {
Users user = usersService.getUserById(id_user);
if (user.getRole().equals("user")) {
session.setAttribute("userName", userName);
session.setAttribute("name",user.getFio_user());
session.setAttribute("magazine",user.getMagazine());
session.setAttribute("id_user", id_user);
session.setAttribute("date_now", calendars.getNowDate());
response.sendRedirect("userview/user.jsp");
}
if (user.getRole().equals("admin")) {
response.sendRedirect("adminview/admin.jsp");
}
}else
{
response.sendRedirect("index.jsp");
}
}
Можешь попробывать хранить информацию о роли в Cockies и вытаскивать от туда при переходе на новую страницу. А дальше уже смотреть в соответствии с ролью и редиректить его на правильную страницу
Либо же заведи таблицу user и храни там информацию о том кем является пользователь и авторизован ли он. Только не храни пароль в открытом виде, лучше хэшируй его.
Так же можешь использовать токен (генерировать и сохранять на сервере - бд строчку из случайных чисел), который будешь хранить в куках и сравнивать с токеном на сервере. Если они отличаются, то выкидывать пользователя на авторизацию
Благодаря внесенной ясности стало понятнее что именно нужно для данных вещей. Для того чтобы разделить хождение пользователей/администраторов. Было создано два фильтра.
Скрины как разложен функционал пользователей и администраторов будет внизу.
Filter которой проверяет все страницы на то что пользователь залогинен.
@WebFilter("/*")//Все страницы сайта обрабатывает данный фильтр
public class LoginFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//получение данных сессии
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
HttpSession session = request.getSession(false);
//URL Запроса/переадресации на Servlet входа
String loginURI = request.getContextPath() + "/InvateServlet";
//Если сессия ранее создана
boolean loggedIn = session != null && session.getAttribute("userName") != null && session.getAttribute("userRole") != null;
boolean loginRequest = request.getRequestURI().equals(loginURI);
//Если запрос пришел со страницы с входом или сессия не пуста даем добро следовать дальше
//Если нет ридерект на страницу входа
if (loggedIn || loginRequest) {
filterChain.doFilter(request, response);
} else {
response.sendRedirect(loginURI);
}
}
@Override
public void destroy() {
}
}
InvateServlet
@WebServlet(name = "InvateServlet", urlPatterns = "/InvateServlet")
public class InvateServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String userName = request.getParameter("login");
String password = request.getParameter("password");
//Объект генерирующий хеш пароля
Encryption encryption = new Encryption();
HttpSession session = request.getSession();
UsersService usersService = new UsersService();
int id_user = 0;
try {
id_user = usersService.getRoleUser(userName, encryption.getPasswordEncryption(password));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
Calendars calendars = new Calendars();
if (id_user != 0) {
Users user = usersService.getUserById(id_user);
if (user.getRole().equals("user")) {
session.setAttribute("userName", userName);
session.setAttribute("userRole", user.getRole());
session.setAttribute("name",user.getFio_user());
session.setAttribute("magazine",user.getMagazine());
session.setAttribute("id_user", id_user);
session.setAttribute("date_now", calendars.getNowDate());
response.sendRedirect("userview/user.jsp");
}
if (user.getRole().equals("admin")) {
response.sendRedirect("adminview/admin.jsp");
}
}else
{
response.sendRedirect("index.jsp");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("/index.jsp").forward(request, response);
}
}
FIlter отслеживающий защищенную часть администратора.
@WebFilter("/adminview/*")//Защищаемае часть
public class AuthFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
HttpSession session = request.getSession(false);
//Существует ли сессиия
boolean loggedIn = session != null && session.getAttribute("userName") != null && session.getAttribute("userRole") != null;
if (loggedIn ){
//Если существует то получаем роль
String userRole = session.getAttribute("userRole").toString();
if (userRole.equals("user")){
response.sendRedirect(request.getContextPath() + "/userview/user.jsp");
}else if (userRole.equals("admin")){
response.sendRedirect(request.getContextPath() + "/adminview/admin.jsp");
}
//Если нет то на страницу входа.
}else response.sendRedirect(request.getContextPath() + "/InvateServlet");
}
@Override
public void destroy() {
}
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Есть ли возможность задать border-image только с одной стороны блока (не вокруг)? Например, если необходимо сделать тот же border-bottom: dotted, только с промежутком...