`
清晨阳光
  • 浏览: 39027 次
  • 性别: 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  

相关推荐

    Struts 2使用注解配置Action

    Struts 2使用注解配置Action,不配置struts.xml,通过注解直接配置action

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

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

    struts2注解配置全面解析

    都被它莫名其妙的错误搞的郁闷,而网上关于这方面的东西大多都是基于struts2.0版本的,对我们现在用的2.1以上的版本不起什么作用,所以特整理出一份文档,里面详细说明了怎样用注解出配置struts2的action,...

    Struts2注解使用说明文档

    从struts2.1开始,struts2不再推荐使用Codebehind作为零配置插件,而是改为使用Convention插件来支持零配置,和Codebehind相比,Convention插件更彻底,该插件完全抛弃配置信息,不仅不需要是使用struts.xml文件进行...

    struts2注解详细说明

     基于注解的Action名• 基于注解的拦截机(Interceptor)• 基于注解的命名空间(Nameespace)• 基于注解的XWork包• 默认action以及默认的结果(比如:/products 将会尝试寻找com.example.actions.Products ...

    Struts2 in action中文版

    第1章 Struts 2:现代Web框架 2 1.1 Web应用程序:快速学习 2 1.1.1 构建Web应用程序 2 1.1.2 基础技术简介 3 1.1.3 深入研究 6 1.2 Web应用程序框架 7 1.2.1 什么是框架 7 1.2.2 为什么使用框架 8 1.3 Struts 2框架...

    Struts2使用注解实现文件的上传与下载

    使用struts2基于注解(零配置)实现的文件上传与下载的代码,可以正常运行

    struts2中使用注解配置Action方法详解

    主要介绍了struts2中使用注解配置Action方法详解,涉及一个示例,具有一定参考价值,需要的朋友可以了解下。

    struts2 使用注解现在零配置不需要在使用struts.xml配置文件,可以直接跑

    struts2 使用注解现在零配置不需要在使用struts.xml配置文件。 struts2 注解实例。可以直接跑

    struts2注解

    struts2 注解与Action相关的两个Annotation是@Action 和@Actions2)@Action中可指定一个value属性。类似于指定<action name=””/>属性值

    Struts2框架及注释和用法

    Struts2的框架及注释和使用法,希望大家支持,我们一起努力,谢谢!

    struts2demo全注解

    struts2将请求在Action中封装为Map并将配置文件放到web-info中还可以自定义配置文件位置就是不将struts.xml放到src下但还是不如spring mvc 的封装来得方便

    Struts2注解

    Struts2直接使用注解的详细配置action 去掉Struts.xml 省去多余的代码 让代码更直观

    Struts2注解+JDBC+MySQL小项目应用

    // 2. taglib标识传递 resultMsg = "注册成功"; return "registerSuccess"; } else { resultMsg = "注册失败"; return "registerFailure"; } } } // 登录 @Action("login") public String login() { ...

    struts2 in action

    《Struts 2实战》结合实例介绍了Struts 2框架,主要内容包括Action、Result、Interceptor等框架组件,基于注解的配置选项等新特征,Struts 2插件 FreeMarker,如何从Struts 1和WebWork 2迁移到Struts 2,Ajax标签、...

    struts2和spring3注解整合问题

    求有爱的大大帮忙解决一下strut2和sprin3注解找不到action的问题

    struts2 + spring + mybatis 注解开发

    struts2+Spring3.0+Mybatis组合框架开发,可以正常的运行,其中使用spring注解方式管理action

    SSH框架搭建成功例子(注解方式,Struts2自身创建Action)

    使用的是注解的方式完成的,因为注解的方式可以减少一些配置文件,比较方便的。 【特别强调】一定要清楚如何调试项目,因为自己的环境和下载的资源的环境可能不一样,需要修改配置文件或是其他才能正常运行。...

    SSH框架注解方式,struts自身创建Action

    SSH框架,下载后导入即可用,不是Maven项目,ssh框架中的action的创建时struts2自己完成的。

    Struts2实战.pdf

    《Struts 2实战》结合实例介绍了Struts 2框架,主要内容包括Action、Result、Interceptor等框架组件,基于注解的配置选项等新特征,Struts 2插件 FreeMarker,如何从Struts 1和WebWork 2迁移到Struts 2,Ajax标签、...

Global site tag (gtag.js) - Google Analytics