security权限管理详解(代码片段)

程序三两行 程序三两行     2023-03-23     317

关键词:

一、授权流程

用户登录成功后会将用户信息保存在Authencation对象中,Authencation接口中有一个getAuthorities()方法返回的是用户的权限

Collection<? extends GrantedAuthority> getAuthorities();

现有系统可以基于角色做权限管理也可以使用资源(权限字符串)做权限管理,这里的GrantedAuthority是角色还是资源呢?

  • 如果 业务是基于角色做的权限管理,即用户->角色->资源,那么返回的是用户的角色
  • 如果业务是基于资源(权限)做的权限管理,即用户->权限->资源,返回的是用户的权限
  • 如果基于角色+权限做的权限管理,即用户->角色->权限->资源,返回的是用户的权限

security在角色和权限的处理方式上基本一样的,唯一区别就是很多时候会自动给角色增加一个ROLE_前缀,而权限不会添加

 

二、权限管理策略

1、基于URL做权限管理(过滤器技术实现)

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter 
    //创建内存数据源
    public UserDetailsService userDetailsService()
        InMemoryUserDetailsManager inMemoryUserDetailsManager = new InMemoryUserDetailsManager();
        //admin用户 具有ADMIN 和 USER角色
        inMemoryUserDetailsManager.createUser(User.withUsername("admin").password("noop123").roles("ADMIN","USER").build());
        //user用户 具有USER角色
        inMemoryUserDetailsManager.createUser(User.withUsername("user").password("noop123").roles("USER").build());
        //info用户具有READ_INFO权限操作
        inMemoryUserDetailsManager.createUser(User.withUsername("info").password("noop123").authorities("READ_INFO").build());
        return inMemoryUserDetailsManager;
    

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception 
        auth.userDetailsService(userDetailsService());
    

    @Override
    protected void configure(HttpSecurity http) throws Exception 
        http.authorizeRequests()
                //访问/admin必须有ADMIN角色
                .mvcMatchers("/admin").hasRole("ADMIN")
                //访问/user需要USER角色或者ADMIN角色
                .mvcMatchers("/user").hasAnyRole("ADMIN","USER")
                //访问/info必须有READ_INFO权限
                .mvcMatchers("/info").hasAuthority("READ_INFO")
                .anyRequest().authenticated()
                .and().formLogin()
                .and().csrf().disable();
    

备注1:上面的hasRole()、hasAuthority()称为权限表达式,类如下

 

备注2:mvcMatchers、antMatchers、regexMatchers区别是?

1、mvcMatchers是在antMatchers之后增加的,两个都可以传递请求方式以及多个路径,如下

.mvcMatchers(HttpMethod.GET,"/admin","/test").hasRole("ADMIN")
.antMatchers(HttpMethod.GET,"/admin","/test").hasRole("ADMIN")

2、mvcMatchers相对antMatchers更加强大一些,比如mvcMatchers("/admin")可以匹配“/admin"还可以匹配"/admin/" 、"/admin/a"、"/admin.html",但是.antMatchers("/admin")只能匹配"/admin"

3、regexMatchers则是可以通过正在表达式匹配

2、基于方法策略权限管理(基于AOP技术实现)

基于方法的权限管理是基于aop技术实现的,security中通过MethodSecurityInterceptor提供相关实现,不同在于FilterSecurityInterceptor只是请求前置进行处理,而MethodSecurityInterceptor除了前置请求还可以进行后置请求,前置是在请求之前判断是否具有相应的权限,后置则是对方法的执行结果进行二次过滤,前置和后置分别对应了不同的实现类,

/**
 * EnableGlobalMethodSecurity是开启全局方法的权限注解
 * prePostEnabled开启security提供的四个权限注解,这四个注解支持上面的权限表达式
 *      @PostFilter在目标方法执行之后对方法的返回结果进行过滤
 *      @PostAuthorize在目标方法执行之后进行权限校验
 *      @PreAuthorize在目标方法执行之前进行校验
 *      @PreFilter在目标方法执行之前对参数进行过滤
 * securedEnabled开启security提供的@secured,只支持角色,不支持权限表达式
 *      @secured访问目标方法必须具备相应的角色
 * jsr250Enabled开启JSR-250提供的三个权限注解,同样只支持角色不支持权限表达式
 *      @DenyAll拒绝所有访问
 *      @PermitAll允许所有访问
 *      @RolesAllowed访问目标方法必须具备相应的角色
 *
 *这些基于方法的权限注解,一般来说只要设置prePostEnabled=true就够了
 */
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true,securedEnabled = true,jsr250Enabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter 
    //创建内存数据源
    @Bean
    public UserDetailsService userDetailsService()
        InMemoryUserDetailsManager inMemoryUserDetailsManager = new InMemoryUserDetailsManager();
        //admin用户 具有ADMIN 和 USER角色
        inMemoryUserDetailsManager.createUser(User.withUsername("admin").password("noop123").roles("ADMIN","USER").build());
        //user用户 具有USER角色
        inMemoryUserDetailsManager.createUser(User.withUsername("user").password("noop123").roles("USER").build());
        //info用户具有READ_INFO权限操作
        inMemoryUserDetailsManager.createUser(User.withUsername("info").password("noop123").authorities("READ_INFO").build());
        return inMemoryUserDetailsManager;
    

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception 
        auth.userDetailsService(userDetailsService());
    

    @Override
    protected void configure(HttpSecurity http) throws Exception 
        http.authorizeRequests()
                .anyRequest().authenticated()
                .and().formLogin()
                .and().csrf().disable();
    

 使用

