. Генерация токена
Я сделал одну из своих любимых стрижек.
Спецификации 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”. Как правило, эти данные состоят из данных об операционной системе пользователя и браузере. При использовании базовой аутентификации “Агент пользователя” содержит информацию об имени пользователя и пароле.
В этой статье я не буду подробно рассказывать о базовой аутентификации.
Аутентификация с использованием формы
Аутентификация на основе форм используется на большинстве веб-сайтов. Каждая обычная страница на сайте может быть доступна пользователю без необходимости вводить пароль. Однако при доступе к защищенной странице пользователь будет перенаправлен на страницу входа в систему.
В этом уроке я расскажу, как использовать фильтр сервлетов для скрытия веб-приложения 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.
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;
}
}
Запустите программу:
Запустите программу:
Запустите приложение и войдите в систему как “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. Пусть он станет вашим спутником на
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.