Http Basic Authentication in Java using HttpClient? – Stack Overflow

. Генерация токена

Я сделал одну из своих любимых стрижек.

Спецификации JWT.

. Реализация фильтра


Фильтр — это объект класса, реализующего интерфейс

javax.servlet.Filter

. Менеджер аутентификации.

Объект класса, реализующий протокол аутентификации, – это менеджер аутентификации.

org.springframework.security.authentication.AuthenticationManager

Как это сделать?

Аутентификация ()

. Этот метод можно использовать для передачи частично заполненного объекта, который реализует

org.springframework.security.core.Authentication

Контекст безопасности приложения.


Задача менеджера аутентификации — в случае успешной аутентификации заполнить полностью объект

Аутентификация

Отдайте его. При завершении вы должны установить пользователя ().

principal

), Ваши права (

Власти

) выполнить задачу

setAuthenticated(true)

. Менеджер аутентификации может выдать исключение.

AuthenticationException

Приведём пример реализации интерфейса org.springframework.security.core.Authentication:

. Как всё это собрать вместе

А затем фильтры. Для этого существует два метода.

Первый способ – указать фильтр в файле web.xml нашего приложения.

При таком подходе экземпляр фильтра не будет доступен для приложения Spring, поэтому вы должны сразу указать менеджер аутентификации в конструкторе фильтра. Используйте второй подход, если вы хотите, чтобы фильтр или менеджер аутентификации были контейнерами Spring.

Второй способ заключается в настройке фильтра в Spring Security.

Для примера покажем конфигурацию с использованием Java Config

Create a simple login application and secure pages with java servlet filter

Безопасность является важнейшим компонентом любого приложения, передающего конфиденциальные данные по Интернету.

Аутентификация

Прежде чем пользователь войдет в защищенную область веб-сайта, его привилегии доступа проверяются в процессе аутентификации. Базовая аутентификация и аутентификация на основе формы – это два основных метода аутентификации.

Фундаментальная аутентификация

Используя только базовую аутентификацию, пользователь получает полный доступ ко всем страницам. На страницах, запрашивающих безопасность, появится окно для ввода имени пользователя и пароля. Информация об имени пользователя и пароле будет объединена и отправлена на сервер вместе с запросом.

Когда пользователь запрашивает страницу, набирая путь в браузере и нажимая Enter. Запрос включает созданную информацию “User Agent”. Как правило, эти данные состоят из данных об операционной системе пользователя и браузере. При использовании базовой аутентификации “Агент пользователя” содержит информацию об имени пользователя и пароле.

В этой статье я не буду подробно рассказывать о базовой аутентификации.

Аутентификация с использованием формы

Аутентификация на основе форм используется на большинстве веб-сайтов. Каждая обычная страница на сайте может быть доступна пользователю без необходимости вводить пароль. Однако при доступе к защищенной странице пользователь будет перенаправлен на страницу входа в систему.

Похожее:  uid.me – сервис личных страниц от uCoz

В этом уроке я расскажу, как использовать фильтр сервлетов для скрытия веб-приложения Java.

Принципал и роль – два важнейших понятия в области безопасности.

Role

Для приложения роль представляет собой набор разрешений.

Principal

После вхождения в систему Принципал может временно рассматриваться как “Субъект”. Он имеет право участвовать в системе определенным образом. У “Субъекта” может быть одна или несколько ролей. Это зависит от разрешений приложения для каждой уникальной учетной записи пользователя.

Фильтр сервлетов специально используется в приложении Java Servlet для обеспечения безопасности. Его общее название – фильтр безопасности.

Рекомендации по эксплуатации фильтра безопасности приведены ниже.

Фильтр безопасности будет оценивать защищенную страницу, когда пользователь обращается к ней. Запрос пользователя будет перенаправлен на страницу входа в систему, если он не вошел в систему.

Объект Principal создается, если доступ пользователя был успешным. Информация о пользователе заносится, включая роли.

Если пользователь ранее обращался к защищенной странице и успешно вошел в систему. Фильтр безопасности определит, подходит ли роль пользователя для доступа к этой странице. Если она не подходит, пользователю будет показана страница с сообщением “Доступ запрещен”.

Это формат заявки, которую мы будем подавать:

Создайте “Динамический веб-проект” в Eclipse под названием “SecurityWebApp” и настройте его для работы с Tomcat Server. Я не буду вдаваться в подробности здесь, но вы можете обратиться к уроку ниже за инструкциями:

