- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
好吧,我尝试根据角色重定向用户,但我的自定义类什么也没做,我做了一些系统操作,但什么也没发生。
我遵循这个小教程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)之一使用其重定向策略并覆盖您的重定向策略。
您可以通过在 reponse.sendRedirect()
之前调用 super.onAuthenticationSuccess()
来阻止重定向。它将覆盖之前所做的重定向尝试。虽然不是一个好的解决方案,但它会起作用。请参阅下文,了解为什么我认为这不是一个好的解决方案。
我不确定您为什么要扩展 SavedRequestAwareAuthenticationSuccessHandler
而不是简单地实现 AuthenticationSuccessHandler。前者允许经过身份验证的用户重定向到其先前访问过的页面。您的 RoleBaseAuthentification
仅按角色重定向,没有条件返回到之前的网址。因此,您选择扩展 SavedRequestAwareAuthenticationSuccessHandler
对我来说没有意义。
关于java - 基于角色的 Spring Security 重定向不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22549703/
今天有小伙伴给我留言问到,try{...}catch(){...}是什么意思?它用来干什么? 简单的说 他们是用来捕获异常的 下面我们通过一个例子来详细讲解下
我正在努力提高网站的可访问性,但我不知道如何在页脚中标记社交媒体链接列表。这些链接指向我在 facecook、twitter 等上的帐户。我不想用 role="navigation" 标记这些链接,因
说现在是 6 点,我有一个 Timer 并在 10 点安排了一个 TimerTask。之后,System DateTime 被其他服务(例如 ntp)调整为 9 点钟。我仍然希望我的 TimerTas
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我就废话不多说了,大家还是直接看代码吧~ ? 1
Maven系列1 1.什么是Maven? Maven是一个项目管理工具,它包含了一个对象模型。一组标准集合,一个依赖管理系统。和用来运行定义在生命周期阶段中插件目标和逻辑。 核心功能 Mav
我是一名优秀的程序员,十分优秀!