基于角色不起作用的弹簧安全重定向

时间:2014-03-21 03:43:26

标签: java xml spring

我尝试重定向用户基于角色,但我的自定义类什么都不做我做了一些系统,但什么都没发生。

我按照这个小教程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>

1 个答案:

答案 0 :(得分:1)

问题

您的成功处理程序扩展SavedRequestAwareAuthenticationSuccessHandler,因此调用

super.onAuthenticationSuccess(request, response, authentication)

导致SavedRequestAwareAuthenticationSuccessHandler或其中一个超类使用其重定向策略并覆盖您的。

(ergghh)解决方案

您可以在super.onAuthenticationSuccess()之前致电reponse.sendRedirect()来阻止重定向。它将覆盖以前进行的重定向尝试。虽然不是一个好的解决方案,但它会奏效请参阅下文,为什么我认为这不是一个好的解决方案。

旁注

我不确定你为什么要扩展SavedRequestAwareAuthenticationSuccessHandler而不是简单地实现AuthenticationSuccessHandler。前者允许经过身份验证的用户重定向到之前访问过的页面。您的RoleBaseAuthentification仅按角色重定向,无条件返回上一个网址。因此,您选择延长SavedRequestAwareAuthenticationSuccessHandler对我来说没有意义。