我是struts和spring security的新手。谁能帮我弄清楚如何将不同角色的不同用户重定向到不同的网址?换句话说,如何使用动作控制器在struts2中根据用户角色提供确定目标url?
我发现以下问题根据 spring security 3.1 中的角色确定目标 url,但我不知道如何配置操作。
我尝试了以下设置,但它不起作用:
安全.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