• Spring Security(8)


    您好,我是湘王,这是我的CSDN博客,欢迎您来,欢迎您再来~

    之前虽然实现了角色和权限之间的简单配对,但是如果每一个角色都要重新来过一次,就有点呆板了。如果能够配置一个「角色模板」,再通过这个模板来配置其他角色,岂不是更简单?Spring Security虽然没有角色模板,但可以通过「继承」的方式来「曲线就国」。

    而且有时候角色与用户并不是完全一一对应的。比如,admin接口只有ROLE_ADMIN角色拥有,manager接口只有ROLE_MANAGER角色拥有。但其实admin是应该拥有manager的权限的。所以来看看怎么个「应该」法。

    首先,在sys_suer表中增加employee用户:

    INSERT INTO sys_user VALUES (3, 'employee', '123456', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP);

    然后在sys_role表中增加ROLE_EMPLOYEE角色:

    INSERT INTO sys_role VALUES (3, 'ROLE_EMPLOYEE', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP);

    再在sys_permission权限表中增加角色权限:

    1. INSERT INTO sys_permission VALUES (5,3,'/employee','read',CURRENT_TIMESTAMP,CURRENT_TIMESTAMP);
    2. INSERT INTO sys_permission VALUES (6,3,'/employee','remove',CURRENT_TIMESTAMP,CURRENT_TIMESTAMP);

    修改LoginController,增加employee接口:

    1. @GetMapping("/admin")
    2. @PreAuthorize("hasRole('ROLE_ADMIN')")
    3. public String admin() {
    4. return "admin有ROLE_ADMIN角色";
    5. }
    6. @GetMapping("/manager")
    7. @PreAuthorize("hasRole('ROLE_MANAGER')")
    8. public String manager() {
    9. return "manager有ROLE_MANAGER角色";
    10. }
    11. @GetMapping("/employee")
    12. @PreAuthorize("hasRole('ROLE_EMPLOYEE')")
    13. public String employee() {
    14. return "employee有ROLE_EMPLOYEE角色";
    15. }

    然后在WebSecurityConfiguration中引入Spring Security的RoleHierarchy角色继承类:

    1. // 角色继承
    2. @Bean
    3. public RoleHierarchy roleHierarchy() {
    4. RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();
    5. // 多个角色用【>】表示,【>】左边角色的权限要大于右边角色的权限
    6. String hierarchy = "ROLE_ADMIN > ROLE_MANAGER " + System.lineSeparator() +
    7. " ROLE_MANAGER > ROLE_EMPLOYEE";
    8. // 也可以写成 "ROLE_ADMIN > ROLE_MANAGER > ROLE_EMPLOYEE";
    9. roleHierarchy.setHierarchy(hierarchy);
    10. return roleHierarchy;
    11. }

    通过Postman测试用户各自拥有的角色:

    1、admin { ROLE_ADMIN, ROLE_MANAGER, ROLE_EMPLOYEE }

    2、manager { ROLE_MANAGER, ROLE_EMPLOYEE }

    3、employee { ROLE_EMPLOYEE }

    可以看出来,Spring Security有几个特点:

    1、角色可以被继承,但权限并不能“跟随”角色一起被继承

    2、admin只能访问/admin/create和/admin/read这两个接口

    3、manager也只能访问/manager/create和/manager/remove这两个接口

    4、admin虽然继承了user的角色ROLE_MANAGER,但并没有显示地获得ROLE_MANAGER对应的权限,因为加入权限后,角色继承就会失效

     

    因为权限无法跟随角色被继承,所以需要手动去完善权限。为了让admin也能访问manager的接口,要赋予角色更多的权限。现在把manager和employee的权限都赋予admin

    1. INSERT INTO sys_permission VALUES (7,1,'/manager','create',CURRENT_TIMESTAMP,CURRENT_TIMESTAMP);
    2. INSERT INTO sys_permission VALUES (8,1,'/manager','remove',CURRENT_TIMESTAMP,CURRENT_TIMESTAMP);
    3. INSERT INTO sys_permission VALUES (9,1,'/employee','read',CURRENT_TIMESTAMP,CURRENT_TIMESTAMP);
    4. INSERT INTO sys_permission VALUES (10,1,'/employee','remove',CURRENT_TIMESTAMP,CURRENT_TIMESTAMP);

    然后在LoginController里再增加employee的权限:

    1. @GetMapping("/employee/read")
    2. @PreAuthorize("hasPermission('/employee', 'read')")
    3. public String employeeRead() {
    4. return "employee有ROLE_EMPLOYEE角色的read权限";
    5. }
    6. @GetMapping("/employee/remove")
    7. @PreAuthorize("hasPermission('/employee', 'remove')")
    8. public String employeeRemove() {
    9. return "employee有ROLE_EMPLOYEE角色的remove权限";
    10. }

    通过admin登录,分别访问如下接口:

     

    可以看到,admin已经有之前manager和employee的权限了。

    Spring Security虽然比较简单,也很方便,多适用于一些比较小型的应用系统,角色简单,权限不多。如果要实现一些比较复杂的权限功能,Spring Security就会有点力不从心了,而且会出现诸如自定义filter被执行多次的问题。所以,一般在大型或企业级应用中,都不会,至少不会完全依赖Spring Security,而是依据实际业务需求,实现自定义的权限系统。


    感谢您的大驾光临!咨询技术、产品、运营和管理相关问题,请关注后留言。欢迎骚扰,不胜荣幸~

  • 相关阅读:
    Apollo planning之hybrid A*
    深度学习03-卷积神经网络(CNN)
    opencv python debug记录
    Python基础:错误和异常
    《A Simple Baseline for BEV Perception Without LiDAR》论文笔记
    JavaScript的懒加载处理
    颗粒归仓水稻总体产量5500吨 国稻种芯-洪江:怀化水稻秋收
    VB:二分法查找
    【计算机毕业设计】32.学生宿舍管理系统源码
    (25)Verilog实现三态门(inout)
  • 原文地址:https://blog.csdn.net/lostrex/article/details/128138954