@RestController
@RequestMapping("/demo")
public class DemoController 
    /**
    *可以使用权限表达式以及and or
    *除了角色还可以使用权限hasAuthority
    */
    @PreAuthorize("hasRole('ADMIN') and authentication.name=='admin'")
    @GetMapping("/user")
    public String user()
        return "user";
    
    /**
    * 传的参数如果和登录用户的账号相同才能访问
    */
    @PreAuthorize("authentication.name==#username")
    @GetMapping("/name")
    public String name(String username)
        return "name";
    
    /**
    * 请求方法前对参数过滤 参数必须是数组、集合
    */
    @PreFilter(value = "filterTarget.id%2!=0",filterTarget = "users")
    @GetMapping("/users")
    public String name(@RequestBody List<User> users)
        return "user";
    
    /**
    * 返回指定的对象
    */
    @PostAuthorize("returnObject.id==1")
    @GetMapping("/userId")
    public String userId(@RequestBody List<User> users)
        return "userId";
    
    /**
    * 过滤方法的返回值 返回值是数组或者集合
    */
    @PostFilter("filterTarget.id%2==0")
    @GetMapping("/all")
    public String all(@RequestBody List<User> users)
        return "all";
    
    
    /**
    * 只能判断角色,可以是多个 ,具有其中一个即可
    */
    @Secured("ROLE_USER,ROLE_ADMIN")
    @GetMapping("/Secured")
    public String secured(@RequestBody List<User> users)
        return "Secured";
    
    
    /**
    * 放行所有
    */
    @PermitAll
    @GetMapping("/PermitAll")
    public String permitAll(@RequestBody List<User> users)
        return "PermitAll";
    
    
    /**
    * 拒绝所有请求
    */
    @DenyAll
    @GetMapping("/denyall")
    public String denyAll()
        return "denyall";
    
    
    /**
    * 具有其中一个角色即可
    */
    @RolesAllowed("ROLE_ADMIN,ROLE_USER")
    @GetMapping("/rolseAll")
    public String rolseAll()
        return "rolseAll";
    

详解linux用户及权限管理(代码片段)

用户标识(userID):范围是0~65535管理员:0普通用户:1~65535系统用户:1~499(CentOS6)、1~999(CentOS7)登录用户:500~60000(CentOS6)、1000~60000(CentOS7)人能够快速识别字符,而电脑能够快速识别数字(用户标识),然而系统存在一个名称解析库/etc/p... 查看详情

权限管理框架shirorenren-security权限管理结构(代码片段)

权限管理框架Shiro:一直在做项目,由于是二次开发的项目,今天才发现自己连权限控制都没有搞懂。二次开发的是基于renren开源的一个项目。链接:https://gitee.com/renrenio/renren-security这个项目主要使用shiro权限管理... 查看详情

django权限系统auth模块详解(代码片段)

auth模块是Django提供的标准权限管理系统,可以提供用户身份认证,用户组和权限管理。auth可以和admin模块配合使用,快速建立网站的管理系统。在INSTALLED_APPS中添加‘django.contrib.auth‘使用该APP,auth模块默认启用。UserUser是auth模块中... 查看详情

springsecurity权限管理(代码片段)

目录一、springsecurity权限管理1、前言2、认证服务器a、pom.xmlb、bootstrap.yml和application.ymlc、启动类3、资源服务器一、springsecurity权限管理1、前言a、整体框架spring-cloud-alibaba-nacos+spring-security+jwt+redis2、认证服务器a、pom.xml<!--SpringSe... 查看详情

linux操作命令分类详解-用户权限(代码片段)