Пользователь приложения представляется классом UserAccount.

Для запроса данных в базе данных (Simulation), используйте класс DataDAO.

DataDAO.java


package org.o7planning.securitywebapp.utils;

import java.util.HashMap;
import java.util.Map;

import org.o7planning.securitywebapp.bean.UserAccount;
import org.o7planning.securitywebapp.config.SecurityConfig;

public class DataDAO {

   private static final Map<String, UserAccount> mapUsers = new HashMap<String, UserAccount>();

   static {
      initUsers();
   }

   private static void initUsers() {

      // This user has a role as EMPLOYEE.
      UserAccount emp = new UserAccount("employee1", "123", UserAccount.GENDER_MALE, //
            SecurityConfig.ROLE_EMPLOYEE);

      // This user has 2 roles EMPLOYEE and MANAGER.
      UserAccount mng = new UserAccount("manager1", "123", UserAccount.GENDER_MALE, //
            SecurityConfig.ROLE_EMPLOYEE, SecurityConfig.ROLE_MANAGER);

      mapUsers.put(emp.getUserName(), emp);
      mapUsers.put(mng.getUserName(), mng);
   }

   // Find a User by userName and password.
   public static UserAccount findUser(String userName, String password) {
      UserAccount u = mapUsers.get(userName);
      if (u != null && u.getPassword().equals(password)) {
         return u;
      }
      return null;
   }

}

Lp SecurityConfig предоставляет доступ к различным va tr и chic nano (car trans), которые совместимы с рассматриваемым vi tr.

Похожее:  REST API с использованием Spring Security и JWT / Хабр

SecurityUtils class is a utility class, which has methods to help check if a request is required to be logged in or not, and whether such request is suitable for the role of user logged or not. 

SecurityFilter.java


package org.o7planning.securitywebapp.filter;

import java.io.IOException;
import java.util.List;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.o7planning.securitywebapp.bean.UserAccount;
import org.o7planning.securitywebapp.request.UserRoleRequestWrapper;
import org.o7planning.securitywebapp.utils.AppUtils;
import org.o7planning.securitywebapp.utils.SecurityUtils;

@WebFilter("/*")
public class SecurityFilter implements Filter {

	public SecurityFilter() {
	}

	@Override
	public void destroy() {
	}

	@Override
	public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
			throws IOException, ServletException {
		HttpServletRequest request = (HttpServletRequest) req;
		HttpServletResponse response = (HttpServletResponse) resp;

		String servletPath = request.getServletPath();

		// User information stored in the Session.
		// (After successful login).
		UserAccount loginedUser = AppUtils.getLoginedUser(request.getSession());

		if (servletPath.equals("/login")) {
			chain.doFilter(request, response);
			return;
		}
		HttpServletRequest wrapRequest = request;

		if (loginedUser != null) {
			// User Name
			String userName = loginedUser.getUserName();

			// Roles
			List<String> roles = loginedUser.getRoles();

			// Wrap old request by a new Request with userName and Roles information.
			wrapRequest = new UserRoleRequestWrapper(userName, roles, request);
		}

		// Pages must be signed in.
		if (SecurityUtils.isSecurityPage(request)) {

			// If the user is not logged in,
			// Redirect to the login page.
			if (loginedUser == null) {

				String requestUri = request.getRequestURI();

				// Store the current page to redirect to after successful login.
				int redirectId = AppUtils.storeRedirectAfterLoginUrl(request.getSession(), requestUri);

				response.sendRedirect(wrapRequest.getContextPath()   "/login?redirectId="   redirectId);
				return;
			}

			// Check if the user has a valid role?
			boolean hasPermission = SecurityUtils.hasPermission(wrapRequest);
			if (!hasPermission) {

				RequestDispatcher dispatcher //
						= request.getServletContext().getRequestDispatcher("/WEB-INF/views/accessDeniedView.jsp");

				dispatcher.forward(request, response);
				return;
			}
		}

		chain.doFilter(wrapRequest, response);
	}

	@Override
	public void init(FilterConfig fConfig) throws ServletException {

	}

}

LoginServlet.java


