определить целевой URL на основе ролей для Struts2 - PullRequest
0 голосов
/ 07 марта 2012

Я новичок в распорках и пружинной безопасности. Может кто-нибудь помочь мне выяснить, как перенаправить на разные URL разных пользователей с разными ролями? Другими словами, как обеспечить определение целевого URL-адреса на основе роли пользователя в Struts2 с помощью контроллера действий?

Я нашел следующий вопрос определить целевой URL на основе ролей в Spring Security 3.1 , но я не могу понять, как настроить действие.

Я попробовал следующую настройку, но она не работает:

security.xml

 <form-login login-page="/login" authentication-failure-url="/login?error=true" login-processing-url="/j_security_check" default-target-url="/default"/>

struts.xml

<action name="default" class="com.moblab.webapp.action.RoleRedirectAction" method="defaultAfterLogin"/>

RoleRedirectAction.java

package com.moblab.webapp.action;
import javax.servlet.http.HttpServletRequest;
public class RoleRedirectAction extends BaseAction{

public String defaultAfterLogin(HttpServletRequest request) {
    if (request.isUserInRole("ROLE_ADMIN")) {
        return "redirect:/<url>";
    }
    return "redirect:/<url>";
}
}

Большое спасибо.

РЕДАКТИРОВАТЬ 1 Я также попробовал следующую аннотацию

 @Action(value="/default",results={@Result(name="success",location="/querySessions")})

РЕДАКТИРОВАТЬ 2 Мое окончательное решение выглядит следующим образом. Я не уверен, что это лучший подход, но он работает:

public class StartPageRouter extends SimpleUrlAuthenticationSuccessHandler {


@Autowired
private UserService userService;

protected final Logger logger = Logger.getLogger(this.getClass());
private RequestCache requestCache = new HttpSessionRequestCache();

@Override
public void onAuthenticationSuccess(HttpServletRequest request,
                                    HttpServletResponse response,
                                    Authentication authentication) throws IOException, ServletException {


    Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();

    //default path for ROLE_USER
    String redirectPath = <url>;

    if (authorities != null && !authorities.isEmpty()) {

        Set<String> roles = getUserRoles(authorities);

        if (roles.contains("ROLE_ADMIN"))
            redirectPath = <url>;
        else if (roles.contains("ROLE_INSTRUCTOR"))
            redirectPath = <url>;
    }

    getRedirectStrategy().sendRedirect(request, response, redirectPath);
}

public void setRequestCache(RequestCache requestCache) {
    this.requestCache = requestCache;
}

private Set<String> getUserRoles(Collection<? extends GrantedAuthority> authorities) {

    Set<String> userRoles = new HashSet<String>();

    for (GrantedAuthority authority : authorities) {
        userRoles.add(authority.getAuthority());
    }
    return userRoles;
}
}

РЕДАКТИРОВАТЬ 3 Здесь есть еще лучшие решения:

http://oajamfibia.wordpress.com/2011/07/07/role-based-login-redirect/#comment-12

1 Ответ

2 голосов
/ 07 марта 2012

Предполагая, что вы хотите перенаправить пользователей на разные стартовые страницы в зависимости от назначенных им ролей, вы можете попробовать это.Обратите внимание, что я делаю все это вне Struts.

Сначала создайте свой собственный класс, который расширяет Springs SimpleUrlAuthenticationSuccessHandler, и переопределите метод onAuthenticationSuccess ().Фактическое перенаправление выполняется в методе onAuthenticationSuccess () строкой getRedirectStrategy (). SendRedirect (request, response,);

Таким образом, все, что вам нужно, это средство замены ваших собственных URL.

Так, например, у меня есть

package com.blackbox.x.web.security;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler;
import org.springframework.security.web.savedrequest.HttpSessionRequestCache;
import org.springframework.security.web.savedrequest.RequestCache;

import com.blackbox.x.entities.UserDTO;
import com.blackbox.x.services.UserService;


public class StartPageRouter extends SimpleUrlAuthenticationSuccessHandler {


 @Autowired
 UserService userService;

 @Autowired
 LoginRouter router;


 protected final Logger logger = Logger.getLogger(this.getClass());
 private RequestCache requestCache = new HttpSessionRequestCache();

@Override
public void onAuthenticationSuccess(HttpServletRequest request,
        HttpServletResponse response, Authentication authentication) throws IOException,
        ServletException {


    requestCache.removeRequest(request, response);

    User user = (User) authentication.getPrincipal();
    UserDTO userDTO = userService.find(user.getUsername());

    getRedirectStrategy().sendRedirect(request, response, router.route(userDTO));
}

public void  setRequestCache(RequestCache requestCache) {
            this.requestCache = requestCache;
        }
}

, где LoginRouter - это мой собственный класс, который принимает зарегистрированного пользователя и из назначенных ролей определяет, на какой URL-адрес должен быть направлен пользователь.

Затем вы конфигурируете Spring Security для использования вашей версии, используя

authentication-success-handler-ref="customTargetUrlResolver"/> 

и

<beans:bean id="customTargetUrlResolver" class="com.blackbox.x.web.security.StartPageRouter"/>

в XML-файле контекста безопасности.

...