springboot security 权限控制 -- @PreAuthorize 的使用
1. 说明
security 鉴权方式常用的有两种配置,1、配置文件中配置;2、使用注解标注;他们都是基于 acess 表达式,如果需要自定义逻辑的鉴权认证,只需要自定义 access 表达式即可。本文只选取注解的方式,来讲解默认的 access 和自定义的 access 表达式
2.基于注解的使用
2.1 使用前提条件:
注解默认不可用,通过开启注解:在配置类中开启注解 @EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
- @Secured:专门判断用户是否具有角色,可以写在方法或类上,参数以 ROLE_ 开头
- @PreAuthorize\PostAuthorize: PreAuthorize 访问的类或方法执行前判断权限,而 PostAuthorize 在执行之后,Post 基本不用;允许与 ROLE_ 开头。
2.2 基于默认的access表达式
在登录的时候,需要将用户权限返回给security;security才能实现权限控制功能;
具体步骤:
登录时,实现 UserDetailService,重写 loadUserByUsername(String userName)方法。根据 userName 来实现自己的业务逻辑返回 UserDetails 的实现类,需要自定义 User 类实现 UserDetails,比较重要的方法是 getAuthorities(),用来返回该用户所拥有的权限
@Data
public class LoginUser implements UserDetails, Serializable {
...
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
// 根据自定义逻辑来返回用户权限,如果用户权限返回空或者和拦截路径对应权限不同,验证不通过
if (!permissions.isEmpty()) {
List<GrantedAuthority> list = new ArrayList<GrantedAuthority>();
for (String temp : permissions) {
GrantedAuthority au = new SimpleGrantedAuthority(temp);
list.add(au);
}
return list;
}
return null;
}
}
然后在需要权限控制的controller方法上,添加注解@PreAuthorize("hasAuthority('..*')");其中@PreAuthorize括号中就是access表达式。具体默认的有哪些请参考官网。
@RestController
@RequestMapping("test")
public class TestController {
@Autowired
private ISysUserService userService;
@Autowired
private PermissionService permissionService;
@PreAuthorize("hasAuthority('*.*.*')")
@RequestMapping("userList")
public ResultVo queryUserList() {
List<SysUser> list = userService.list();
List<UserVo> result = list.stream().map(item -> permissionService.getUserInfo(item)).collect(Collectors.toList());
return ResultVo.success(result);
}
}
2.3 自定义access表达式
自定义权限认证业务逻辑,然后将该方法标注到注解上
package com.nanboone.framework.security.service;
import java.util.Set;
import com.nanboone.common.utils.ServletUtils;
import com.nanboone.framework.security.domain.LoginUser;
import com.nanboone.framework.token.JwtTokenUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
/**
* AuthorityPermissionService:自定义access表达式,鉴权验证。
* 可以将自定义的access添加到配置类中:http.anyRequest.access(aps.hasPermission(xxx,xxx));
* 也可以直接使用注解@PreAuthorize:@PreAuthorize(aps.hasPermission(xxx));
*
* @Author: dangbo
* @Date: 2021/5/20 10:12
*/
@Service("aps")
public class AuthorityPermissionService {
@Autowired
JwtTokenUtils jwtTokenUtils;
public boolean hasPermission(String permissions) {
if (StringUtils.isEmpty(permissions)) {
return false;
}
// 用户信息对象
LoginUser loginUser = jwtTokenUtils.getLoginUser(ServletUtils.getRequest());
if (loginUser == null || CollectionUtils.isEmpty(loginUser.getPermissions())) {
return false;
}
Set<String> authorities = loginUser.getPermissions();
for (String permission : permissions.split(",")) {
if (StringUtils.isNotEmpty(permission) && hasPermissions(authorities, permission)) {
return true;
}
}
return false;
}
private boolean hasPermissions(Set<String> authorities, String permission) {
return authorities.contains("*.*.*") || authorities.contains(permission.trim());
}
}
@RestController
@RequestMapping("test")
public class TestController {
@Autowired
private ISysUserService userService;
@Autowired
private PermissionService permissionService;
@PreAuthorize("@aps.hasPermission('*.*.*')")
@RequestMapping("userList")
public ResultVo queryUserList() {
List<SysUser> list = userService.list();
List<UserVo> result = list.stream().map(item -> permissionService.getUserInfo(item)).collect(Collectors.toList());
return ResultVo.success(result);
}
}
springboot security 权限控制 -- @PreAuthorize 的使用的更多相关文章
- Spring Security权限控制
Spring Security官网 : https://projects.spring.io/spring-security/ Spring Security简介: Spring Security是一 ...
- 自定义Spring Security权限控制管理(实战篇)
上篇<话说Spring Security权限管理(源码)>介绍了Spring Security权限控制管理的源码及实现,然而某些情况下,它默认的实现并不能满足我们项目的实际需求,有时候需要 ...
- security权限控制
目录 前言 数据库和dimain 静态页面 配置文件 web.xml引入 service校验方法 用户名的获取 不同角色访问控制权限 jsp页面 后台 前言 spring自带角色权限控制框架 用户-角 ...
- Spring Security教程之基于表达式的权限控制(九)
目录 1.1 通过表达式控制URL权限 1.2 通过表达式控制方法权限 1.2.1 使用@PreAuthorize和@PostAuthorize进行访问控制 1.2.2 ...
- spring security 3.1 实现权限控制
spring security 3.1 实现权限控制 简单介绍:spring security 实现的权限控制,能够分别保护后台方法的管理,url连接訪问的控制,以及页面元素的权限控制等, secur ...
- Vue 动态路由的实现以及 Springsecurity 按钮级别的权限控制
思路: 动态路由实现:在导航守卫中判断用户是否有用户信息,通过调用接口,拿到后台根据用户角色生成的菜单树,格式化菜单树结构信息并递归生成层级路由表并使用Vuex保存,通过 router.addRout ...
- springboot整合security实现基于url的权限控制
权限控制基本上是任何一个web项目都要有的,为此spring为我们提供security模块来实现权限控制,网上找了很多资料,但是提供的demo代码都不能完全满足我的需求,因此自己整理了一版. 在上代码 ...
- Spring Security 动态url权限控制(三)
一.前言 本篇文章将讲述Spring Security 动态分配url权限,未登录权限控制,登录过后根据登录用户角色授予访问url权限 基本环境 spring-boot 2.1.8 mybatis-p ...
- Spring Security(17)——基于方法的权限控制
目录 1.1 intercept-methods定义方法权限控制 1.2 使用pointcut定义方法权限控制 1.3 使用注解定义方法权限控制 1.3.1 JSR-25 ...
- Spring Security(16)——基于表达式的权限控制
目录 1.1 通过表达式控制URL权限 1.2 通过表达式控制方法权限 1.2.1 使用@PreAuthorize和@PostAuthorize进行访问控制 1.2.2 ...
随机推荐
- linux 实时刷新显示当前时间
同步阿里云时间 ntpdate ntp1.aliyun.com 使用watch命令:周期性的执行一个命令,并全屏显示. watch -n 1 date 即可:每1秒刷新date命令. # 格式 wat ...
- xTestRunner
高颜值测试报告-xTestRunner pip install XTestRunner # test_unit.py import unittest from XTestRunner import H ...
- ABAP步循环
一.在界面中循环输出行数据,屏幕直接画出行数,需要计算翻页,一旦界面行数变动,则需要更改代码,所以引入步循环 二.步循环 首先在界面上画出要展示的内容 注意,在步循环中,文本的名称和输入框的名称不能相 ...
- 如何向已有的项目中添加C/C++代码?
第一步: 我们需要在src/main下面建立一个cpp目录,然后在其中写一个CMakeLists.txt文件和一个cpp文件,直接给出代码: #CMakeLists.txt文件# For more i ...
- Vue 大屏可视化 铺满全屏
https://blog.csdn.net/u011097323/article/details/106728221?utm_medium=distribute.pc_aggpage_search_r ...
- 完全免费白嫖 GPT-4 的终极方案!
原文链接:https://icloudnative.io/posts/completely-free-to-use-gpt4/ GPT-4 目前是世界上最强的多模态大模型,能力甩 GPT-3.5 好几 ...
- connect() failed (113: No route to host) while connecting to upstream
转载请注明出处: 用docker 搭建的服务,今天重启了一个容器之后,请求这个服务的接口都变成了 502, 但通过docker 查看日志,发现没有异常,端口也都是正常,在nginx的日志中看到了这段错 ...
- com.alibaba.fastjson.JSONException: create instance error
很早之前在使用FashJson进行实体类转化的时候,如果json参数是多层都是一层对应一个单独的实体类, 今天在项目中想,使用内部类是不是也可以实现,且使用内部类封装性更好.当将json串使用fast ...
- linux tcpdump 使用小结(一)
转载请注明出处: 很多情况在服务联调和定位过程中,需要在服务器上进行抓包进行问题定位.在Linux环境上使用tcpdump命令进行抓包: 1.tcpdump -s 0 -l -i any -w - p ...
- org.yaml.snakeyaml.error.YAMLException: java.nio.charset.MalformedInputException: Input length = 2
1.报错 在运行SpringBoot项目时遇到报错: 17:44:47.558 [main] ERROR org.springframework.boot.SpringApplication -- A ...