package org.o7planning.securitywebapp.servlet;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.o7planning.securitywebapp.bean.UserAccount;
import org.o7planning.securitywebapp.utils.AppUtils;
import org.o7planning.securitywebapp.utils.DataDAO;

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	public LoginServlet() {
		super();
	}

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		RequestDispatcher dispatcher //
				= this.getServletContext().getRequestDispatcher("/WEB-INF/views/loginView.jsp");

		dispatcher.forward(request, response);
	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		String userName = request.getParameter("userName");
		String password = request.getParameter("password");
		UserAccount userAccount = DataDAO.findUser(userName, password);

		if (userAccount == null) {
			String errorMessage = "Invalid userName or Password";

			request.setAttribute("errorMessage", errorMessage);

			RequestDispatcher dispatcher //
					= this.getServletContext().getRequestDispatcher("/WEB-INF/views/loginView.jsp");

			dispatcher.forward(request, response);
			return;
		}

		AppUtils.storeLoginedUser(request.getSession(), userAccount);

		// 
		int redirectId = -1;
		try {
			redirectId = Integer.parseInt(request.getParameter("redirectId"));
		} catch (Exception e) {
		}
		String requestUri = AppUtils.getRedirectAfterLoginUrl(request.getSession(), redirectId);
		if (requestUri != null) {
			response.sendRedirect(requestUri);
		} else {
			// Default after successful login
			// redirect to /userInfo page
			response.sendRedirect(request.getContextPath()   "/userInfo");
		}

	}

}

AppUtils.java


package org.o7planning.securitywebapp.utils;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpSession;

import org.o7planning.securitywebapp.bean.UserAccount;

public class AppUtils {

	private static int REDIRECT_ID = 0;

	private static final Map<Integer, String> id_uri_map = new HashMap<Integer, String>();
	private static final Map<String, Integer> uri_id_map = new HashMap<String, Integer>();

	// Store user info in Session.
	public static void storeLoginedUser(HttpSession session, UserAccount loginedUser) {
		// On the JSP can access via ${loginedUser}
		session.setAttribute("loginedUser", loginedUser);
	}

	// Get the user information stored in the session.
	public static UserAccount getLoginedUser(HttpSession session) {
		UserAccount loginedUser = (UserAccount) session.getAttribute("loginedUser");
		return loginedUser;
	}

	public static int storeRedirectAfterLoginUrl(HttpSession session, String requestUri) {
		Integer id = uri_id_map.get(requestUri);

		if (id == null) {
			id = REDIRECT_ID  ;

			uri_id_map.put(requestUri, id);
			id_uri_map.put(id, requestUri);
			return id;
		}

		return id;
	}

	public static String getRedirectAfterLoginUrl(HttpSession session, int redirectId) {
		String url = id_uri_map.get(redirectId);
		if (url != null) {
			return url;
		}
		return null;
	}

}

Запустите программу:

Похожее:  Авторизация через базы данных на PHP | Трепачёв Дмитрий

Запустите программу:

Запустите приложение и войдите в систему как “employee1”, пользователь с ролью “EMPLOYEE”.

Запустите программу и войдите в систему с именем пользователя “manager1”, которое обозначает пользователя, имеющего роли “EMPLOYEE” и “MANAGER”.

Declaring security roles

You can declare security role names used in web applications by using the
security-role element of the deployment descriptor. Use this element to list all the
security roles that you have referenced in your application.

The following snippet of a deployment descriptor declares the roles that will be
used in an application using the security-role element and specifies which of these
roles is authorized to access protected resources using the auth-constraint element:

Other java coding tutorials:

About the author:

Если ха -мини

Сертифицированный SCJP и SCWCD программист Java. Когда Java 1.4 только вышла, он начал использовать ее для программирования и с тех пор влюблен в Java. Пусть он станет вашим спутником на

Facebook

and watch

Те из его Java

Используя YouTube.

Specifying a web resource collection

Подэлементы, составляющие коллекцию веб-ресурсов, включают следующее:

Specifying an authentication mechanism in the deployment descriptor

To specify an authentication mechanism, use the login-config element. It can contain the
following subelements.

  • Подэлемент auth-method настраивает механизм аутентификации для веб-приложения. Содержимое элемента должно быть NONE, BASIC, DIGEST, FORM или CLIENT-CERT.
  • Подэлемент realm-name указывает имя сферы, которое будет использоваться при выборе схемы базовой аутентификации для веб-приложения.
  • Подэлемент form-login-config определяет страницы входа и ошибок, которые будут использоваться при указании входа в форму.

Specifying an authorization constraint

An authorization constraint (auth-constraint) contains the role-name element. You can use as many
role-name elements as needed here.

Specifying security constraints

A security constraint is used to define the access privileges to a collection of
resources using their URL mapping.

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (1 оценок, среднее: 4,00 из 5)
Загрузка...

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector