关键词:
一、授权流程
用户登录成功后会将用户信息保存在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... 查看详情