最近项目开发中有这样一个业务逻辑,一个登陆画面,根据不同权限跳转到不同的画面(Action)
开始的做法是直接跳到一个调度的Action,再由这个Action去分配。
这次开发使用了安全框架,遂希望通过安全框架去做这个调度
于是使用authentication-success-handler-ref
来替换default-target-url和always-use-default-target,实现这一目的
国际惯例,先上代码
Xml代码
<http auto-config='true' >
<intercept-url pattern="/public/**" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
<intercept-url pattern="/user/**" access="ROLE_SPACE_ADMIN,ROLE_SMALL_SPACE_ADMIN,ROLE_INSTITUTION_MEMBER,ROLE_SYSTEM_ADMIN"/>
<intercept-url pattern="/admin/**" access="ROLE_SUPER_ADMIN"/>
<form-login login-page="/user/login.action"
authentication-failure-url="/user/login.action?msg=fault"
authentication-success-handler-ref="authenticationDispatcher"
login-processing-url="/securityLogin"/>
<logout logout-success-url="/user/login.action" logout-url="/securityLogout"/>
</http>
<beans:bean id="authenticationDispatcher" class="com.lstp.service.security.impl.LstpAuthenticationSuccessHandler">
<beans:property name="authDispatcherMap">
<beans:ref local="dispatcherMap"/>
</beans:property>
</beans:bean>
<beans:bean id="dispatcherMap" class="java.util.HashMap">
<beans:constructor-arg>
<beans:map>
<beans:entry key="ROLE_SPACE_ADMIN" value="/user/userSpace.action"/>
<beans:entry key="ROLE_SMALL_SPACE_ADMIN" value="/user/userSpace.action"/>
<beans:entry key="ROLE_INSTITUTION_MEMBER" value="/user/userSpace.action"/>
<beans:entry key="ROLE_SYSTEM_ADMIN" value="/admin/adminSpace.action"/>
<beans:entry key="ROLE_SUPER_ADMIN" value="/admin/adminSpace.action"/>
</beans:map>
</beans:constructor-arg>
</beans:bean>
authentication-success-handler-ref="authenticationDispatcher"是至关重要的,当登陆成功会调用实现AuthenticationSuccessHandler接口的onAuthenticationSuccess方法.
下面是实现类
Java代码
package com.lstp.service.security.impl;
import java.io.IOException;
import java.util.Collection;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.GrantedAuthorityImpl;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
import org.springframework.util.Assert;
/**
* 权限登录成功句柄
* 该类为平台成功跳转到多个入口提供依据
* @author ryuu-kk
*
*/
public class LstpAuthenticationSuccessHandler implements AuthenticationSuccessHandler {
/**
* url参数
*/
private Map<String, String> map;
/**
* 多role选择,默认取得权限表第一个权限
*/
private boolean isFirst = true;
@Override
public void onAuthenticationSuccess(HttpServletRequest request,
HttpServletResponse response, Authentication authentication)
throws IOException, ServletException {
Assert.notNull(map, "AuthInterceptMap is null!");
String url = "";
Collection<GrantedAuthority> authCollection = authentication.getAuthorities();
if (authCollection.isEmpty()) {
return;
}
//对于一个登录用户有多种角色,只取得第一个
if (isFirst) {
GrantedAuthority[] a = new GrantedAuthorityImpl[]{};
url = map.get(authCollection.toArray(a)[0].toString());
response.sendRedirect(request.getContextPath() + url);
return;
}
//选择取得最后一个role掉转;这里一个用户的多个角色较少
//迭代的速度比转换成数组的速度要快
for (GrantedAuthority auth : authCollection) {
url = map.get(auth.getAuthority());
}
response.sendRedirect(url);
}
/**
* 权限跳转依据
* @param map 参数
* key:url
* value:role
*/
public void setAuthDispatcherMap(Map<String, String> map) {
this.map = map;
}
/**
* 多种角色方案
* 设置是否只取得第一个role
* @param isFirst true:多种角色只取第一个,false:取得最后一个
*/
public void setMultipleAuth(boolean isFirst) {
this.isFirst = isFirst;
}
}
分享到:
相关推荐
其中,权限控制是Spring Security的一个重要组件,它允许开发者根据用户角色和权限来控制访问不同的资源。在本文中,我们将探讨如何使用Spring Security来实现URL地址的权限控制。 权限控制是指根据用户的角色和...
Spring Security 实践指南 Spring Security 是一个基于 Java 的安全框架,旨在提供身份验证、授权和访问控制等功能。下面是 Spring Security 的主要知识点: 一、身份验证(Authentication) 身份验证是指对用户...
让我们深入探讨Spring Security在处理角色和权限方面的一些关键概念。 1. **角色与权限基础** 在Spring Security中,"角色"是赋予用户的标识,表示用户在系统中的职责或权限集合。例如,"管理员"、"用户"等。"权限...
SpringSecurity是Java应用中广泛使用的安全框架,它提供了一种强大的方法来保护应用程序免受未经授权的访问和操作。本DEMO展示了如何将SpringSecurity与SSH(Spring、Struts2、Hibernate)集成,实现基于数据库的...
在SpringSecurity中,`<authentication-manager>`命名空间处理用户的认证逻辑。它可以包含`<authentication-provider>`元素,后者定义了认证提供者,如JDBCAuthenticationProvider或DaoAuthenticationProvider,用于...
**Spring Security 用户权限项目概述** Spring Security 是一个强大的安全框架,专为 Java 应用程序设计,用于处理身份验证和授权。在这个项目中,它被用来实现用户权限管理,确保只有授权的用户才能访问特定的资源...
Spring Security是Spring家族中的一个子项目,它为Web应用程序提供了全面的安全控制功能,包括认证(Authentication)、授权(Authorization)以及会话管理等。通过Spring Security,开发人员可以方便地为Web应用...
<security:authentication-provider user-service-ref="userDetailsService"> <security:password-encoder hash="bcrypt" /> </security:authentication-provider> </security:authentication-manager> <!-- ...
总结来说,Spring Security XML配置涉及到的主要知识点包括:`<http>`元素的设置、拦截URL的配置、`<authentication-manager>`和`<authentication-provider>`的使用、自定义登录表单的实现以及Spring MVC和Bootstrap...
Spring Security 是一个强大的和高度可定制的身份验证和访问控制框架,用于Java应用程序。它为Web应用和企业级应用提供安全解决方案,包括用户认证、权限控制、会话管理等多个方面。在Spring Security 3.1.2版本中,...
Spring Boot Security是一个强大的工具,它集成了Spring Security框架,使得在Spring Boot应用中实现安全控制变得简单高效。Spring Security是一个全面的、可高度定制的安全框架,适用于Java Web应用程序,包括认证...
3. **认证配置**:Spring Security通过`<authentication-manager>`元素管理用户认证。可以配置UserDetailsService接口实现自定义用户数据源,如下所示: ```xml <authentication-manager> <authentication-...
### Spring Security 安全权限管理手册知识点概览 #### 一、基础篇 **1. 一个简单的Hello World** - **1.1 配置过滤器** - 介绍如何在Spring Security中配置基本的过滤器,以实现对HTTP请求的基本拦截与控制。 - ...
- Spring Security提供了国际化的支持,可以根据用户语言环境显示不同的错误消息。 在"Spring Security安全权限管理手册-family168"中,读者将能够学习如何设置和配置Spring Security,以及如何解决常见的安全问题...
`spring-security-oauth2`提供了与`spring-security-web`的集成,使得资源服务器能够直接使用Spring Security的过滤链进行安全控制。 3. **ClientDetailsService**: 该服务接口用于存储和验证OAuth2客户端的信息,...
在本文中,我们将深入探讨如何在Spring Security 2.0版本中配置并使用AOP(面向切面编程)来实现方法级别的权限控制。首先,我们需要理解Spring Security的基础概念。 1. **Spring Security基本架构** Spring ...
`<authentication-manager>`用于配置认证管理器,`<user-service>`或自定义的`AuthenticationProvider`可以用来处理用户认证逻辑,`<access-denied-handler>`定义了权限不足时的处理策略。 `MyJdbcDaoImpl.java`...
本篇文章将深入探讨如何在Spring 3中整合Spring Security来实现权限控制,以保护你的应用程序免受非法访问。 首先,我们需要理解Spring Security的核心概念。它主要由四个部分组成:认证(Authentication)、授权...