определить целевой URL на основе ролей в весенней безопасности 3.1 - PullRequest
9 голосов
/ 30 ноября 2011

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

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

Ответы [ 2 ]

21 голосов
/ 30 ноября 2011

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

<http>
    ... 
    <form-login login-page="/login" default-target-url="/default"/>
</http>

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

@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 по умолчанию.затем он может быть подключен с использованием пространства имен, как показано ниже.

<sec:http>
    <sec:form-login authentication-success-handler-ref="authSuccessHandler"/>
</sec:http>
<bean:bean class="example.MyCustomAuthenticationSuccessHandler"/>

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

0 голосов
/ 15 августа 2018

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

Вам необходимо создать пользовательский обработчик успешной аутентификации следующим образом:

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<? extends GrantedAuthority> 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-файл Spring Security, определите ваш бин и используйте его

   <bean id="customeAuthenticationSuccessHandler"
          class="com.test.CustomeAuthenticationSuccessHandler"/>
    <security:http auto-config="true" use-expressions="false">
        <security:form-login login-page="/sign-in" login-processing-url="/sign-in" username-parameter="username"
                             password-parameter="password"
                             authentication-success-handler-ref="customeAuthenticationSuccessHandler"
                             always-use-default-target="true"
                             authentication-failure-url="/sign-in?error=true"/>

        <security:logout logout-url="/logout" logout-success-url="/"/>
     ..
     ..
    </security:http>
...