• SpringSecurity设置角色和权限的注意点


    概念

    在UserDetailsService的loadUserByUsername方法里去构建当前登陆的用户时,你可以选择两种授权方法,即角色授权和权限授权,对应使用的代码是hasRole和hasAuthority,而这两种方式在设置时也有不同,下面介绍一下:

    1. 角色授权:授权代码需要加ROLE_前缀,controller上使用时不要加前缀
    2. 权限授权:设置和使用时,名称保持一至即可

    使用,mock代码

    @Component
    public class MyUserDetailService implements UserDetailsService {
      @Autowired
      private PasswordEncoder passwordEncoder;
    
      @Override
      public UserDetails loadUserByUsername(String name) throws UsernameNotFoundException {
        User user = new User(name,
            passwordEncoder.encode("123456"),
            AuthorityUtils.commaSeparatedStringToAuthorityList("read,ROLE_USER"));//设置权限和角色
        // 1. commaSeparatedStringToAuthorityList放入角色时需要加前缀ROLE_,而在controller使用时不需要加ROLE_前缀
        // 2. 放入的是权限时,不能加ROLE_前缀,hasAuthority与放入的权限名称对应即可
        return user;
      }
    }
    

    上面使用了两种授权方法,大家可以参考。

    在controller中为方法添加权限控制

     @GetMapping("/write")
      @PreAuthorize("hasAuthority('write')")
      public String getWrite() {
        return "have a write authority";
      }
    
      @GetMapping("/read")
      @PreAuthorize("hasAuthority('read')")
      public String readDate() {
        return "have a read authority";
      }
    
      @GetMapping("/read-or-write")
      @PreAuthorize("hasAnyAuthority('read','write')")
      public String readWriteDate() {
        return "have a read or write authority";
      }
    
      @GetMapping("/admin-role")
      @PreAuthorize("hasRole('admin')")
      public String readAdmin() {
        return "have a admin role";
      }
    
      @GetMapping("/user-role")
      @PreAuthorize("hasRole('USER')")
      public String readUser() {
        return "have a user role";
      }
    

    网上很多关于hasRole和hasAuthority的文章,很多都说二者没有区别,但大叔认识,这是spring设计者的考虑,两种性质完成独立的东西,不存在任何关系,一个是用做角色控制,一个是操作权限的控制,二者也并不矛盾。

  • 相关阅读:
    paip.验证码识别使用字符集的选取
    paip.提升用户体验业务SQL注入漏洞的分析与解决
    人人网验证码识别
    paip.路由器拨号上网密码找回.txt
    PAIP.ASP技术手册
    PAIP.java程序调试的注意点及流程总结
    paip.XXListener is already configured监听器已经被配置的解决
    paip.目录文件列表排序算法
    paip.C#.net TIMER不起作用在用户控件中
    paip.按键精灵调用其它程序及DLL以及EXE命令行的方法
  • 原文地址:https://www.cnblogs.com/lori/p/10396302.html
Copyright © 2020-2023  润新知