Я использую Spring-MVC с Spring Security для своего веб-приложения. Он включает страницы регистрации пользователей и частную панель пользователя. Я его настроить в настоящее время следующих шаблонов URL:Перехватчик MVC против фильтра безопасности Spring против чего-то еще ...?
whatever/myapp/login
журнал пользователя вwhatever/myapp/register?step=1
регистрация стартаwhatever/myapp/account/**
частных виды площади (страница)whatever/myapp/pending
вида, представленный в то время как после регистрации процессы завершенияwhatever/myapp/blocked
аккаунт заблокирован видwhatever/myapp/register/retry
если регистрация не удалась, a Llow повторить
По сути, эти URL-адреса ниже должны требовать аутентификации пользователей, т.е. требуют входа в систему:
whatever/myapp/account/**
(страницы частная область)whatever/myapp/pending
(эта страница имеет таймер, установленный для перенаправления/счет/дома)whatever/myapp/register/retry
Это довольно просто ас hieve, используя Spring security. Тем не менее, независимо от аутентификации пользователя с помощью функции Spring, доступ к страницам частной области должен быть недоступен или зависит от текущего состояния учетной записи пользователя (хранится в моей базе данных).
Более конкретно: если пользователь пытается получить доступ к чему-либо в частной области (/account/**
), ему должно быть показано соответствующее представление (перенаправлено на соответствующую страницу) в соответствии с состоянием. Я эти статусы определены:
suspended
- относится к Незавершенныеenabled
- обеспечить полный доступdisabled
- не имеет значения здесьretry_allowed
- относится повторить Просмотретьblocked
- относится к счет-заблокированный вид
В настоящее время я иметь настройку перехватчика MVC до /account/**
, которая проверяет статус пользователя и перенаправляет на соответствующие страницы, но почему-то я понимаю, что это не идеальное или подходящее решение здесь, так как я столкнулся с необычным поведением, например, с вызовом нескольких контроллеров. .. и также я не совсем уверен, когда нужно вернуть true
/false
в пределах preHandle()
метод. Вот фрагмент кода от перехватчика:
@Override
public boolean preHandle(
HttpServletRequest request,
HttpServletResponse response,
Object arg2)
throws Exception {
IPanelUser pUser = (IPanelUser) SecurityContextHolder.getContext()
.getAuthentication().getPrincipal();
// check principal first and then load from DB
// "suspended" is initial status upon registration
if(pUser.getCustomer().getStatus() == CustomerStatus.Suspended.getCode()) {
// if suspended, load from DB and update status
Customer customer = this.customerService.getUserByUsername(pUser.getUsername());
if(customer != null)
pUser.getCustomer().setStatus(customer.getStatus());
// still suspended? redirect to pending
if(pUser.getCustomer().getStatus() == CustomerStatus.Suspended.getCode()) {
response.sendRedirect("../pending");
return false;
}
}
if(pUser.getCustomer().getStatus() == CustomerStatus.Blocked.getCode()) {
// redirect to blocked page
response.sendRedirect("../blocked");
SecurityContextHolder.clearContext();
return false;
}
if(pUser.getCustomer().getStatus() == CustomerStatus.AllowRetry.getCode()) {
// redirect to CC submission page
response.sendRedirect("../register/retry");
return false;
}
if(pUser.getCustomer().getStatus() == CustomerStatus.Enabled.getCode() ||
pUser.getCustomer().getStatus() == CustomerStatus.Disabled.getCode()) {
// do nothing
}
return true;
}
.
Действительно ли это действительный подход? Любые альтернативные предложения?