`

Struts2中基于Annotation的细粒度权限控制

阅读更多
      权限控制是保护系统安全运行很重要的一扇门。在web应用里,仅仅隐藏url是不够的。由于web应用是以请求/响应为单位的,我 们的权限控制的粒度只有达到这个程度才能让全国人民放心。在java web开发的世界里,MVC框架的使用再平常不过,大都是将请求拦截后,控制器根据配置文件将请求转给某个函数来处理。下面看看在struts2中我们可 以用的几种方案:

      1、在每个函数里进行权限校验

      这主意实在是简单,缺点我就不说了~太多了~

      2、在每个请求对应的Action的配置项里配置参数,用以标示访问此Action需要的权限,再用拦截器处理

      以 前我这么做过,比方案1好很多,不过这注定你无法实现ZeroConfig。在ROR的促进下,约定优于配置渐渐深入人心。本人就极其反感大量的配置文 件。但是由于权限配置提到XML里配置,最大的好处就是我不必重新编译代码就能改变权限关联。不过情况下遇到需求变更,你会有一种宁可去改代码的冲动。

      3、结合Java的Annotation和Struts2的拦截器控制权限

      下面是上午没事写的一个示例:访问login.jsp,登录,功能有eat和drink,用户登陆后只能访问已授权的功能链接。

      基本思想:对每个Action方法进行注解,并注入一个资源字符串,部署一个拦截器,在每个请求之前拦截一下,通过反射拿到所调用的方法及其注解,依此来进行权限校验。

      优点:

      简单、可行性高

      不修改MVC框架配置文件

      不影响Action内的业务逻辑

      注解的原则之一就是不影响代码的运行,这也实现了本方案的可插拔性、独立性高

      更高的可配置性

      缺点:

      不知道对性能影响如何

      代码基本上都贴到下面了,不想细讲了,有兴趣的可以留言讨论,觉得我火星的就不要拍砖了,有需要eclipse工程源码的发邮件问我要shoru#163.com。



      (1)Annotation相关

Access

1package com.shoru.access;

2

3import java.lang.annotation.ElementType;

4import java.lang.annotation.Retention;

5import java.lang.annotation.RetentionPolicy;

6import java.lang.annotation.Target;

7

8/** *//**

9 * 访问控制注解

10 * 该注解保留到运行时,针对方法使用,默认为BLOCK

11 * @author Shoru

12 * @version 0.1

13 */

14@Retention(RetentionPolicy.RUNTIME)

15@Target(ElementType.METHOD)

16public @interface Access {

17    String[] value() default { AccessOption.BLOCK };

18}



AccessOption

1package com.shoru.access;

2

3/** *//**

4 * 访问控制接口,定义默认的控制常量

5 * @author Shoru

6 * @version 0.1

7 */

8public interface AccessOption {

9    /** *//**

10     * 拦截访问

11     */

12    public static String BLOCK="block";

13    /** *//**

14     * 通过访问

15     */

16    public static String PASS="pass";

17    /** *//**

18     * 要求登录

19     */

20    public static String LOGIN="login";

21}



UserAccessOption

1package com.shoru.access;

2

3

4/** *//**

5 * 用户自定义控制接口,继承自AccessOption

6 * 可将系统权限全部定义到此处,格式为:权限名=资源名

7 * @author Shoru

8 * @see AccessOption

9 */

10public interface UserAccessOption extends AccessOption {

11    public static String EAT = "eat";

12    public static String DRINK = "drink";

13}


      (2)Action类

AccessAction

1package com.shoru.access.action;

2

3import java.util.ArrayList;

4import java.util.List;

5

6import com.opensymphony.xwork2.Action;

7import com.opensymphony.xwork2.ActionContext;

8import com.shoru.access.Access;

9import com.shoru.access.UserAccessOption;

10

11public class AccessAction implements Action {

12    @Access

13    public String execute() throws Exception {

14        return SUCCESS;

15    }

16

17    @Access(UserAccessOption.PASS)

18    public String index() throws Exception {

19        /**//*

20         * 此处模拟权限的获取

21         */

22        List<String> accessPoints = new ArrayList<String>();

23        /**//*

24         * 赋予eat权限

25         */

26        accessPoints.add("eat");

27        ActionContext.getContext().getSession().put("access", accessPoints);

28        return SUCCESS;

29    }

30

31    @Access(UserAccessOption.DRINK)

32    public String drink() throws Exception {

33        return SUCCESS;

34    }

35

36    @Access( { UserAccessOption.EAT })

37    public String eat() throws Exception {

38        return SUCCESS;

39    }

40}


      (3)拦截器

AccessInterceptor

1package com.shoru.access.interceptor;

2

3import java.lang.annotation.Annotation;

4import java.lang.reflect.Method;

5import java.util.List;

6

7import com.opensymphony.xwork2.ActionContext;

8import com.opensymphony.xwork2.ActionInvocation;

9import com.opensymphony.xwork2.interceptor.Interceptor;

10import com.opensymphony.xwork2.util.AnnotationUtils;

11import com.shoru.access.Access;

12import com.shoru.access.AccessOption;

13

14public class AccessInterceptor implements Interceptor {

15

16    private static final long serialVersionUID = -1066389312400000758L;

17

18    List<String> accessPoints = null;

19

20    public void init() {

21

22    }

23

24    public void destroy() {

25        accessPoints = null;

26    }

27

28    public String intercept(ActionInvocation invocation) throws Exception {

29        if (accessPoints == null) {

30            /**//*

31             * 获取权限列表

32             */

33            accessPoints = (List<String>) ActionContext.getContext()

34                    .getSession().get("access");

35        }

36        /**//*

37         * 获取此次调用的方法名

38         */

39        String method = invocation.getProxy().getMethod();

40        /**//*

41         * 获取所有已注解方法

42         */

43        List<Method> methods = AnnotationUtils.findAnnotatedMethods(invocation

44                .getAction().getClass(), Access.class);

45        /**//*

46         * 迭代所有已注解方法

47         */

48        for (Method m : methods) {

49            if (m.getName().equals(method)) {

50                /**//*

51                 * 获取被调用方法的注解

52                 */

53                Annotation annotation = m.getAnnotation(Access.class);

54                /**//*

55                 * 放过不需要校验权限列表的请求,e.g.登录、验证码

56                 */

57                for (String s : ((Access) annotation).value()) {

58                    if (s.equals(AccessOption.PASS)) {

59                        return invocation.invoke();

60                    }

61                }

62                /**//*

63                 * 权限列表为空,返回登录

64                 */

65                if (accessPoints == null) {

66                    return AccessOption.LOGIN;

67                }

68                /**//*

69                 * 迭代方法注解里的值,判断是否存在于权限列表中

70                 */

71                for (String s : ((Access) annotation).value()) {

72                    if (accessPoints.indexOf(s) != -1) {

73                        /**//*

74                         * 权限校验通过

75                         */

76                        return invocation.invoke();

77                    }

78                }

79            }

80        }

81        /**//*

82         * 没有对方法进行注解或者权限校验不通过,拦截此次请求

83         */

84        return AccessOption.BLOCK;

85    }

86}

      (4)struts.xml

struts.xml

1<?xml version="1.0" encoding="UTF-8"?>

2<!DOCTYPE struts PUBLIC

3    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

4    "http://struts.apache.org/dtds/struts-2.0.dtd">

5<struts>

6    <package name="access" extends="struts-default">

7        <interceptors>

8            <!-- 权限拦截器 -->

9            <interceptor name="access"

10                class="com.shoru.access.interceptor.AccessInterceptor"></interceptor>

11            <interceptor-stack name="my-default">

12                <interceptor-ref name="access"></interceptor-ref>

13                <interceptor-ref name="defaultStack"></interceptor-ref>

14            </interceptor-stack>

15        </interceptors>

16        <default-interceptor-ref name="my-default"></default-interceptor-ref>

17        <global-results>

18            <result name="block">/login.jsp</result>

19            <result name="login">/login.jsp</result>

20        </global-results>

21        <!-- Zero Config All Actions -->

22        <action name="*" class="com.shoru.access.action.AccessAction"

23            method="{1}">

24            <result>/{1}.jsp</result>

25        </action>

26    </package>

27</struts>
分享到:
评论

相关推荐

    权限管理 struts2 hiberante3.5 spring3.0 annotation

    Spring Security(前身为Acegi Security)是Spring生态系统中的一个强大安全框架,支持细粒度的权限控制。在Spring中,我们可以使用`@Secured`或`@PreAuthorize`等注解在方法级别上进行权限检查。此外,Spring的事务...

    SSH权限拦截系统

    SSH权限拦截系统是一种基于SSH(Spring、Struts2和Hibernate)技术栈构建的权限管理解决方案。SSH是Java Web开发中的经典组合,它提供了强大的模型-视图-控制器(MVC)架构支持,数据库操作能力以及面向切面编程...

    SSI框架+权限(Oracle)

    Spring框架提供了Security模块,可以用来处理这些问题,实现细粒度的访问控制。开发者可能需要定义安全规则,创建自定义权限服务,并与Struts1的ActionFilter或拦截器结合,以确保只有拥有相应权限的用户才能访问...

    WinCC嵌入式Excel报表系统:实现高效自动化报表生成与数据分析

    内容概要:本文详细介绍了WinCC嵌入式Excel报表系统的功能和优势。该系统利用VBS脚本和Excel模板相结合的方式,能够直接从WinCC变量归档库读取数据并生成高质量的报表。文中展示了多种实用的技术细节,如数据质量校验、不同数据处理模式(实时值、平均值、累计值)、模板机制、报表控件集成以及条件格式的应用。此外,还提供了具体的代码示例来解释如何实现这些功能。 适用人群:适用于从事工业控制系统开发、维护的技术人员,尤其是那些需要频繁处理报表任务的人群。 使用场景及目标:主要应用于需要快速生成各类生产数据报表的场合,如日报表、月报表等。通过该系统可以极大提高工作效率,减少人工干预,确保数据准确性,并且降低了学习成本和技术门槛。 其他说明:该系统不仅支持多版本兼容,而且移植性强,能够在不同的WinCC环境中轻松部署。同时,它还允许用户通过简单的Excel模板修改来自定义报表格式,满足多样化的业务需求。

    【信息安全领域】实战项目:渗透测试与漏洞利用技术详解及权限提升方案设计介绍了信息安全领域的一个

    内容概要:本文档《信息安全领域实战项目.docx》详细介绍了网络安全渗透测试的具体步骤和实战案例。文档从信息收集开始,逐步深入到漏洞验证、漏洞攻击和权限提升等环节。首先,通过使用工具如FOFA进行资产收集,识别出目标服务器开放的多个端口,并进一步通过后台扫描工具发现潜在的敏感文件。接着,针对发现的Grafana任意文件读取漏洞(CVE-2021-43798)和ActiveMQ任意文件上传漏洞(CVE-2016-3088),分别进行了详细的漏洞验证与攻击演示,包括具体的payload构造、利用方式及攻击效果展示。最后,探讨了CVE-2021-4034 Linux polkit提权漏洞的应用场景及其利用方法。此外,文档还涵盖了政务智慧信息系统安全建设项目的背景、目标、建设内容以及相关的人才需求分析。 适合人群:具备一定网络安全基础,尤其是对渗透测试感兴趣的初学者或中级技术人员。 使用场景及目标:①帮助读者理解并掌握从信息收集到漏洞利用的完整渗透测试流程;②提供实际操作案例,使读者能够学习如何识别和利用常见的Web应用漏洞;③培养读者在面对真实世界的安全问题时,能够运用所学知识进行有效的分析和解决。 阅读建议:由于文档内容涉及较多的技术细节和实战操作,建议读者在阅读过程中结合实际环境进行练习,并参考官方文档或其他权威资料加深理解。同时,注意合法合规地使用所学技能,确保所有活动都在授权范围内进行。

    电动汽车动力系统仿真的关键技术:双向DCDC变换器与电机控制策略

    内容概要:本文详细介绍了电动汽车动力系统的仿真技术,涵盖双向DCDC变换器的能量反馈机制和支持异步电机与永磁同步电机的仿真。文中展示了多个关键控制策略,如电流环控制、最大转矩电流比(MTPA)控制、弱磁控制以及基于事件触发的协调控制。通过MATLAB、Python和C等多种编程语言的具体代码实例,解释了如何实现高效的能量管理和电机控制。此外,文章还讨论了仿真过程中遇到的实际问题及其解决方案,如电压过冲、电流振荡和系统耦合等问题。 适合人群:从事电动汽车研究与开发的技术人员、高校相关专业师生、对电动汽车动力系统感兴趣的工程师。 使用场景及目标:适用于电动汽车动力系统的设计与优化,帮助工程师理解和掌握双向DCDC变换器的工作原理及电机控制策略,提高能量利用效率,确保系统稳定性。 其他说明:文章不仅提供了详细的理论和技术背景,还分享了许多实践经验,有助于读者更好地将理论应用于实际项目中。

    石油工程中基于深度学习的FracPredictor裂缝建模与压裂模拟技术解析

    内容概要:本文详细介绍了FracPredictor这一基于深度学习的裂缝预测工具及其应用。首先探讨了数据处理部分,如利用滑窗处理时序+空间特征混合体的方法,以及如何将岩石力学数据转换为适合神经网络的格式。接着深入剖析了模型架构,包括时空双流网络、注意力机制用于跨模态融合、HybridResBlock自定义层等创新设计。此外,文章还分享了训练技巧,如渐进式学习率衰减、CosineAnnealingWarmRestarts调度器的应用。对于可视化方面,则推荐使用PyVista进行三维渲染,以直观展示裂缝扩展过程。文中还提到了一些实用的小技巧,如数据预处理中的自动标准化、配置文件参数调整、以及针对特定地质条件的优化措施。最后,通过多个实际案例展示了FracPredictor在提高预测准确性、降低计算成本方面的优势。 适合人群:从事石油工程、地质勘探领域的研究人员和技术人员,尤其是对裂缝建模与压裂模拟感兴趣的从业者。 使用场景及目标:适用于需要高效、精准地进行裂缝预测和压裂模拟的工程项目。主要目标是帮助用户掌握FracPredictor的工作原理,学会从数据准备到结果可视化的完整流程,从而优化压裂方案,减少工程风险。 其他说明:文章不仅提供了详细的代码示例,还附带了丰富的实战经验和注意事项,有助于读者更好地理解和应用这项新技术。

    multiSIM视频教程-电路创建和基本功能测试.zip

    multisim

    基于ssm的房产中介信息管理系统(源码+数据库)135

    基于ssm的房产中介信息管理系统:前端 html、jquery、layui,后端 maven、springmvc、spring、mybatis;角色分为管理员、员工;集成卖家信息,买家信息,房屋管理等功能于一体的系统。 ## 功能介绍 - 用户管理:用户信息的增删改查,按用户名搜素 - 通知公告:公告信息的增删改查,关键词搜索 - 卖家信息:卖家信息的增删改查,关键词搜索 - 买家信息:买家信息的增删改查,关键词搜索 - 房屋管理:房屋信息的增删改查,按小区名称搜索,房屋图片上传 - 房屋搜索:房屋列表查询,查询满足条件的房屋信息 ## 环境 - <b>IntelliJ IDEA 2021.3</b> - <b>Mysql 5.7.26</b> - <b>Tomcat 7.0.73</b> - <b>JDK 1.8</b>

    基于ssm的学生资助管理系统(源码+数据库)147

    基于ssm的学生资助管理系统:前端 jsp、jquery,后端 springmvc、spring、mybatis;角色分为:管理员、学生;集成OA流程管理、贫困生认定、奖学金管理等功能于一体的系统。 ## 功能介绍 - 系统管理:权限管理,菜单管理,在线管理,日志管理,系统用户管理 - OA流程管理:工作流程(模型管理,流程管理,运行中流程,历史的流程),任务管理,消息管理 - 贫困生认定管理:贫困生认定申请,申请材料审核,上报院校审批 - 国家助学金管理:国家助学金申请,申请材料审核,上报院校审批 - 勤工俭学管理:学生基本信息,勤工岗位信息,学生勤工信息 - 公告管理:公告信息的增删改查 ## 环境 - <b>IntelliJ IDEA 2021.3</b> - <b>Mysql 5.7.26</b> - <b>Tomcat 7.0.73</b> - <b>JDK 1.8</b>

    芬朗A12U电脑调音软件是专为音响爱好者和专业人士设计的一款强大工具,喜欢的话,直接下载吧

    芬朗A12U电脑调音软件是专为音响爱好者和专业人士设计的一款强大工具,喜欢的话,直接下载吧

    基于ssm的学生成绩管理系统(源码+数据库)206

    基于ssm的学生成绩管理系统:前端 jsp、jquery、bootstrap,后端 maven、springmvc、spring、mybatis;角色分为管理员、学生;集成用户管理,成绩管理,公告管理等功能于一体的系统。 ## 功能介绍 - 基本功能:登录,注册,退出,密码修改 - 用户管理:用户信息的增删改查,用户也可以由学生自行注册,管理员可以修改和删除用户信息,学生只能操作自己的信息 - 成绩管理:管理员对成绩信息的增删改查,学生只能查询 - 公告管理:管理员对公告信息的增删改查,学生只能查看 ## 环境 - <b>IntelliJ IDEA 2021.3</b> - <b>Mysql 5.7.26</b> - <b>Tomcat 7.0.73</b> - <b>JDK 1.8</b>

    深度学习基于PyTorch的快速轻量级通道注意力机制(FFCM):EfficientNet模型改进与应用

    内容概要:本文介绍了一种快速轻量级的通道注意力机制(FFCM),并通过修改MBConv模块将其应用于EfficientNet模型中。FFCM由局部通道交互和全局通道交互两部分组成。局部通道交互通过深度可分离卷积实现,全局通道交互则采用全局平均池化和两个卷积层来减少通道维度并恢复。为了将FFCM集成到MBConv模块中,定义了`add_ffcm_to_mbconv`函数,该函数在MBConv模块的前向传播过程中插入FFCM模块。最后,通过`create_model`函数创建了一个带有FFCM的EfficientNet模型,并修改了分类头以适应不同的类别数量。代码还展示了如何加载预训练权重以及模型的测试输出。; 适合人群:对深度学习有一定了解,特别是熟悉卷积神经网络和注意力机制的研究人员或工程师。; 使用场景及目标:①理解快速轻量级通道注意力机制(FFCM)的设计思路及其在卷积神经网络中的应用;②掌握如何修改现有的卷

    社交媒体-短视频发布-用户互动-测试平台-1744736861.zip

    社交媒体_短视频发布_用户互动_测试平台_1744736861.zip

    油气田开发中CO2驱水的二阶PDE两相流模拟及COMSOL应用

    内容概要:本文详细介绍了使用COMSOL进行CO2驱水的二阶偏微分方程(PDE)两相流模拟的方法和技术细节。主要内容涵盖核心控制方程(如达西定律和质量守恒方程)、相对渗透率模型的选择(如Corey模型和Brooks-Corey模型)、边界条件的设置、求解器配置以及后处理技巧。文中强调了超负压驱替现象的模拟及其重要性,并提供了多个具体的操作实例和优化建议,确保模型的稳定性和准确性。 适合人群:从事油气田开发、碳捕集与利用封存(CCUS)研究的专业技术人员,以及对多物理场耦合仿真感兴趣的科研人员。 使用场景及目标:适用于油气田开发过程中CO2驱水模拟的研究项目,旨在提高采收率并评估碳封存效果。主要目标是通过精确的数学模型和高效的数值方法,模拟CO2和水在孔隙介质中的动态交互过程,从而优化注入策略和预测驱替效果。 其他说明:文中提供的MATLAB代码片段和COMSOL操作指南有助于读者快速上手实践。同时,文章还讨论了常见的数值问题及其解决方案,如数值震荡、模型发散等,帮助读者规避常见错误并提高模拟的成功率。

    基于COMSOL的地应力平衡与隧道开挖及衬砌支护仿真技术详解

    内容概要:本文详细介绍了使用COMSOL进行隧道开挖及衬砌支护仿真的全过程,涵盖地应力平衡、开挖模拟、衬砌支护等关键技术环节。首先强调了地应力平衡的重要性,包括重力补偿、初始应力场设置等。接着阐述了开挖模拟的具体方法,如材料切换、几何非线性选项的应用。然后讲解了衬砌支护的实施细节,涉及壳接口创建、接触条件设置等。最后讨论了分步求解策略以及常见问题的解决方案,如应力奇点处理、网格优化等。 适合人群:从事岩土工程仿真、隧道工程施工及相关领域的工程师和技术人员。 使用场景及目标:适用于需要进行隧道开挖及支护仿真的工程项目,旨在帮助用户掌握COMSOL软件在此类应用中的具体操作方法,提高仿真精度和效率。 其他说明:文中提供了大量实用技巧和注意事项,如参数设置、代码片段等,有助于读者更好地理解和应用相关技术。同时提醒读者关注实际项目的具体情况,灵活调整参数以获得最优结果。

    C++与OpenCV实现高效工业检测模板匹配框架:支持多形态ROI与并行加速

    内容概要:本文详细介绍了作者使用C++和OpenCV构建的一个高效的模板匹配框架,适用于工业检测场景。该框架支持创建带有旋转角度的矩形ROI、圆形ROI以及环形ROI,并提供了手绘屏蔽功能来提高模板制作的灵活性。为了加快匹配速度,采用了多尺度金字塔加速、并行计算和亚像素级定位优化等技术手段。此外,文中还分享了一些实际应用案例和技术难点解决方案,如硬币分类计数、PCB板元件计数等。 适合人群:有一定C++和OpenCV基础,从事机器视觉或工业自动化相关领域的工程师。 使用场景及目标:①用于工业生产线上的物体检测与分类;②提高模板匹配的速度和准确性;③解决复杂背景下目标识别的问题。 其他说明:文中不仅展示了具体的代码实现,还讨论了许多实践经验,包括性能优化技巧、常见错误及其规避方法等。对于希望深入了解模板匹配算法并在实际项目中应用的人来说非常有价值。

    分享一个快速执行脚本的工具OneClicker 最新版

    工作的时候,有很多琐碎的事情需要重复的做 比如打开某个文件,打开某个网站,打开某个软件 这个时候可以写个自动脚本,把机械琐碎的事情交给脚本处理 但是脚本一多,不好管理,而且要选择哪个脚本也是个麻烦的事情 所以写了OneClicker,快捷键呼出脚本的管理界面,脚本也绑定快捷键 在任何一个地方,只要按两三个按键,就可以执行某个脚本,处理掉琐碎事情 使用的流程 配置 1、function文件夹加上批处理脚本 2、运行软件OneClicker.exe 3、配置脚本的快捷键 使用 1、按Ctrl + K,弹出界面 2、再按脚本的快捷键,注意输入法是要英文的 例子:打开百度:先按Ctrl + K,再按B 关闭 1、点解界面右上角的关闭按钮,不会退出软件,只是最小化到托盘 2、想要退出软件,可以在任务栏或者托盘右键关闭

    基于MATLAB的心音信号自适应滤波降噪:LMS、NLMS、变步长LMS及RLS算法的应用

    内容概要:本文详细介绍了基于MATLAB实现的多种自适应滤波算法用于心音信号降噪的方法和技术。首先阐述了LMS(最小均方)算法的基本原理及其简单实现,接着讨论了归一化LMS(NLMS)、变步长LMS两种改进版本的特点和优势,并提供了相应的Matlab代码示例。最后深入探讨了RLS(递归最小二乘法)算法,在理论层面解释了其为何能在降噪效果上超越前两者,并附上了完整的代码实现。文中还给出了具体的实验数据对比,展示了各算法在不同条件下的性能差异。 适用人群:从事生物医学信号处理的研究人员、工程师以及对自适应滤波感兴趣的高校师生。 使用场景及目标:适用于需要对心音信号进行高质量降噪处理的实际应用场景,如临床诊断辅助设备的研发;同时也可以作为教学材料帮助学生理解自适应滤波的工作机制。 其他说明:文中不仅提供了详细的算法解析,还包括了许多实用的经验分享和技术细节提示,有助于读者更好地掌握并应用于实践中。此外,作者还强调了一些常见的误区和注意事项,提醒使用者避免不必要的错误。

    基于ssm+jsp的虚拟商品管理系统(源码+数据库)241

    基于ssm+jsp的虚拟商品管理系统:前端 jsp、jquery,后端 maven、springmvc、spring、mybatis;角色分为管理员、用户;集成促销商品、商品购买、购物车、订单查询等功能于一体的系统。 ## 环境 - <b>IntelliJ IDEA 2021.3</b> - <b>Mysql 5.7.26</b> - <b>Tomcat 7.0.73</b> - <b>JDK 1.8</b>

Global site tag (gtag.js) - Google Analytics