目录系列文章1、用户账号管理1.1 useradd/adduser添加用户账号1.2 userdel 删除帐号1.3 usermod修改帐号1.4passwd 用户口令的管理2用户组管理2.1groupadd增加用户组2.2groupdel删除用户组2.3groupmod修改用户组2.4newgrp切换用户组3、与用户账号有... 查看详情

[os-linux]详解linux的权限(代码片段)

 本文基于CentOS,详解介绍了Linux权限的管理,chmod,chgrp以及粘滞位。目录一、用户二、Linux权限管理1.文件访问者的分类2.文件类型和访问权限(1)文件类型3.文件权限值的表示方法4.文件访问权限的相关设置... 查看详情

[os-linux]详解linux的权限(代码片段)

 本文基于CentOS,详解介绍了Linux权限的管理,chmod,chgrp以及粘滞位。目录一、用户二、Linux权限管理1.文件访问者的分类2.文件类型和访问权限(1)文件类型3.文件权限值的表示方法4.文件访问权限的相关设置... 查看详情

vc++windows7及以上系统中管理员权限与uac虚拟化详解(附源码)(代码片段)

目录1、管理员权限2、UAC虚拟化3、将程序配置为以管理员权限启动4、判断程序有没有管理员权限5、以管理员权限启动目标程序6、开机自启动程序不能设置管理员权限    在WindowsVista之前,通常人们都是使用管理员身份运... 查看详情

linux操作命令分类详解-用户权限(代码片段)

...件3.3/etc/group用户组文件3.4实例:添加批量用户4、Linux权限4.1权限范围及代号4.2chmod 文件或目录权限修改4.3chown 更改文件拥有者4.4权限知识拓展4.4.1十位权限4.4.2十二位权限(Linux附加权限)4.4.3对比范例系列文章Linux... 查看详情

springsecurity框架详解(代码片段)

...登陆接口4.3.3.3、认证过滤器4.3.3.4、退出登陆5、授权5.1、权限的作用5.2、授权基本流程5.3、授权实现5.3.1、限制访问资源所需权限5.3.2、封装权限信息5.3.3从数据库查询权限信息5.3.3.1RBAC权限模型5.3.3.2准备工作5.3.3.3、代码实现6、... 查看详情

security权限控制(代码片段)

...web.xml引入service校验方法用户名的获取不同角色访问控制权限jsp页面后台前言spring自带角色权限控制框架用户-角色数据库和dimain数据库--用户表CREATETABLEsys_user(idintauto_incrementPRIMARYKEY,usernameVARCHAR(50),emailVARCHAR(50),PASSWOR 查看详情

security重写权限服务配置类(代码片段)

@ServicepublicclassMyUserDetailServiceimplementsUserDetailsService@AutowiredprivateUserInfoDaodao;@OverridepublicUserDetailsloadUserByUsername(Strings)throwsUsernameNotFoundExceptionUser 查看详情

visudo命令详解(代码片段)

...0个用户,而且都参与管理。如果这10个用户都涉及到超级权限的运用,做为管理员如果想让其它用户通过su来切换到超级权限的root,必须把root权限密码都告诉这10个用户;如果这10个用户都有root权限,通过root权限可以做任何事... 查看详情

轻量级权限管理系统(renren-security)

renren-security是一个轻量级权限管理系统,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。使用renren-security搭建项目,只需编写30%左右代码,其余的代码交给系统自动生成。一个月的工作量,一周就能完成,剩余的时间... 查看详情

renren-security(轻量级权限管理系统)

项目说明renren-security是一个轻量级权限管理系统,其核心设计目标是开发迅速、学习简单、轻量级、易扩展使用renren-security搭建项目,只需编写30%左右代码,其余的代码交给系统自动生成一个月的工作量,一周就能完成,剩余的... 查看详情

kubernetes-一文详解serviceaccount与rbac权限控制(代码片段)

一、ServiceAccount1.ServiceAccount介绍首先Kubernetes中账户区分为:UserAccounts(用户账户)和ServiceAccounts(服务账户)两种,它们的设计及用途如下:UserAccount是给kubernetes集群外部用户使用的,例如运维或者集群管理人员,使用kubectl命... 查看详情

sqlng-security-service的权限详细信息(代码片段)

查看详情

spring-security-oauth2注解详解(代码片段)

spring-security-oauth2支持的注解有:1.EnableOAuth2Client适用于使用springsecurity,并且想从Oauth2认证服务器来获取授权的web应用环境代码中,它启用了一个Oauth2客户端配置。为了更好的利用这个特性,需要在客户端应用中的DelegatingFilterPro... 查看详情