我尝试重定向用户基于角色,但我的自定义类什么都不做我做了一些系统,但什么都没发生。
我按照这个小教程http://oajamfibia.wordpress.com/2011/07/07/role-based-login-redirect/#comment-12
但我改变了我的扩展类 SavedRequestAwareAuthenticationSuccessHandler 我也尝试了教程中没有发生的事情,不知道我错过了什么。任何帮助将不胜感激。
这是我的班级
@Component
public class RoleBaseAuthentification extends SavedRequestAwareAuthenticationSuccessHandler{
private Map<String, String> roleMap;
@Override
public void onAuthenticationSuccess(HttpServletRequest request,
HttpServletResponse response, Authentication authentication)
throws ServletException, IOException {
System.out.println(request.getUserPrincipal());
if(authentication.getPrincipal() instanceof UserDetails){
UserDetails userDetails = (UserDetails) authentication.getPrincipal();
System.out.println(userDetails);
String role = userDetails.getAuthorities().isEmpty() ? null : userDetails.getAuthorities().toArray()[0].toString();
System.out.println(role);
response.sendRedirect(request.getContextPath() + roleMap.get(role));
}
super.onAuthenticationSuccess(request, response, authentication);
}
public Map<String, String> getRoleMap() {
return roleMap;
}
public void setRoleMap(Map<String, String> roleMap) {
this.roleMap = roleMap;
}
}
这是我的security-context.xml
<security:authentication-manager alias="authenticationManager">
<security:authentication-provider>
<security:jdbc-user-service data-source-ref="dataSource"
users-by-username-query="select username,password,enabled from users where username = ?"
authorities-by-username-query="select u.username, ur.authority from users u, user_roles ur where u.user_id = ur.user_id and u.username = ?" />
</security:authentication-provider>
</security:authentication-manager>
<security:http use-expressions="true">
<security:intercept-url pattern="/management" access="hasRole('ROLE_ADMIN')"/>
<security:form-login login-page="/login" authentication-success-handler-ref="redirectByRole"/>
</security:http>
<bean id="redirectByRole" class="com.freelogic.spring.web.service.RoleBaseAuthentification">
<property name="roleMap">
<map>
<entry key="ROLE_ADMIN" value="/management.jsp" />
<entry key="ROLE_USER" value="/home.jsp" />
</map>
</property>
</bean>
答案 0 :(得分:1)
您的成功处理程序扩展SavedRequestAwareAuthenticationSuccessHandler
,因此调用
super.onAuthenticationSuccess(request, response, authentication)
导致SavedRequestAwareAuthenticationSuccessHandler
或其中一个超类使用其重定向策略并覆盖您的。
您可以在super.onAuthenticationSuccess()
之前致电reponse.sendRedirect()
来阻止重定向。它将覆盖以前进行的重定向尝试。虽然不是一个好的解决方案,但它会奏效请参阅下文,为什么我认为这不是一个好的解决方案。
我不确定你为什么要扩展SavedRequestAwareAuthenticationSuccessHandler
而不是简单地实现AuthenticationSuccessHandler。前者允许经过身份验证的用户重定向到之前访问过的页面。您的RoleBaseAuthentification
仅按角色重定向,无条件返回上一个网址。因此,您选择延长SavedRequestAwareAuthenticationSuccessHandler
对我来说没有意义。