自己动手实现简单权限控制

最近接手一小型私活,用户量封顶上千,工期预期的也相对宽松,权限控制当然是必不可少。

web 权限控制,很多项目会引入 shiro/spring-security。

shiro/spring-security 继承 servlet-->filter抽象接口,运用合适的设计模式,

通过拦截客户端请求,来实现各个角色对系统资源的访问权限。

一时兴起,有了自己实现权限控制的想法,遂有此文,如果你用腻了 shiro/spring-security,不妨来和我一起完善它。

本文只做抛砖引玉之用,重点在思路,具体项目具体编程语言请自行拿捏。

Git Demo:https://git.oschina.net/LanboEx/simple-auth-demo

Shiro 中定义拦截过滤链,可以很简单实现上图中的想法,像下面这种姿势(但咱的目的是自己动手)。

  <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        ............        <!-- 过滤链定义 -->
        <property name="filterChainDefinitions">
            <value>
                <!--anno:AnonymousFilter 不需要任何权限即可访问-->
                /login.jsp* = anon
                /login.do* = anon                <!--authc:FormAuthenticationFilter 表单验证权限-->
                /pages/* = authc
                /index.jsp* = authc                <!--perms:PermissionsAuthorizationFilter 指定授权访问-->
                /role/edit/* = perms[role:edit]
                /role/save = perms[role:edit]
                /role/list = perms[role:view]            </value>
        </property>
    </bean>

想法大致和 shiro/spring-security 相同,实现 Filter 接口拦截客户端的对应请求。

比较有意思的部分,首先你得确定该 Filter 需要拦截什么的请求,服务? 静态页面 ? 交互脚本?网页样式?图片?

当然项目需要有良好的命名规范,无论是 restful 风格或传统风格。规范项目中的请求 URL 或添加特定的后缀。web.xml 配置比如像下面。

    <filter>
        <filter-name>simpleAuthFilter</filter-name>
        <filter-class>com.rambo.sad.SimpleAuthFilter</filter-class>
        <init-param>
            <param-name>defaultPage</param-name>
            <param-value>/view/login.jsp</param-value>
        </init-param>
        <init-param>
            <param-name>freeServices</param-name>
            <param-value>
                /view/login.jsp,login.do <!--登录相关-->
            </param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>simpleAuthFilter</filter-name>
        <url-pattern>*.jsp</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>simpleAuthFilter</filter-name>
        <url-pattern>*.do</url-pattern>
    </filter-mapping>

其次你需要确定该本次请求是否有访问该资源的权限,我项目中确定逻辑比较简单,毕竟千人系统。

将登录页面和登录请求做为 FreeService ,也就是暴露在系统外的资源,登录时在 Session 中放置对应登录对象 PO。

既方便系统内的相应展示,也可做为用户是否登录的凭证,比如登录服务逻辑像下面。

 @RequestMapping("/login.do")    public String login(HttpSession httpSession, UserPO userPO) {
        logger.info("login name:" + userPO.getName() + ",pwd:" + userPO.getPasswd());        //一些必要的系统前置工作.....
        httpSession.setAttribute("user", userPO);        return "success";
    }

当然也可以引入数据库设计,划分用户角色来制定详细的访问策略。

最后继承 Filter 接口拦截每次客户端请求,来决定是否能获取到对应的系统资源。

defaultPage 为权限不足时默认跳转的页面,比如 Filter doFilter方法逻辑像下面。

      doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) == request.getSession( ((session ==  || session.getAttribute("user") == ) && !"SESSIONFILTER_MSG", "LOGIN_TIMEOUT"

到此,整个设计思路已叙述清楚,只需自己实现一个 Filter 即可,骚年是不是很简单?

个人认为其中的可扩展点还很多,做通用并且好用还是有难度的,比如详细的角色访问策略,制定合理的设计模式。

时间: 2025-01-02 17:25:56

自己动手实现简单权限控制的相关文章

简单的权限控制

手上的项目涉及到权限控制,但是权限,角色,资源访问都很简单,所以就没有写特么复杂,所以将每个用户的角色直接存储到了该用户的详细信息中.所以每个用户在登录系统时,在页面加载时判断该用户中角色属性值 具体代码如下 <% Yyry yyry = (Yyry)session.getAttribute("yyry"); int yyryids=0; String juese =""; boolean flag= false; if(yyry==null){ respon

JEECG 简单实例讲解权限控制

JEECG简单实例讲解权限控制 博文地址:http://blog.itpub.net/30066956/viewspace-1868754/ 作者: 许国杰 一.业务背景 某公司要实现一个日志系统,用来了解员工的工作量饱和情况. 二.需求 1.角色分为:员工.经理两种. 2.员工每天在日志系统中填报工作总结,然后经理进行点评. 3.表单内容包含:姓名.日期.工作总结.个人笔记.日志点评. 三.业务权限描述 1. 员工可以进行日志填报.查看操作.(按钮控件权限) 2. 经理可以进行日志点评.查看操

Asp.Net MVC 权限控制(一):使用 Authorize Roles 简单实现

最近由于项目的需要对权限控制做了几个Demo,贴出来供大家拍砖! 首先创建一个 BaseController ,让所有的Controller继承自BaseController . [Authorize] public class BaseController : Controller { } 系统登录需要一个 AccountController ,继承自BaseController ,并添加匿名访问标记 AllowAnonymous. AccountController 实现系统的登录功能,并将

简单的RBAC用户角色权限控制

Java web项目中,无论项目是大是小,或多或少都会涉及到用户访问权限的控制,权限管理总体的设计思路就是,不该看的不看,不该做的不做!据我目前的了解,我所知道的几种实现访问权限控制的方式有: JQuery的zTree设计权限树: 权限框架shiro: 基于角色的访问控制RBAC: 这是我所知道的几种权限管理,如果有误或是还有其他的方法,望指正! 而今天我要说的就是基于角色的访问控制RBAC的权限管理,基于角色的访问控制(Role-Based Access Control),在RBAC中,权限与

【JEECG技术博文】简单实例讲解JEECG ONLINE表单权限控制(jeecg3 6)

简单实例讲解JEECG ONLINE表单权限控制(jeecg3.6) 原       文:http://blog.itpub.net/30066956/viewspace-1872409/ 相关博文:http://blog.itpub.net/30066956/viewspace-1868754/ 作       者: 许国杰 一.业务背景 某公司要实现一个日志系统,用来了解员工的工作量饱和情况. 二.需求 1.角色分为:员工.经理两种. 2.员工每天在日志系统中填报工作总结,然后经理进行点评.

**CodeIgniter通过hook的方式实现简单的权限控制

根据自己的实际情况,需要两个文件,一个是权限控制类,Acl,另外一个是权限配置的文件acl.php放在了config这个目录下. Acl这个类放在了application/hook/acl.php.通过application/config/config.php文件开启hook,并且配置config这个目录下的hook.php文件. 1.开启hook功能,config.php这个文件 /* |-----------------------------------------------------

权限控制框架Shiro简单介绍及配置实例

Shiro是什么 Apache Shiro是一个非常易用的Java安全框架它能提供验证.授权.加密和Session控制.Shiro非常轻量级而且API也非常易于理解可以使用Shiro完成从APP到企业级应用的所有权限控制. 宏观视图 从宏观来看Shiro架构中有3个重要概念Subjct.SecurityManager和Realms. Subject Subject实际上是正在执行的用户的抽象"用户"这里可以指自然人第三方服务代理账户或者其他. Subject被绑定在SecurityMa

译-BMC Remedy Action Request System权限控制概述

原文链接:Access control overview 说明: BMC Remedy Action Request System是BMC ITSM产品平台,简称AR 或者Remedy,可实现基于ITIL标准的整个IT管理流程的实施定制.该平台可实现多种权限级别的管理,包括人员.组.角色,以及表.字段.行级别等.本文可以用作其他对权限要求比较精细的系统参考. 为了便于理解,部分名词翻译如下: Server:服务器Form (or table):表单Field (or column):字段Acti

servlet极简单权限拦截设计处理

在java web的开发中 遇到的极其简单的权限控制,整个小项目就分为四五种用户的权限角色,因此不想考虑使用框架以及数据库建角色表,菜单表,操作表等来完成权限设计,而是采用反射,注解的简单方法完成. 核心代码 BaseServlet.java文件 package com.zk.servlet; import java.io.IOException; import java.lang.reflect.Method; import javax.servlet.ServletException; im