`
javaeyetodj
  • 浏览: 432505 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

springmvc 权限设计(转)

 
阅读更多

转自 http://www.open-open.com/lib/view/open1358472021196.html

 

简介

本文介绍一种采用annotation来对spring-mvc进行权限控制的方法. 通过枚举类来定义权限项. 将annotation标注到需要控制权限的spring-mvc方法上. 然后,在spring-mvc中定义全局过滤器, 过滤所有spring-mvc方法, 查看方法上的权限annotation信息, 以此对权限进行控制.

优点

编写比较方便, 在需要控制权限的方法上进行annotation的标注即可, ide能够对annotation进行识别支持. 查看权限配置比较方便, 因为annotation就在方法上, 不用去其他地方翻看. 实现方式比较简单.

具体实现

1.建立权限枚举类

建立权限枚举类型, 用于描述权限的种类, 包含了权限的名称. 每个枚举值中包含了权限中文名称和权限索引值(即权限位). (思考:是否可以直接用中文名称作为枚举值的名称,我在其他程序已经用了中文枚举名称了,暂时没有遇到问题)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public enum AuthorityType{
// 包含了枚举的中文名称, 枚举的索引值
WORKER("增删改查员工"1),
 
SALES_ORDER_CREATE("创建订单"6),
SALES_ORDER_FIND("查看订单"7),
SALES_ORDER_MODIFY("修改订单"8),
SALES_ORDER_DELETE("删除订单"9),
;
private String name;
private int index;
 
private AuthorityType(String name, int index) {
    this.name = name;
    this.index = index;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public int getIndex() {
    return index;
}
public void setIndex(int index) {
    this.index = index;
}
}

2.登录方式的枚举类

登录方式的枚举类, page代表传统登录页面, json表示ajax的登录

1
2
3
4
5
6
public enum ResultTypeEnum {
//整页刷新
page,
//json数据
json
}

3.建立表示权限annotation类

建立annotation类, 用于标注到需要权限验证的地方

1
2
3
4
5
6
7
8
9
10
11
12
13
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
 
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface FireAuthority {
    AuthorityType[] authorityTypes();
    ResultTypeEnum resultType() default ResultTypeEnum.page;
}

4.在user类中加入权限字段

在user用户类中添加文本字段表示权限, 字段长度为250字符(因为mysql默认255个字符,可以代表250个权限应该够用了), 字符内容是0或者1. 1表示有权限, 0表示无权限. 提示: 对于用户的权限配置, 只要将对应的权限位设置为0或者1即可.

1
2
3
4
5
6
create table user (
        id integer not null auto_increment,
        name varchar(255),
        right_content varchar(255),
        primary key (id)
    ) type=InnoDB

5.权限验证算法

权限判断方法, 权限判断的实现算法, 用于判断是否有权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class AuthorityHelper {
 
/**
 * 判断是否有权限
 * @param akey  aString中位置的索引值,也就是权限位
 * @param aString  权限字段,比如 11010101011101
 * @return
 */
public static boolean hasAuthority(int akey,String aString){
    return ConstanHelper.getAuthorityVaule(akey,rc);
    if(aString==null || "".equals(aString)){
        return false;
    }
 
    char value = aString.charAt(akey);
    if(value == '1'){
        return true;
    }
 
    return false;
 
}
 
}

6.建立控制权限的interceptor类

建立interceptor类, 用于过滤需要控制权限的方法.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.URLEncoder;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
 
public class AuthorityAnnotationInterceptor extends HandlerInterceptorAdapter {
 
    final Logger logger = LoggerFactory.getLogger(getClass());
 
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        logger.debug("");
        HandlerMethod handler2=(HandlerMethod) handler;
        FireAuthority fireAuthority = handler2.getMethodAnnotation(FireAuthority.class);
 
        if(null == fireAuthority){
            //没有声明权限,放行
            return true;
        }
 
        logger.debug("fireAuthority", fireAuthority.toString());
 
        HttpSession session = request.getSession();
        Worker manager = (Worker)session.getAttribute(SessionHelper.WorkerHandler);
        boolean aflag = false;
 
        for(AuthorityType at:fireAuthority.authorityTypes()){
            if(AuthorityHelper.hasAuthority(at.getIndex(), manager.getRightContent())==true){
                aflag = true;
                break;
            }
        }
 
        if(false == aflag){
 
            if (fireAuthority.resultType() == ResultTypeEnum.page) {
                //传统的登录页面              
                StringBuilder sb = new StringBuilder();
                sb.append(request.getContextPath());
                sb.append("/oprst.jsp?oprst=false&opmsg=").append(URLEncoder.encode(ControllerProperty.NOT_HAVE_AUTHORITY,"utf-8"));
                response.sendRedirect(sb.toString());
            else if (fireAuthority.resultType() == ResultTypeEnum.json) {
                //ajax类型的登录提示
                response.setCharacterEncoding("utf-8");
                response.setContentType("text/html;charset=UTF-8");
                OutputStream out = response.getOutputStream();
                PrintWriter pw = new PrintWriter(new OutputStreamWriter(out,"utf-8"));
                pw.println("{\"result\":false,\"code\":12,\"errorMessage\":\""+ControllerProperty.NOT_HAVE_AUTHORITY+"\"}");
                pw.flush();
                pw.close();
            }
 
            return false;
 
        }
        return true;
    }
 
}

7.配置interceptor类

在spring-mvc中配置interceptor, 实现过滤.

1
2
3
<mvc:interceptors>
        <bean class="interceptor.AuthorityAnnotationInterceptor"></bean>
    </mvc:interceptors>

8.标注需要控制权限的方法

在需要控制访问的spring-mvc方法上面加上对应的标注. 
//方式一

1
2
3
4
5
@FireAuthority(AuthorityType. SALES_ORDER_CREATE)
@RequestMapping(value="/save.spr", method=RequestMethod.POST)
public ModelAndView save(String  name) throws Exception {
    //some code
}

//方式二

1
2
3
4
5
@FireAuthority(authorityTypes = {AuthorityType.SALES_ORDER_DELETE,AuthorityType.SALES_ORDER_CREATE})
    @RequestMapping(value="/save.spr", method=RequestMethod.POST)
    public ModelAndView save(String  name) throws Exception {
        //some code
    }

//方式三

1
2
3
4
5
@FireAuthority(authorityTypes = AuthorityType.SALES_ORDER_DELETE, resultType=ResultTypeEnum.page)
@RequestMapping(value="/save.spr", method=RequestMethod.POST)
public ModelAndView save(String  name) throws Exception {
    //some code
}

9.完成了

分享到:
评论

相关推荐

    Java-SpringMVC-毕业设计-源代码

    【Java-SpringMVC-毕业设计-源代码】是一个典型的基于Java技术栈的Web应用程序,主要应用于餐馆点餐系统的开发。这个项目展示了如何利用SpringMVC框架构建一个完整的业务流程,包括用户界面、后端服务以及数据库交互...

    shiro+springmvc权限管理

    "Shiro+SpringMVC权限管理"是一个常见的解决方案,用于构建高效、安全的学生信息管理系统。这个系统利用了SpringMVC作为前端控制器框架,而Apache Shiro作为安全组件,实现了用户身份验证、授权和会话管理等功能。 ...

    SpringMVC+Mybatis实现权限管理

    在权限管理中,SpringMVC可以作为前端控制器,负责接收用户的请求,根据权限判断是否允许访问特定的资源。 1. **SpringMVC的角色**:在权限管理中,SpringMVC可以通过拦截器(Interceptor)实现对请求的预处理。...

    SpringMVC的Restful风格Demo

    - **认证与授权**:可以使用Spring Security或OAuth2等工具实现身份验证和权限控制。 - **版本管理**:为API添加版本号,避免不同版本之间的冲突。 - **文档化**:使用Swagger等工具自动生成API文档,便于开发者理解...

    SpringMVC+shiro权限管理

    **SpringMVC+Shiro权限管理** 在现代Web应用程序开发中,权限管理和用户认证是至关重要的组成部分。SpringMVC和Apache Shiro都是Java领域中广泛使用的框架,它们各自在不同的层面上提供了强大的功能。SpringMVC是...

    SpringMVC+Shiro权限管理.

    ### SpringMVC+Shiro权限管理系统详解 #### 权限管理概述 权限管理在软件开发中扮演着至关重要的角色,特别是在涉及多用户交互的应用场景下。通过合理的权限控制,可以确保不同用户仅能访问和操作他们被授权的功能...

    springmvc+extjs4mvc实现权限管理

    总之,"springmvc+extjs4mvc实现权限管理"项目展示了如何结合服务器端的SpringMVC和客户端的ExtJS4MVC来构建一个完整的权限管理系统,它涉及到了认证、授权、UI设计等多个关键环节,对于学习和实践企业级应用的权限...

    SpringMVC详解

    SpringMVC作为MVC设计模式的实现,它将应用逻辑分离开来,使得开发者可以独立地处理业务逻辑(Controller)、数据模型(Model)和用户界面(View)。这样有利于代码的维护和测试。 2. **DispatcherServlet** ...

    jetbrick-springmvc jar包(包含源码)

    8. **拦截器**:扩展了SpringMVC的拦截器机制,允许开发者自定义拦截逻辑,用于权限控制、日志记录等功能。 9. **工具类**:提供了一系列实用的工具类,如字符串操作、日期时间处理、JSON转换等,方便开发者进行...

    springMVC拦截器项目

    SpringMVC 拦截器项目是一个典型的 Web 应用开发示例,它利用 SpringMVC 框架中的拦截器(Interceptor)机制来实现特定的功能,如权限控制、日志记录、性能统计等。SpringMVC 是 Spring 框架的一部分,专为构建基于 ...

    权限管理系统hibernate+spring+springMVC

    《权限管理系统:Hibernate+Spring+SpringMVC整合实践》 在现代企业级应用开发中,权限管理系统是不可或缺的一部分,它负责管理和控制用户对系统资源的访问权限,确保系统的安全性和数据的完整性。本项目采用经典的...

    SpringMVC demo 完整源码实例下载

    首先,SpringMVC是Spring框架的一部分,它通过Model-View-Controller(MVC)设计模式来分离应用程序的业务逻辑、数据和用户界面。在本示例中,你将找到如何使用SpringMVC实现数据的增删改查操作。这通常涉及到与...

    基于ExtJS和SpringMVC的权限配置系统设计源码

    该系统是一款基于ExtJS和SpringMVC架构的权限配置系统,源码包含3417个文件,涵盖1825个PNG图片、1204个GIF图片、158个SCSS样式表、93个Java源代码、79个JavaScript文件、31个CSS样式表、12个XML配置文件、5个Ruby...

    springMVC框架学习备份

    学习SpringMVC不仅意味着掌握MVC设计模式,还包括理解依赖注入、AOP(面向切面编程)等Spring核心特性,这些都对提升开发者技能有着深远影响。 总之,"springMVC框架学习备份"涵盖了SpringMVC的基础理论、工作流程...

    SpringMVC框架架构介绍

    SpringMVC是一个广泛使用的Java Web开发框架,它遵循Model-View-Controller(MVC)设计模式,简化了构建可维护和高性能的企业级应用程序的复杂性。以下是SpringMVC框架的一些核心概念和流程的详细解释: 一、Spring...

    狂神说springmvc笔记.zip

    SpringMVC是Spring框架的一个模块,专为构建Web应用程序而设计。它是一个基于模型-视图-控制器(MVC)架构的轻量级Java Web框架,提供了强大的数据绑定、校验和类型转换功能,简化了Java Web开发流程。在"狂神说...

    超级详细SpringMVC学习资料

    它是模型-视图-控制器(MVC)设计模式的实现,极大地简化了Java Web开发。本资料包包含丰富的SpringMVC学习资源,提供了代码示例和详细介绍,对于深入理解和掌握SpringMVC非常有帮助。 一、SpringMVC基础 SpringMVC...

    SpringMVC demo 完整源码实例下载.zip

    此外,SpringMVC还支持视图技术,如JSP、FreeMarker或Thymeleaf等,以及RESTful风格的URL设计,使得API接口的构建更为简单。 通过这个完整的源码实例,我们可以学习到SpringMVC的整个生命周期,包括请求处理、模型...

    springmvc学习第一天

    - **架构设计**:SpringMVC遵循典型的MVC架构,而Struts2则采用了拦截器架构。 - **性能表现**:SpringMVC通常被认为在性能方面优于Struts2。 - **配置方式**:SpringMVC倾向于XML和注解结合的方式,而Struts2则依赖...

    springmvc+hibernate+easyui

    在SpringMVC中,可以通过Controller从Service获取当前用户的角色和对应的菜单权限,然后将数据传递给EasyUI的菜单组件来生成菜单。 【数据列表动态显示】 数据列表动态显示是指根据用户查询条件,从数据库中获取...

Global site tag (gtag.js) - Google Analytics