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

简介:

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

   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方法逻辑像下面。

复制代码
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws Exception{
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpSession session = request.getSession(false);
if ((session == null || session.getAttribute("user") == null) && !isFreeService(request.getRequestURI())) { request.setAttribute("SESSIONFILTER_MSG", "LOGIN_TIMEOUT"); request.getRequestDispatcher(defaultPage).forward(servletRequest, servletResponse);return; } filterChain.doFilter(servletRequest, servletResponse); }
复制代码

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

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


本文转自Orson博客园博客,原文链接:http://www.cnblogs.com/java-class/p/6344191.html,如需转载请自行联系原作者

相关文章
|
自然语言处理 Kubernetes 安全
从零开始入门 K8s | K8s 安全之访问控制
访问控制是云原生安全的一个重要组成部分,也是 K8s 集群在多租环境下必要且基本的安全加固手段。在 K8s 体系中,访问控制又分为三个重要的组成部分,请求认证,鉴权和运行时刻的 admission 准入控制。在本文中,作者将带领大家了解这 3 部分的基本定义和使用方法,并给出多租环境下安全加固的相关最佳实践。
从零开始入门  K8s | K8s 安全之访问控制
|
3月前
|
安全 程序员 数据安全/隐私保护
终于有篇文章把后管权限系统设计讲清楚了
【2月更文挑战第1天】在常用的后台管理系统中,通常都会有权限系统设计,以用于给对应人员分配不同权限,控制其对后管系统中的某些菜单、按钮以及列表数据的可见性。
82 2
终于有篇文章把后管权限系统设计讲清楚了
|
9月前
|
存储 Linux 数据安全/隐私保护
【Linux取经路】权限管理——还在因为没有权限而头疼?手把手教你修改权限(一)
【Linux取经路】权限管理——还在因为没有权限而头疼?手把手教你修改权限(一)
126 0
|
9月前
|
Linux 数据安全/隐私保护
【Linux取经路】权限管理——还在因为没有权限而头疼?手把手教你修改权限(二)
【Linux取经路】权限管理——还在因为没有权限而头疼?手把手教你修改权限(二)
107 0
|
10月前
|
Kubernetes 数据安全/隐私保护 容器
【k8s 系列】k8s 学习二十八,k8s 认证和权限控制
说到 k8s 的认证机制,其实之前咋那么也有提到过 ServiceAccouont ,以及相应的 token ,证书 crt,和基于 HTTP 的认证等等
191 0
|
SQL 消息中间件 JavaScript
权限系统中的数据权限就该这么设计,yyds!
权限系统中的数据权限就该这么设计,yyds!
|
监控 安全 前端开发
权限系统就该这么设计,yyds
权限系统就该这么设计,yyds
|
SQL 负载均衡 NoSQL
从零开始搭建博客01----框架搭建,权限控制
二期90天进阶训练营的课程课后作业,搭建一个blog
110 0
从零开始搭建博客01----框架搭建,权限控制
|
存储 前端开发 JavaScript
前后端分离如何做权限控制设计?
近几年随着react、angular、vue等前端框架兴起,前后端分离的架构迅速流行。但同时权限控制也带来了问题。 网上很多前、后端分离权限仅仅都仅仅在描述前端权限控制、且是较简单、固定的角色场景,满足不了我们用户、角色都是动态的场景。 且仅仅前端进行权限控制并不是真正意义的权限控制,它只是减少页面结构暴露、增强用户体验的功效。
前后端分离如何做权限控制设计?
|
缓存 JavaScript 前端开发
手把手教你怎么实现一个后台管理系统——菜单权限篇(一)
手把手教你怎么实现一个后台管理系统——菜单权限篇(一)
手把手教你怎么实现一个后台管理系统——菜单权限篇(一)