gpt4 book ai didi

java - 基于角色的 Spring Security 重定向不起作用

转载 作者:太空宇宙 更新时间:2023-11-04 06:57:26 25 4
gpt4 key购买 nike

好吧,我尝试根据角色重定向用户,但我的自定义类什么也没做,我做了一些系统操作,但什么也没发生。

我遵循这个小教程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>

最佳答案

问题

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

super.onAuthenticationSuccess(请求、响应、身份验证)

导致SavedRequestAwareAuthenticationSuccessHandler或其父类(super class)之一使用其重定向策略并覆盖您的重定向策略。

(ergghh)解决方案

您可以通过在 reponse.sendRedirect() 之前调用 super.onAuthenticationSuccess() 来阻止重定向。它将覆盖之前所做的重定向尝试。虽然不是一个好的解决方案,但它会起作用。请参阅下文,了解为什么我认为这不是一个好的解决方案。

旁注

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

关于java - 基于角色的 Spring Security 重定向不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22549703/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com