определить целевой URL на основе ролей в весенней безопасности 3.1

В весенней безопасности 3.0 у нас есть class AuthenticationProcessingFilter , в котором мы использовали метод determineTargetUrl() , который возвращал URL-адрес на основе разных ролей.

Теперь мы переходим к весенней безопасности 3.1.0.RC3, и я застрял, как мне теперь определить URL-адрес на основе разных ролей, поскольку class AuthenticationProcessingFilter был удален из новой версии. Может кто-нибудь, пожалуйста, дайте мне короткие инструкции с некоторым кодом, чтобы я мог реализовать собственный фильтр для перенаправления на разные страницы для разных ролей.

Лучший способ определить целевой URL на основе ролей – указать целевой URL в конфигурации Spring Security, как показано ниже. Это будет работать в Spring 3.0 или 3.1

  ...   

Затем создайте controller, который обрабатывает целевой URL-адрес по умолчанию. Контроллер должен перенаправлять или пересылать на основе рулонов. Ниже приведен пример использования Spring MVC, но будет работать любой тип controllerа (например, Struts, Servlet и т. Д.).

 @Controller public class DefaultController { @RequestMapping("/default") public String defaultAfterLogin(HttpServletRequest request) { if (request.isUserInRole("ROLE_ADMIN")) { return "redirect:/users/sessions"; } return "redirect:/messages/inbox"; } } по @Controller public class DefaultController { @RequestMapping("/default") public String defaultAfterLogin(HttpServletRequest request) { if (request.isUserInRole("ROLE_ADMIN")) { return "redirect:/users/sessions"; } return "redirect:/messages/inbox"; } } 

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

Альтернативой является то, что вы можете создать пользовательский AuthenticationSuccessHandler . Реализация может расширить SavedRequestAwareAuthenticationSuccessHandler, который по умолчанию является AuthenticationSuccessHandler. он может быть подключен через пространство имен, как показано ниже.

     

Я бы не рекомендовал делать это, поскольку он привязан к Spring Security API, и лучше избегать этого, когда это возможно.

Использование специального обработчика успеха проверки подлинности для указания перенаправления на основе роли пользователя после успешной проверки подлинности.

Вам нужно создать обработчик успешной проверки подлинности, как показано ниже:

 import org.springframework.security.core.Authentication; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.web.DefaultRedirectStrategy; import org.springframework.security.web.RedirectStrategy; import org.springframework.security.web.authentication.AuthenticationSuccessHandler; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.Collection; public class CustomeAuthenticationSuccessHandler implements AuthenticationSuccessHandler { private RedirectStrategy redirectStrategy = new DefaultRedirectStrategy(); @Override public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException { handle(request, response, authentication); } protected void handle(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException { String targetUrl = determineTargetUrl(authentication); if (response.isCommitted()) { return; } redirectStrategy.sendRedirect(request, response, targetUrl); } protected String determineTargetUrl(Authentication authentication) { boolean isTeacher = false; boolean isAdmin = false; Collection authorities = authentication.getAuthorities(); for (GrantedAuthority grantedAuthority : authorities) { if (grantedAuthority.getAuthority().equals("ROLE_USER")) { isTeacher = true; break; } else if (grantedAuthority.getAuthority().equals("ROLE_ADMIN")) { isAdmin = true; break; } } if (isTeacher) { return "/user/account"; } else if (isAdmin) { return "/admin/account"; } else { throw new IllegalStateException(); } } public void setRedirectStrategy(RedirectStrategy redirectStrategy) { this.redirectStrategy = redirectStrategy; } protected RedirectStrategy getRedirectStrategy() { return redirectStrategy; } } 

Затем измените файл весны безопасности xml и определите свой компонент и используйте его

      .. ..  
  • Весенний язык выражений (SpEL) с @Value: доллар против hashа ($ против #)
  • получение исключения: не определен bean с именем «springSecurityFilterChain»
  • Как java-настроить отдельные источники данных для весенних пакетных данных и бизнес-данных? Должен ли я это сделать?
  • @Value не разрешается при использовании annotations @PropertySource. Как настроить PropertySourcesPlaceholderConfigurer?
  • Данные Spring: поддерживается «delete by»?
  • Как получить объект сеанса весной?
  • Как регистрировать HttpRequest и HttpResponse в файле?
  • Невозможно Autowire @Repository аннотированный интерфейс в Spring Boot
  • Spring + Web MVC: dispatcher-servlet.xml и applicationContext.xml (плюс общая безопасность)
  • Отключить безопасность для модульных тестов с весенней загрузкой
  • конфигурация страtagsи именования spring - hibernate 5
  • Давайте будем гением компьютера.