干货——Spring-Security-Mybatis-Demo

本贴最后更新于 2160 天前,其中的信息可能已经事过景迁

SpringBoot 下结合 Mybatis,实现 SpringSecurity 的权限认证 Demo,与传统 RBAC 不同之处在于:这里我们省略了 A 这个环节。同时又有别于其他的 SpringSecurity 项目,区别在于:同时考虑了企业用户和个人用户,企业用户可以分配子账户,并对子账户设置不同的角色,每个角色可执行的权限范围由注解来进行限制,同时,企业用户及其子账户通过邮箱进行登录,而个人账户则通过手机号码进行登录。

前言

按照惯例,先上项目源代码:

Github: spring-security-mybatis-demo

项目 ER 图如下所示:

er.jpg

看完 ER 图,相信各位应该能清楚一件事情:

跟传统的 RBAC 相比,这里没有 A(Access)。

我们只对用户进行角色的区分,具体哪一个角色具备哪些权限,由注解来决定,如:

@PreAuthorize("hasRole('ROLE')")

运行

首先,请给项目 Demo 一颗 Star ^-^ (不然会有人在后面画圈圈诅咒你)

这个项目对用户做了区分:个人用户和企业版用户。

个人用户

授权路径: auth/personal

授权刷新路径:refresh/personal

授权登录名:User 表下的手机号码

个人用户授权

个人用户使用手机号码及密码在 auth/personal 下获取他们的授权 token:

personal_login.jpg

授权成功后,个人用户只会有一个角色,就是:PERSONAL。

这意味着其他角色的 API 该个人用户将无法访问。(报 401 错误,当然,您可以自行修改错误代码,比如返回登录页面)

同时也意味着,每一个用户,可以拥有多个角色,这将有助于我们对角色等级的划分进行区分。

比如,最高等级的 BOSS 用户,也将同时是一个 MANAGER 用户,同时也是一个 EMPLOYEE 用户。

这样设计的好处在于,我们在进行权限判断的时候,只需考虑最低等级的权限,高权限的用户直接可以调用。

个人用户认证

个人用户获取他们的 Token 之后,在使用中,只需要向请求 Header 中,添加一个"Authorization",其值应该设置为:"Bearer " + ${token},请注意这里有一个空格的存在。

personal_coming.jpg

企业版用户

企业用户使用邮箱及密码在 auth/Company 下获取他们的授权 token:

对于企业用户而言,默认的 SQL 对角色设置了三个:BOSS、MANAGER、EMPLOYEE,对于离职员工而言,只需要在 User 表下的 isenabled 中设置为 0 即可。

当然,您也可以自行进行角色的扩展,数量不受限制。

企业用户授权

这里以 BOSS 角色的帐号进行授权演示:

get_boss_token.jpg

如果您是一名 Manager 用户,那么获取 Token 的过程就会是:

manager_login.jpg

企业用户认证

企业用户获取他们的 Token 之后,在使用中,只需要向请求 Header 中,添加一个"Authorization",其值应该设置为:"Bearer " + ${token},请注意这里有一个空格的存在。

这一点与个人用户的登录是一致的。

接下来的使用就比较简单了:

  • BOSS 用户调用他的专属 API:

    boss_coming.jpg

  • 经理调用他的专属 API:(当然,BOSS 也是可以调用的,因为在 User_role 表中,请注意看,我们的 BOSS 用户拥有其他所有角色的 roleID)

    manager_login.jpg

  • 经理想调用 BOSS 的专属 API:

    manager_want_boss_greeting.jpg

  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    944 引用 • 1459 回帖 • 16 关注
  • MyBatis

    MyBatis 本是 Apache 软件基金会 的一个开源项目 iBatis,2010 年这个项目由 Apache 软件基金会迁移到了 google code,并且改名为 MyBatis ,2013 年 11 月再次迁移到了 GitHub。

    170 引用 • 414 回帖 • 384 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • illn

    如果说我指定某个目录比如 manager 下的所有才需要登陆验证,其他不需要该如何设置呢?

    http  
            .csrf().disable()  
            .authorizeRequests()  
            .antMatchers("/", "/api/**","/images/**").permitAll()  
            .anyRequest().authenticated()  
            .and()  
            .formLogin()  
            .loginPage("/login")  
            .defaultSuccessUrl("/manager/")  
            .permitAll()  
            .and()  
            .headers().frameOptions().disable()  
            .and()  
            .logout()  
            .logoutUrl("/logout")  
            .logoutSuccessUrl("/")  
            .permitAll();
    
  • 其他回帖
  • liumapp
    作者

    另外,简书等各个平台都有人在抄我的文章,我已经懒的管了,但是我从来没有抄袭过任何人的东西。

  • liumapp
    作者

    确实如此,所以实际项目使用过程中,还是以传统的 RBAC 为主

  • Eddie

    这样设计,如果要突然给某人赋予某个单一的权限或功能访问,好像有点问题。这种情况还是很多的。不过这个是 DEMO 也没有啥问题啦。

    1 回复
  • 查看全部回帖