`
清晨阳光
  • 浏览: 39607 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

Struts2注解Action方法安全

阅读更多

用过Spring Security的朋友一定不会陌生,有个@Secured注解,可以将其加在Service层的方法上,保护某个方法的安全,确保只有授权的角色可以调用该方法。

 

但是,如果要对Struts2的Action方法进行保护呢?看似加注解是个不合理的需求。但是,有些情况下,例如,一个命名空间下用星号匹配有多个角色,而用精确地址匹配又导致数据太多,数据库不太好维护。在这种情况下,如果一个Action地址,确定以后不会太更换访问角色的话,可以考虑用注解来保护。

 

可以将命名空间下的全部地址匹配为星号。然后用注解保护该命名空间下的个别Action地址。

 

首先是一个注解类。

@Target(METHOD)
@Retention(RUNTIME)
public @interface ActionRoles {

	SysRole[] value();
}

 

注解里面是一个枚举类,代表了系统的所有角色枚举。

然后是Struts2的拦截器,在该拦截器内,通过反射,得到加在Action方法注解上的用户角色数组。其中,还通过SpringSecurityUtils取得当前登录的用户,并拿到登录用户的角色,通过和actionRoles循环比较,得到用户是否有授权。

public class AuthorityInterceptor extends MethodFilterInterceptor {

	private static final long serialVersionUID = -1070565846576510701L;

	@Override
	protected String doIntercept(ActionInvocation actionInvocation) throws Exception {
		User currentUser = SpringSecurityUtils.getCurrentUser();
		if (currentUser != null) {
			try {
				Object action = actionInvocation.getAction();
				ActionProxy actionProxy = actionInvocation.getProxy();
				Method method = action.getClass().getMethod(actionProxy.getMethod());
				ActionRoles actionRoles = method.getAnnotation(ActionRoles.class);
				if (actionRoles != null) {
					boolean authorized = false;
					SysRole[] sysRoles = actionRoles.value();
					for (SysRole sysRole : sysRoles) {
						if (SysRole.equals(currentUser.getRoleName(), sysRole)) {
							authorized = true;
							break;
						}
					}
					if (!authorized) {
						return BaseActionSupport.UNAUTHORIZED;
					}
				}
			} catch (NoSuchMethodException e) {
				e.printStackTrace();
			} catch (SecurityException e) {
				e.printStackTrace();
			}
		}
		return actionInvocation.invoke();
	}
}
 

最后一步,很简单啦,在Struts2的Action方法上面加上注解。

@ActionRoles({SysRole.ROLE_ADMIN, SysRole.ROLE_USER})
public String execute() throws Exception {
	return SUCCESS;
}
 

到此,大功告成。还需要简单的配置一下拦截器,这个就不写了。还要注意,需要有一个全局结果页面,用以展示“未经授权”。我的BaseActionSupport.UNAUTHORIZED是转跳到403.jsp页面的。

0
0
分享到:
评论
1 楼 ZMC330 2013-04-18  

相关推荐

    struts2注解登陆

    例如,`@Action`注解用于标记一个方法为Struts2的动作,这个方法将在用户请求时被调用。`@Results`注解用于定义多个可能的结果,即用户请求后可能重定向或转发到的页面。`@Namespace`注解则用于定义动作的命名空间,...

    Struts 2使用注解配置Action

    1. `@Action`: 这是Struts 2中最核心的注解,用于标记一个方法为处理请求的Action。你可以指定Action的名字、结果页面和其他属性。例如: ```java @Action(value = "myAction", results = { @Result(name = ...

    Struts2 注解 Demo

    本教程将通过一个"Struts2注解Demo"来深入探讨Struts2中的注解用法,帮助开发者更高效地配置和管理Action类。 首先,Struts2的注解允许我们避免传统的XML配置,从而实现更加简洁、直观的编程方式。在`Struts2Demo`...

    Struts2注解开发jar

    在Struts2框架中,注解开发是一种简化配置的方式,它允许开发者在类或方法级别直接标注,以定义动作、结果、参数等信息,从而减少XML配置文件的使用。本知识点将详细介绍Struts2中的注解开发及其核心组件。 标题...

    Maven实现struts2注解

    <constant name="struts.objectFactory" value="struts注解工厂类全限定名,比如:org.apache.struts2.spring.StrutsSpringObjectFactory" /> <package name="default" extends="struts-default"> ...

    struts2注解详解

    ### Struts2 注解详解 #### 一、Struts2 Convention 插件介绍与使用 在 Struts2 框架的发展过程中,随着版本的更新和技术的演进,其配置方式也发生了变化。从 Struts2.1 版本开始,官方不再推荐使用 Codebehind ...

    struts2注解必须包

    "struts2注解必须包"指的是Struts2提供的一系列注解,它们对于简化Struts2应用的配置和增强其功能至关重要。 标题中的"struts2-convention-plugin-2.1.8.1.jar"是Struts2的约定插件(Convention Plugin)的一个特定...

    Struts2注解详细说明文档

    Struts2 Convention Plugin允许开发者通过注解来配置Action名称、拦截器、命名空间等,极大地简化了配置过程。 ##### 2.7 默认Action及结果 当用户访问特定路径时,如果没有显式定义Action,则Convention Plugin会...

    struts2注解配置Action及拦截器几种不同方式写法对应的路径指向.docx

    "Struts2 注解配置 Action 及拦截器几种不同方式写法对应的路径指向" Struts2 注解配置 Action 及拦截器是 Struts2 框架中的核心组件之一,负责处理用户请求并返回响应结果。下面,我们将通过详细的解释和示例代码...

    Struts2+spring注解配置

    Struts2 提供了一种使用注解替代 XML 配置的方式,使得开发者无需编写繁琐的 struts.xml 文件,即可完成Action的配置。 **Struts2 注解配置** 1. **Action 注解** - `@Action` 用于标记一个类或方法作为 Struts2 ...

    struts2注解配置全面解析

    本文旨在为读者提供一套详尽的Struts2注解配置指南,帮助大家快速理解和掌握如何通过注解来配置Struts2的Action。 #### 二、Struts2注解配置基础 ##### 1. Struts2注解支持概述 - **插件依赖**:要启用Struts2的...

    struts2注解小实例

    1. `@Action`: 这个注解用于标记一个方法作为Struts2的动作方法。比如: ```java @Action(value = "myAction") public String execute() { // Action logic here } ``` 这里的`value`属性定义了动作的URL,...

    Struts2注解使用说明文档

    Struts2 是一个流行的Java Web框架,用于构建MVC(模型-视图-控制器)架构的应用程序。在Struts2的版本2.1之后,它引入...例如,可以使用Struts2的注解(如`@Action`,`@Result`等)来覆盖或补充Convention的默认行为。

    struts2注解配置

    Struts2注解配置是Java Web开发中一种高效、简洁的框架配置方式,它允许开发者在类或方法级别上直接定义Action、结果类型、参数映射等信息,从而避免了传统XML配置文件的繁琐。本资料集合了关于Struts2注解配置的...

    Struts2全注解方式实现文件上传与下载

    Struts2允许开发者使用注解来配置Action类,而不是传统的XML配置文件。这种注解驱动的方式使得代码更加简洁,易于维护。例如,我们可以使用`@Action`注解标记一个方法作为处理请求的入口,`@Result`注解则可以定义...

    struts2利用注解annotation实现文件下载

    ### Struts2 使用注解(Annotation)实现文件下载 在Web开发中,文件上传与下载是常见的需求之一。Struts2框架提供了强大的功能来支持这一需求。本文将详细介绍如何使用Struts2框架结合注解(Annotation)的方式...

    Struts2注解配置教程

    本文档是对Struts2注解配置教程的知识点概述,详细介绍了Struts2中注解配置的使用方法和优势,帮助开发者掌握如何通过Java注解简化和优化Struts2框架的配置过程。通过零配置概念,减少XML配置的复杂度,使得代码更加...

    maven整合struts2全注解

    2. Struts2:是基于MVC设计模式的Java Web框架,它提供了一种处理HTTP请求并将其映射到特定Action的方法。Struts2支持多种方式来配置,包括XML配置和注解配置。 3. 全注解:全注解配置意味着我们不再需要编写大量的...

    Struts2之Annotation注解配置使用案例struts013

    在Struts2中,Annotation注解的引入为开发者提供了更加灵活和便捷的配置方式,使得无需在XML配置文件中进行繁琐的设置,可以直接在类或方法上通过注解来进行配置。本文将深入探讨Struts2中的Annotation配置,以及...

    Struts2.3.4.1 注解实例(二十)

    在Struts2中,注解可以用于Action类、方法、参数、结果配置等,减少了XML配置文件的依赖,使代码更易于理解和维护。 1. **Action类注解**: `@Action` 注解用于标记一个类为Struts2的Action,它可以替代struts.xml...

Global site tag (gtag.js) - Google Analytics